From a8c22c65dba4008a7b04fcd8681132cf6f003b00 Mon Sep 17 00:00:00 2001 From: fr4nz Date: Sat, 15 Nov 2025 17:44:12 +0100 Subject: [PATCH] Repo Created --- Android.mk | 41 + LICENSE | 177 + LICENSES/Apache-2.0.txt | 208 + LICENSES/CC-BY-4.0.txt | 324 + LICENSES/CC0-1.0.txt | 121 + README.md | 32 +- TRANSLATION.md | 11 + artwork/ic_gamepad.svg | 291 + artwork/ic_microg_settings.svg | 275 + artwork/ic_recaptcha.svg | 91 + artwork/styles/README.md | 73 + artwork/styles/fonts/OpenSans Regular.ttf | Bin 0 -> 130836 bytes artwork/styles/fonts/Roboto Bold.ttf | Bin 0 -> 167336 bytes artwork/styles/fonts/Roboto Medium.ttf | Bin 0 -> 168644 bytes artwork/styles/fonts/Roboto Regular.ttf | Bin 0 -> 168260 bytes artwork/styles/fonts/combinations.json | 1 + artwork/styles/sprite_sources/capital.svg | 1 + artwork/styles/sprite_sources/city.svg | 1 + artwork/styles/sprite_sources/poi_generic.svg | 1 + .../sprite_sources/poi_generic_blue.svg | 1 + .../sprite_sources/poi_generic_green.svg | 1 + .../sprite_sources/poi_generic_orange.svg | 1 + .../sprite_sources/poi_generic_purple.svg | 1 + .../styles/sprite_sources/poi_generic_red.svg | 1 + .../sprite_sources/poi_generic_teal.svg | 1 + artwork/styles/sprite_sources/poi_grocery.svg | 1 + artwork/styles/sprite_sources/poi_lodging.svg | 1 + artwork/styles/sprite_sources/poi_museum.svg | 1 + artwork/styles/sprite_sources/poi_res.svg | 1 + .../styles/sprite_sources/poi_restaurant.svg | 1 + artwork/styles/sprite_sources/poi_theatre.svg | 1 + .../sprite_sources/shield_de-motorway_2.svg | 1 + .../sprite_sources/shield_de-motorway_3.svg | 1 + .../shield_rectangle-blue_2.svg | 1 + .../shield_rectangle-blue_3.svg | 1 + .../shield_rectangle-blue_4.svg | 1 + .../shield_rectangle-blue_5.svg | 1 + .../shield_rectangle-blue_6.svg | 1 + .../shield_rectangle-green_2.svg | 1 + .../shield_rectangle-green_3.svg | 1 + .../shield_rectangle-green_4.svg | 1 + .../sprite_sources/shield_rectangle-red_2.svg | 1 + .../sprite_sources/shield_rectangle-red_3.svg | 1 + .../shield_rectangle-white_2.svg | 1 + .../shield_rectangle-white_3.svg | 1 + .../shield_rectangle-white_4.svg | 1 + .../shield_rectangle-white_5.svg | 1 + .../shield_rectangle-white_6.svg | 1 + .../shield_rectangle-yellow_2.svg | 1 + .../shield_rectangle-yellow_3.svg | 1 + .../sprite_sources/shield_us-interstate_2.svg | 1 + .../sprite_sources/shield_us-interstate_3.svg | 1 + .../sprite_sources/shield_us-interstate_4.svg | 1 + artwork/styles/style-mapbox-outdoors-v12.json | 13845 ++++++++++++++++ .../styles/style-microg-normal-mapbox.json | 4392 +++++ .../style-microg-normal-openmaptiles.json | 4565 +++++ .../styles/style-microg-normal-stadia.json | 4735 ++++++ .../styles/style-microg-satellite-mapbox.json | 3489 ++++ .../styles/style-microg-satellite-stadia.json | 3632 ++++ artwork/styles/style-stadia-outdoors.json | 5912 +++++++ build.gradle | 125 + fake-signature/build.gradle | 38 + fake-signature/src/huawei/AndroidManifest.xml | 43 + .../signature/diff/ISignatureService.aidl | 14 + .../diff/AppListDatabaseOpenHelper.java | 75 + .../huawei/signature/diff/InitProvider.java | 72 + .../huawei/signature/diff/InitReceiver.java | 29 + .../signature/diff/SignatureService.java | 106 + fake-signature/src/main/AndroidManifest.xml | 1159 ++ fake-signature/src/main/res/values/arrays.xml | 39 + .../src/main/res/values/signature.xml | 14 + firebase-auth/build.gradle | 33 + firebase-auth/core/build.gradle | 50 + .../core/src/main/AndroidManifest.xml | 28 + .../core/src/main/assets/recaptcha.html | 54 + .../gms/firebase/auth/FirebaseAuthService.kt | 663 + .../firebase/auth/IdentityToolkitClient.kt | 155 + .../gms/firebase/auth/ReCaptchaActivity.kt | 104 + .../firebase/auth/ReCaptchaOverlayService.kt | 173 + .../microg/gms/firebase/auth/extensions.kt | 11 + .../main/res/layout/activity_recaptcha.xml | 19 + firebase-auth/src/main/AndroidManifest.xml | 7 + .../firebase/auth/ActionCodeSettings.aidl | 3 + .../firebase/auth/EmailAuthCredential.aidl | 3 + .../firebase/auth/PhoneAuthCredential.aidl | 3 + .../auth/UserProfileChangeRequest.aidl | 3 + .../internal/ApplyActionCodeAidlRequest.aidl | 3 + .../api/internal/ChangeEmailAidlRequest.aidl | 3 + .../internal/ChangePasswordAidlRequest.aidl | 3 + .../internal/CheckActionCodeAidlRequest.aidl | 3 + .../ConfirmPasswordResetAidlRequest.aidl | 3 + .../api/internal/CreateAuthUriResponse.aidl | 3 + ...teUserWithEmailAndPasswordAidlRequest.aidl | 3 + .../auth/api/internal/DeleteAidlRequest.aidl | 3 + .../FinalizeMfaEnrollmentAidlRequest.aidl | 3 + .../FinalizeMfaSignInAidlRequest.aidl | 3 + .../internal/GetAccessTokenAidlRequest.aidl | 3 + .../auth/api/internal/GetAccountInfoUser.aidl | 3 + .../GetProvidersForEmailAidlRequest.aidl | 3 + .../auth/api/internal/GetTokenResponse.aidl | 3 + .../api/internal/IFirebaseAuthCallbacks.aidl | 22 + .../api/internal/IFirebaseAuthService.aidl | 108 + .../LinkEmailAuthCredentialAidlRequest.aidl | 3 + .../LinkFederatedCredentialAidlRequest.aidl | 3 + .../LinkPhoneAuthCredentialAidlRequest.aidl | 3 + .../auth/api/internal/ReloadAidlRequest.aidl | 3 + .../api/internal/ResetPasswordResponse.aidl | 3 + ...ilVerificationWithSettingsAidlRequest.aidl | 3 + ...etOobConfirmationCodeEmailAidlRequest.aidl | 3 + .../SendVerificationCodeAidlRequest.aidl | 3 + .../internal/SendVerificationCodeRequest.aidl | 3 + .../SetFirebaseUiVersionAidlRequest.aidl | 3 + .../SignInAnonymouslyAidlRequest.aidl | 3 + .../SignInWithCredentialAidlRequest.aidl | 3 + .../SignInWithCustomTokenAidlRequest.aidl | 3 + ...SignInWithEmailAndPasswordAidlRequest.aidl | 3 + .../SignInWithEmailLinkAidlRequest.aidl | 3 + .../SignInWithPhoneNumberAidlRequest.aidl | 3 + ...rtMfaPhoneNumberEnrollmentAidlRequest.aidl | 3 + .../StartMfaPhoneNumberSignInAidlRequest.aidl | 3 + .../auth/api/internal/StringList.aidl | 3 + .../api/internal/UnenrollMfaAidlRequest.aidl | 3 + .../UnlinkEmailCredentialAidlRequest.aidl | 3 + .../UnlinkFederatedCredentialAidlRequest.aidl | 3 + .../internal/UpdateProfileAidlRequest.aidl | 3 + .../api/internal/VerifyAssertionRequest.aidl | 3 + .../VerifyBeforeUpdateEmailAidlRequest.aidl | 3 + .../firebase/auth/ActionCodeSettings.java | 182 + .../google/firebase/auth/AuthCredential.java | 28 + .../firebase/auth/DefaultOAuthCredential.java | 66 + .../firebase/auth/EmailAuthCredential.java | 54 + .../google/firebase/auth/OAuthCredential.java | 32 + .../firebase/auth/PhoneAuthCredential.java | 64 + .../auth/UserProfileChangeRequest.java | 88 + .../internal/ApplyActionCodeAidlRequest.java | 12 + .../api/internal/ChangeEmailAidlRequest.java | 12 + .../internal/ChangePasswordAidlRequest.java | 12 + .../internal/CheckActionCodeAidlRequest.java | 12 + .../ConfirmPasswordResetAidlRequest.java | 12 + .../api/internal/CreateAuthUriResponse.java | 27 + ...teUserWithEmailAndPasswordAidlRequest.java | 19 + .../auth/api/internal/DeleteAidlRequest.java | 12 + .../FinalizeMfaEnrollmentAidlRequest.java | 12 + .../FinalizeMfaSignInAidlRequest.java | 12 + .../internal/GetAccessTokenAidlRequest.java | 15 + .../auth/api/internal/GetAccountInfoUser.java | 43 + .../GetProvidersForEmailAidlRequest.java | 16 + .../auth/api/internal/GetTokenResponse.java | 44 + .../LinkEmailAuthCredentialAidlRequest.java | 18 + .../LinkFederatedCredentialAidlRequest.java | 12 + .../LinkPhoneAuthCredentialAidlRequest.java | 12 + .../firebase/auth/api/internal/MfaInfo.java | 14 + .../auth/api/internal/ProviderUserInfo.java | 27 + .../api/internal/ProviderUserInfoList.java | 19 + .../auth/api/internal/ReloadAidlRequest.java | 14 + .../api/internal/ResetPasswordResponse.java | 20 + ...ilVerificationWithSettingsAidlRequest.java | 18 + ...etOobConfirmationCodeEmailAidlRequest.java | 20 + .../SendVerificationCodeAidlRequest.java | 14 + .../internal/SendVerificationCodeRequest.java | 25 + .../SetFirebaseUiVersionAidlRequest.java | 12 + .../SignInAnonymouslyAidlRequest.java | 14 + .../SignInWithCredentialAidlRequest.java | 36 + .../SignInWithCustomTokenAidlRequest.java | 17 + ...SignInWithEmailAndPasswordAidlRequest.java | 18 + .../SignInWithEmailLinkAidlRequest.java | 12 + .../SignInWithPhoneNumberAidlRequest.java | 19 + ...rtMfaPhoneNumberEnrollmentAidlRequest.java | 12 + .../StartMfaPhoneNumberSignInAidlRequest.java | 12 + .../auth/api/internal/StringList.java | 19 + .../api/internal/UnenrollMfaAidlRequest.java | 12 + .../UnlinkEmailCredentialAidlRequest.java | 12 + .../UnlinkFederatedCredentialAidlRequest.java | 12 + .../internal/UpdateProfileAidlRequest.java | 18 + .../api/internal/VerifyAssertionRequest.java | 59 + .../VerifyBeforeUpdateEmailAidlRequest.java | 12 + .../microg/gms/firebase/auth/Constants.java | 11 + firebase-dynamic-links/build.gradle | 51 + .../src/main/AndroidManifest.xml | 18 + .../internal/DynamicLinkData.aidl | 10 + .../internal/IDynamicLinksCallbacks.aidl | 17 + .../internal/IDynamicLinksService.aidl | 16 + .../internal/ShortDynamicLinkImpl.aidl | 10 + .../dynamiclinks/internal/WarningImpl.aidl | 10 + .../dynamiclinks/ShortDynamicLink.java | 72 + .../internal/DynamicLinkData.java | 69 + .../internal/ShortDynamicLinkImpl.java | 43 + .../dynamiclinks/internal/WarningImpl.java | 40 + gradle.properties | 4 + gradle/publish-android.gradle | 64 + gradle/publish-java.gradle | 76 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 10 + gradlew | 252 + gradlew.bat | 94 + play-services-ads-base/build.gradle | 38 + .../src/main/AndroidManifest.xml | 7 + play-services-ads-identifier/build.gradle | 38 + .../core/build.gradle | 42 + .../core/src/main/AndroidManifest.xml | 16 + .../ads/identifier/AdvertisingIdService.kt | 139 + .../core/src/main/res/values-ar/strings.xml | 7 + .../core/src/main/res/values-ast/strings.xml | 7 + .../core/src/main/res/values-az/strings.xml | 7 + .../core/src/main/res/values-be/strings.xml | 7 + .../core/src/main/res/values-cs/strings.xml | 7 + .../core/src/main/res/values-de/strings.xml | 7 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 7 + .../core/src/main/res/values-fa/strings.xml | 7 + .../core/src/main/res/values-fi/strings.xml | 7 + .../core/src/main/res/values-fil/strings.xml | 7 + .../core/src/main/res/values-fr/strings.xml | 7 + .../core/src/main/res/values-ga/strings.xml | 7 + .../core/src/main/res/values-in/strings.xml | 7 + .../core/src/main/res/values-is/strings.xml | 2 + .../core/src/main/res/values-it/strings.xml | 7 + .../core/src/main/res/values-ja/strings.xml | 7 + .../core/src/main/res/values-ko/strings.xml | 7 + .../core/src/main/res/values-lv/strings.xml | 7 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 7 + .../src/main/res/values-nb-rNO/strings.xml | 7 + .../core/src/main/res/values-nl/strings.xml | 7 + .../core/src/main/res/values-pl/strings.xml | 7 + .../src/main/res/values-pt-rBR/strings.xml | 7 + .../core/src/main/res/values-pt/strings.xml | 7 + .../core/src/main/res/values-ro/strings.xml | 7 + .../core/src/main/res/values-ru/strings.xml | 7 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 7 + .../core/src/main/res/values-sv/strings.xml | 7 + .../core/src/main/res/values-ta/strings.xml | 7 + .../core/src/main/res/values-th/strings.xml | 7 + .../core/src/main/res/values-tr/strings.xml | 7 + .../core/src/main/res/values-ug/strings.xml | 7 + .../core/src/main/res/values-uk/strings.xml | 7 + .../core/src/main/res/values-vi/strings.xml | 7 + .../src/main/res/values-zh-rCN/strings.xml | 7 + .../src/main/res/values-zh-rTW/strings.xml | 7 + .../core/src/main/res/values/strings.xml | 11 + .../src/main/AndroidManifest.xml | 7 + .../internal/IAdvertisingIdService.aidl | 17 + .../ads/identifier/AdvertisingIdClient.java | 80 + .../gms/ads/identifier/package-info.java | 11 + play-services-ads-lite/build.gradle | 42 + play-services-ads-lite/core/build.gradle | 38 + .../core/src/main/AndroidManifest.xml | 7 + .../gms/ads/AdLoaderBuilderCreatorImpl.kt | 26 + .../android/gms/ads/AdManagerCreatorImpl.kt | 17 + .../ads/MobileAdsSettingManagerCreatorImpl.kt | 29 + .../measurement/DynamiteMeasurementManager.kt | 24 + .../rewarded/ChimeraRewardedAdCreatorImpl.kt | 26 + .../gms/ads/MobileAdsSettingManagerImpl.kt | 110 + .../gms/ads/rewarded/ResponseInfoImpl.kt | 40 + .../microg/gms/ads/rewarded/RewardedAdImpl.kt | 108 + .../src/main/AndroidManifest.xml | 26 + .../android/gms/ads/AdManagerCreator.aidl | 4 + .../gms/ads/internal/AdErrorParcel.aidl | 3 + .../gms/ads/internal/AdRequestParcel.aidl | 3 + .../internal/AdapterResponseInfoParcel.aidl | 3 + .../gms/ads/internal/AdapterStatusParcel.aidl | 3 + .../internal/RequestConfigurationParcel.aidl | 3 + .../ServerSideVerificationOptionsParcel.aidl | 3 + .../client/IAdLoaderBuilderCreator.aidl | 8 + .../client/IMobileAdsSettingManager.aidl | 29 + .../IMobileAdsSettingManagerCreator.aidl | 7 + .../client/IOnAdInspectorClosedListener.aidl | 7 + .../client/IOnAdMetadataChangedListener.aidl | 6 + .../internal/client/IOnPaidEventListener.aidl | 6 + .../ads/internal/client/IResponseInfo.aidl | 11 + .../IInitializationCallback.aidl | 7 + .../mediation/client/IAdapterCreator.aidl | 5 + .../internal/rewarded/client/IRewardItem.aidl | 4 + .../internal/rewarded/client/IRewardedAd.aidl | 30 + .../rewarded/client/IRewardedAdCallback.aidl | 4 + .../rewarded/client/IRewardedAdCreator.aidl | 8 + .../client/IRewardedAdLoadCallback.aidl | 9 + .../client/IRewardedAdSkuListener.aidl | 6 + .../ads/measurement/IAppMeasurementProxy.aidl | 5 + .../ads/measurement/IMeasurementManager.aidl | 8 + .../gms/ads/admanager/package-info.java | 11 + .../android/gms/ads/h5/package-info.java | 11 + .../gms/ads/initialization/package-info.java | 11 + .../gms/ads/internal/AdDataParcel.java | 12 + .../gms/ads/internal/AdErrorParcel.java | 23 + .../gms/ads/internal/AdRequestParcel.java | 62 + .../internal/AdapterResponseInfoParcel.java | 30 + .../gms/ads/internal/AdapterStatusParcel.java | 30 + .../internal/RequestConfigurationParcel.java | 12 + .../ads/internal/SearchAdRequestParcel.java | 14 + .../ServerSideVerificationOptionsParcel.java | 16 + .../gms/ads/interstitial/package-info.java | 11 + .../mediation/customevent/package-info.java | 11 + .../gms/ads/mediation/package-info.java | 11 + .../gms/ads/mediation/rtb/package-info.java | 11 + .../gms/ads/nativead/package-info.java | 12 + .../google/android/gms/ads/package-info.java | 11 + .../gms/ads/rewarded/package-info.java | 11 + .../rewardedinterstitial/package-info.java | 11 + .../android/gms/ads/search/package-info.java | 11 + play-services-ads/build.gradle | 46 + play-services-ads/core/build.gradle | 40 + .../core/src/main/AndroidManifest.xml | 15 + .../gms/ads/dynamite/ModuleDescriptor.java | 74 + .../org/microg/gms/ads/AdRequestService.kt | 68 + .../src/main/AndroidManifest.xml | 9 + .../gms/ads/internal/ExceptionParcel.aidl | 3 + .../ads/internal/NonagonRequestParcel.aidl | 3 + .../internal/request/IAdRequestService.aidl | 11 + .../INonagonStreamingResponseListener.aidl | 8 + .../gms/ads/internal/ExceptionParcel.java | 16 + .../ads/internal/NonagonRequestParcel.java | 12 + play-services-api/build.gradle | 46 + .../src/main/AndroidManifest.xml | 18 + .../google/android/gms/ads/omid/IOmid.aidl | 16 + .../gms/appdatasearch/CorpusStatus.aidl | 3 + .../android/gms/appdatasearch/PIMEUpdate.aidl | 3 + .../gms/appdatasearch/PIMEUpdateResponse.aidl | 3 + .../RequestIndexingSpecification.aidl | 3 + .../appdatasearch/SuggestSpecification.aidl | 3 + .../gms/appdatasearch/SuggestionResults.aidl | 3 + .../android/gms/appdatasearch/UsageInfo.aidl | 3 + .../internal/IAppDataSearch.aidl | 14 + .../internal/ILightweightAppDataSearch.aidl | 8 + .../ILightweightAppDataSearchCallbacks.aidl | 4 + .../gms/audit/LogAuditRecordsRequest.aidl | 8 + .../gms/audit/internal/IAuditService.aidl | 13 + .../gms/auth/appcert/IAppCertService.aidl | 6 + .../gms/checkin/internal/ICheckinService.aidl | 7 + .../common/IPendingIntentCallback.aidl | 12 + .../manager/common/ISettingsCallback.aidl | 12 + .../internal/ICredentialManagerService.aidl | 17 + .../CredentialManagerInvocationParams.aidl | 8 + .../gms/facs/cache/FacsCacheCallOptions.aidl | 3 + .../ForceSettingsCacheRefreshResult.aidl | 3 + .../GetActivityControlsSettingsResult.aidl | 3 + .../cache/ReadDeviceLevelSettingsResult.aidl | 3 + .../UpdateActivityControlsSettingsResult.aidl | 3 + .../cache/internal/IFacsCacheCallbacks.aidl | 15 + .../cache/internal/IFacsCacheService.aidl | 12 + .../android/gms/feedback/ErrorReport.aidl | 8 + .../android/gms/feedback/FeedbackOptions.aidl | 3 + .../android/gms/feedback/FileTeleporter.aidl | 8 + .../android/gms/feedback/LogOptions.aidl | 8 + .../android/gms/feedback/ThemeSettings.aidl | 8 + .../feedback/internal/IFeedbackCallbacks.aidl | 10 + .../feedback/internal/IFeedbackService.aidl | 33 + .../gms/gass/internal/GassRequestParcel.aidl | 8 + .../gms/gass/internal/GassResponseParcel.aidl | 8 + .../gms/gass/internal/IGassService.aidl | 16 + .../android/gms/googlehelp/GoogleHelp.aidl | 3 + .../android/gms/googlehelp/InProductHelp.aidl | 3 + .../gms/googlehelp/SupportRequestHelp.aidl | 3 + .../internal/common/IGoogleHelpCallbacks.aidl | 26 + .../internal/common/IGoogleHelpService.aidl | 26 + .../android/gms/http/IGoogleHttpService.aidl | 7 + .../ClientLanguageSettings.aidl | 3 + .../gms/languageprofile/LanguageFluency.aidl | 3 + .../LanguageFluencyParams.aidl | 3 + .../languageprofile/LanguagePreference.aidl | 3 + .../LanguagePreferenceParams.aidl | 3 + .../internal/ILanguageProfileCallbacks.aidl | 11 + .../internal/ILanguageProfileService.aidl | 16 + .../IneligibilityRationale.aidl | 7 + .../LocationReportingStatus.aidl | 7 + .../LocationShare.aidl | 7 + .../LocationUploadRequest.aidl | 7 + .../LocationUploadResponse.aidl | 7 + .../NoticeAckedUpdateRequest.aidl | 7 + .../PeriodicLocationReportingIssues.aidl | 7 + .../PeriodicLocationUploadRequest.aidl | 7 + .../StartLocationReportingRequest.aidl | 7 + .../StopLocationReportingRequest.aidl | 7 + .../ILocationReportingIssuesCallback.aidl | 13 + .../ILocationReportingStatusCallbacks.aidl | 13 + .../ILocationSharingReporterService.aidl | 28 + .../internal/ILocationUploadCallbacks.aidl | 13 + .../gms/maps/auth/IApiTokenService.aidl | 12 + .../gms/measurement/internal/AppMetadata.aidl | 3 + .../ConditionalUserPropertyParcel.aidl | 3 + .../gms/measurement/internal/EventParcel.aidl | 3 + .../internal/IMeasurementService.aidl | 27 + .../internal/UserAttributeParcel.aidl | 3 + .../gms/people/internal/IPeopleCallbacks.aidl | 12 + .../gms/people/internal/IPeopleService.aidl | 44 + .../android/gms/phenotype/Configurations.aidl | 3 + .../android/gms/phenotype/DogfoodsToken.aidl | 3 + .../gms/phenotype/ExperimentTokens.aidl | 3 + .../google/android/gms/phenotype/Flag.aidl | 3 + .../android/gms/phenotype/FlagOverrides.aidl | 3 + .../gms/phenotype/RegistrationInfo.aidl | 3 + .../internal/IPhenotypeCallbacks.aidl | 27 + .../phenotype/internal/IPhenotypeService.aidl | 35 + .../plus/internal/IPlusOneButtonCreator.aidl | 8 + .../google/android/gms/potokens/PoToken.aidl | 8 + .../potokens/internal/IPoTokensService.aidl | 14 + .../potokens/internal/ITokenCallbacks.aidl | 13 + .../gms/pseudonymous/PseudonymousIdToken.aidl | 8 + .../internal/IPseudonymousIdCallbacks.aidl | 15 + .../internal/IPseudonymousIdService.aidl | 15 + .../android/gms/reminders/AccountState.aidl | 3 + .../CreateReminderOptionsInternal.aidl | 3 + .../gms/reminders/LoadRemindersOptions.aidl | 3 + .../gms/reminders/ReindexDueDatesOptions.aidl | 3 + .../reminders/UpdateRecurrenceOptions.aidl | 3 + .../internal/IRemindersCallbacks.aidl | 17 + .../internal/IRemindersListener.aidl | 5 + .../reminders/internal/IRemindersService.aidl | 37 + .../model/CustomizedSnoozePresetEntity.aidl | 3 + .../gms/reminders/model/TaskEntity.aidl | 3 + .../gms/reminders/model/TaskIdEntity.aidl | 3 + .../ISearchAdministrationService.aidl | 5 + .../search/corpora/ClearCorpusRequest.aidl | 3 + .../search/corpora/GetCorpusInfoRequest.aidl | 3 + .../corpora/GetCorpusStatusRequest.aidl | 3 + .../corpora/GetCorpusStatusResponse.aidl | 3 + .../corpora/RequestIndexingRequest.aidl | 3 + .../corpora/RequestIndexingResponse.aidl | 3 + .../internal/ISearchCorporaCallbacks.aidl | 9 + .../internal/ISearchCorporaService.aidl | 14 + .../GetCurrentExperimentIdsRequest.aidl | 3 + .../GetCurrentExperimentIdsResponse.aidl | 3 + .../global/GetGlobalSearchSourcesRequest.aidl | 3 + .../GetGlobalSearchSourcesResponse.aidl | 3 + .../GetPendingExperimentIdsRequest.aidl | 3 + .../GetPendingExperimentIdsResponse.aidl | 3 + .../global/SetExperimentIdsRequest.aidl | 3 + .../global/SetExperimentIdsResponse.aidl | 3 + .../SetIncludeInGlobalSearchRequest.aidl | 3 + .../SetIncludeInGlobalSearchResponse.aidl | 3 + .../internal/IGlobalSearchAdminCallbacks.aidl | 16 + .../internal/IGlobalSearchAdminService.aidl | 17 + .../gms/search/queries/QueryRequest.aidl | 3 + .../gms/search/queries/QueryResponse.aidl | 3 + .../internal/ISearchQueriesCallbacks.aidl | 7 + .../internal/ISearchQueriesService.aidl | 8 + .../gms/semanticlocation/PlaceCandidate.aidl | 7 + .../SemanticLocationEventRequest.aidl | 7 + .../internal/ISemanticLocationService.aidl | 18 + .../internal/SemanticLocationParameters.aidl | 7 + .../semanticlocationhistory/FieldMask.aidl | 7 + .../FrequentPlace.aidl | 7 + .../semanticlocationhistory/FrequentTrip.aidl | 7 + .../InferredPlace.aidl | 7 + .../LocationHistorySegment.aidl | 7 + .../LocationHistorySegmentRequest.aidl | 7 + .../LookupParameters.aidl | 7 + .../gms/semanticlocationhistory/Persona.aidl | 7 + .../RequestCredentials.aidl | 7 + .../TimeRangeFilter.aidl | 7 + .../UserLocationProfile.aidl | 7 + .../ISemanticLocationHistoryCallbacks.aidl | 21 + .../ISemanticLocationHistoryService.aidl | 25 + .../UsageReportingOptInOptions.aidl | 3 + .../internal/IUsageReportingCallbacks.aidl | 11 + ...eReportingOptInOptionsChangedListener.aidl | 5 + .../internal/IUsageReportingService.aidl | 12 + .../gms/wallet/GetClientTokenRequest.aidl | 8 + .../gms/wallet/GetClientTokenResponse.aidl | 8 + .../gms/wallet/IsReadyToPayRequest.aidl | 3 + .../gms/wallet/internal/IOwService.aidl | 10 + .../internal/IWalletServiceCallbacks.aidl | 9 + .../idl/CompoundHashParcelable.aidl | 3 + .../connection/idl/ConnectionConfig.aidl | 3 + .../idl/IConnectionAuthTokenProvider.aidl | 7 + .../connection/idl/IGetTokenCallback.aidl | 6 + .../connection/idl/IListenHashProvider.aidl | 11 + .../connection/idl/IPersistentConnection.aidl | 44 + .../idl/IPersistentConnectionDelegate.aidl | 19 + .../idl/IRequestResultCallback.aidl | 5 + .../connection/idl/RangeParcelable.aidl | 3 + .../gms/appdatasearch/CorpusStatus.java | 46 + .../android/gms/appdatasearch/PIMEUpdate.java | 24 + .../gms/appdatasearch/PIMEUpdateResponse.java | 42 + .../gms/appdatasearch/QuerySpecification.java | 72 + .../RequestIndexingSpecification.java | 28 + .../gms/appdatasearch/SearchResults.java | 27 + .../appdatasearch/SuggestSpecification.java | 31 + .../gms/appdatasearch/SuggestionResults.java | 54 + .../android/gms/appdatasearch/UsageInfo.java | 24 + .../gms/audit/LogAuditRecordsRequest.java | 53 + .../AccountRecoveryGuidanceRequest.java | 46 + .../dataservice/AccountRemovalRequest.java | 46 + .../ConfirmCredentialsRequest.java | 34 + .../firstparty/dataservice/FACLConfig.java | 27 + .../firstparty/dataservice/PACLConfig.java | 19 + .../firstparty/dataservice/TokenRequest.java | 54 + .../firstparty/dataservice/TokenResponse.java | 20 + .../ConfirmCredentialsWorkflowRequest.java | 43 + .../firstparty/proximity/data/Permit.java | 20 + .../firstparty/shared/AccountCredentials.java | 38 + .../firstparty/shared/AppDescription.java | 35 + .../firstparty/shared/CaptchaSolution.java | 29 + .../manager/invocationparams/CallerInfo.java | 28 + .../CredentialManagerAccount.java | 23 + .../CredentialManagerInvocationParams.java | 28 + .../gms/facs/cache/FacsCacheCallOptions.java | 17 + .../ForceSettingsCacheRefreshResult.java | 13 + .../GetActivityControlsSettingsResult.java | 33 + .../cache/ReadDeviceLevelSettingsResult.java | 13 + .../UpdateActivityControlsSettingsResult.java | 13 + .../gms/family/model/MemberDataModel.java | 79 + .../gms/family/v2/model/BulletPoint.java | 68 + .../android/gms/family/v2/model/HelpData.java | 45 + .../android/gms/family/v2/model/PageData.java | 61 + .../android/gms/feedback/ErrorReport.java | 163 + .../android/gms/feedback/FeedbackOptions.java | 67 + .../android/gms/feedback/FileTeleporter.java | 29 + .../android/gms/feedback/LogOptions.java | 37 + .../android/gms/feedback/ThemeSettings.java | 28 + .../gms/gass/internal/GassRequestParcel.java | 32 + .../gms/gass/internal/GassResponseParcel.java | 49 + .../FRDProductSpecificDataEntry.java | 12 + .../android/gms/googlehelp/GoogleHelp.java | 131 + .../android/gms/googlehelp/InProductHelp.java | 14 + .../android/gms/googlehelp/ND4CSettings.java | 12 + .../gms/googlehelp/OfflineSuggestion.java | 12 + .../gms/googlehelp/SupportRequestHelp.java | 17 + .../internal/common/OverflowMenuItem.java | 12 + .../internal/common/TogglingData.java | 12 + .../identity/accounts/api/AccountData.java | 20 + .../intents/model/CountrySpecification.java | 20 + .../identity/intents/model/UserAddress.java | 20 + .../ClientLanguageSettings.java | 12 + .../gms/languageprofile/LanguageFluency.java | 12 + .../LanguageFluencyParams.java | 12 + .../languageprofile/LanguagePreference.java | 12 + .../LanguagePreferenceParams.java | 12 + .../IneligibilityRationale.java | 47 + .../LocationCollectionReason.java | 40 + .../LocationReportingStatus.java | 41 + .../LocationShare.java | 46 + .../LocationUploadRequest.java | 63 + .../LocationUploadResponse.java | 34 + .../NoticeAckedUpdateRequest.java | 39 + .../PeriodicLocationReportingIssues.java | 48 + .../PeriodicLocationUploadRequest.java | 50 + .../StartLocationReportingRequest.java | 56 + .../StopLocationReportingRequest.java | 36 + .../gms/measurement/internal/AppMetadata.java | 79 + .../ConditionalUserPropertyParcel.java | 35 + .../gms/measurement/internal/EventParams.java | 17 + .../gms/measurement/internal/EventParcel.java | 21 + .../internal/UserAttributeParcel.java | 35 + .../internal/ParcelableLoadImageOptions.java | 36 + .../gms/people/model/AccountMetadata.java | 40 + .../gms/people/model/AvatarReference.java | 34 + .../android/gms/phenotype/Configurations.java | 25 + .../android/gms/phenotype/DogfoodsToken.java | 12 + .../android/gms/phenotype/FlagOverrides.java | 12 + .../gms/phenotype/RegistrationInfo.java | 27 + .../gms/plus/internal/PlusCommonExtras.java | 20 + .../gms/plus/internal/PlusSession.java | 20 + .../model/smart_profile/CardsRequest.java | 20 + .../model/smart_profile/CardsResponse.java | 20 + .../PeopleForProfilesRequest.java | 20 + .../PeopleForProfilesResponse.java | 20 + .../android/gms/plus/model/posts/Comment.java | 20 + .../android/gms/plus/model/posts/Post.java | 20 + .../gms/plus/model/posts/Settings.java | 20 + .../google/android/gms/potokens/PoToken.java | 20 + .../gms/pseudonymous/PseudonymousIdToken.java | 34 + .../android/gms/reminders/AccountState.java | 23 + .../CreateReminderOptionsInternal.java | 23 + .../gms/reminders/LoadRemindersOptions.java | 23 + .../gms/reminders/ReindexDueDatesOptions.java | 23 + .../reminders/UpdateRecurrenceOptions.java | 23 + .../model/CustomizedSnoozePresetEntity.java | 23 + .../gms/reminders/model/TaskEntity.java | 23 + .../gms/reminders/model/TaskIdEntity.java | 23 + .../search/corpora/ClearCorpusRequest.java | 23 + .../search/corpora/GetCorpusInfoRequest.java | 23 + .../corpora/GetCorpusStatusRequest.java | 48 + .../corpora/GetCorpusStatusResponse.java | 47 + .../corpora/RequestIndexingRequest.java | 53 + .../corpora/RequestIndexingResponse.java | 46 + .../GetCurrentExperimentIdsRequest.java | 28 + .../GetCurrentExperimentIdsResponse.java | 57 + .../global/GetGlobalSearchSourcesRequest.java | 39 + .../GetGlobalSearchSourcesResponse.java | 59 + .../GetPendingExperimentIdsRequest.java | 28 + .../GetPendingExperimentIdsResponse.java | 57 + .../global/SetExperimentIdsRequest.java | 45 + .../global/SetExperimentIdsResponse.java | 49 + .../SetIncludeInGlobalSearchRequest.java | 47 + .../SetIncludeInGlobalSearchResponse.java | 49 + .../gms/search/queries/QueryRequest.java | 57 + .../gms/search/queries/QueryResponse.java | 47 + .../gms/semanticlocation/PlaceCandidate.java | 138 + .../SemanticLocationEventRequest.java | 32 + .../internal/SemanticLocationParameters.java | 38 + .../semanticlocationhistory/FieldMask.java | 46 + .../FrequentPlace.java | 93 + .../semanticlocationhistory/FrequentTrip.java | 127 + .../InferredPlace.java | 55 + .../LocationHistorySegment.java | 74 + .../LocationHistorySegmentRequest.java | 52 + .../LookupParameters.java | 64 + .../gms/semanticlocationhistory/Persona.java | 237 + .../RequestCredentials.java | 52 + .../TimeRangeFilter.java | 47 + .../UserLocationProfile.java | 60 + .../UsageReportingOptInOptions.java | 15 + .../gms/wallet/GetClientTokenRequest.java | 26 + .../gms/wallet/GetClientTokenResponse.java | 26 + .../gms/wallet/IsReadyToPayRequest.java | 161 + .../gms/wallet/IsReadyToPayResponse.java | 25 + .../android/gms/wallet/WalletConstants.java | 117 + .../idl/CompoundHashParcelable.java | 23 + .../connection/idl/ConnectionConfig.java | 23 + .../connection/idl/RangeParcelable.java | 23 + play-services-appinvite/build.gradle | 40 + play-services-appinvite/core/build.gradle | 48 + .../core/src/main/AndroidManifest.xml | 50 + .../gms/appinivite/AppInviteActivity.kt | 123 + .../microg/gms/appinivite/AppInviteService.kt | 48 + .../gms/appinivite/utils/DynamicLinkUtils.kt | 147 + .../core/src/main/proto/datamixer.proto | 99 + .../src/main/AndroidManifest.xml | 18 + .../internal/IAppInviteCallbacks.aidl | 11 + .../appinvite/internal/IAppInviteService.aidl | 14 + play-services-appset/build.gradle | 37 + play-services-appset/core/build.gradle | 56 + .../core/src/main/AndroidManifest.xml | 16 + .../org/microg/gms/appset/AppSetService.kt | 43 + .../src/main/AndroidManifest.xml | 4 + .../gms/appset/AppSetIdRequestParams.aidl | 8 + .../android/gms/appset/AppSetInfoParcel.aidl | 8 + .../appset/internal/IAppSetIdCallback.aidl | 13 + .../gms/appset/internal/IAppSetService.aidl | 13 + .../com/google/android/gms/appset/AppSet.java | 25 + .../android/gms/appset/AppSetIdClient.java | 25 + .../android/gms/appset/AppSetIdInfo.java | 75 + .../gms/appset/AppSetIdRequestParams.java | 45 + .../android/gms/appset/AppSetInfoParcel.java | 38 + .../android/gms/appset/package-info.java | 12 + play-services-auth-api-phone/build.gradle | 45 + .../core/build.gradle | 44 + .../core/src/main/AndroidManifest.xml | 36 + .../gms/auth/phone/AskPermissionActivity.kt | 54 + .../microg/gms/auth/phone/SmsRetrieverCore.kt | 359 + .../gms/auth/phone/SmsRetrieverRequest.kt | 22 + .../gms/auth/phone/SmsRetrieverService.kt | 131 + .../auth/phone/UserConsentPromptActivity.kt | 79 + .../org/microg/gms/auth/phone/constants.kt | 13 + .../res/layout/dialog_sms_user_consent.xml | 57 + .../core/src/main/res/values-ar/strings.xml | 6 + .../core/src/main/res/values-ast/strings.xml | 6 + .../core/src/main/res/values-az/strings.xml | 4 + .../core/src/main/res/values-be/strings.xml | 6 + .../core/src/main/res/values-cs/strings.xml | 6 + .../core/src/main/res/values-de/strings.xml | 6 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 6 + .../core/src/main/res/values-fa/strings.xml | 6 + .../core/src/main/res/values-fi/strings.xml | 6 + .../core/src/main/res/values-fil/strings.xml | 6 + .../core/src/main/res/values-fr/strings.xml | 6 + .../core/src/main/res/values-ga/strings.xml | 6 + .../core/src/main/res/values-in/strings.xml | 6 + .../core/src/main/res/values-is/strings.xml | 6 + .../core/src/main/res/values-it/strings.xml | 6 + .../core/src/main/res/values-ja/strings.xml | 6 + .../core/src/main/res/values-ko/strings.xml | 6 + .../core/src/main/res/values-lv/strings.xml | 5 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 6 + .../src/main/res/values-nb-rNO/strings.xml | 6 + .../core/src/main/res/values-nl/strings.xml | 6 + .../core/src/main/res/values-pl/strings.xml | 6 + .../src/main/res/values-pt-rBR/strings.xml | 6 + .../core/src/main/res/values-pt/strings.xml | 6 + .../core/src/main/res/values-ro/strings.xml | 6 + .../core/src/main/res/values-ru/strings.xml | 6 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 6 + .../core/src/main/res/values-sv/strings.xml | 6 + .../core/src/main/res/values-ta/strings.xml | 6 + .../core/src/main/res/values-th/strings.xml | 6 + .../core/src/main/res/values-tr/strings.xml | 6 + .../core/src/main/res/values-ug/strings.xml | 6 + .../core/src/main/res/values-uk/strings.xml | 6 + .../core/src/main/res/values-vi/strings.xml | 6 + .../src/main/res/values-zh-rCN/strings.xml | 6 + .../src/main/res/values-zh-rTW/strings.xml | 6 + .../core/src/main/res/values/strings.xml | 10 + .../src/main/AndroidManifest.xml | 6 + .../IAutofillPermissionStateCallback.aidl | 7 + .../internal/IOngoingSmsRequestCallback.aidl | 7 + .../internal/ISmsRetrieverApiService.aidl | 18 + .../internal/ISmsRetrieverResultCallback.aidl | 7 + .../auth/api/phone/SmsCodeAutofillClient.java | 93 + .../auth/api/phone/SmsCodeBrowserClient.java | 58 + .../gms/auth/api/phone/SmsCodeRetriever.java | 89 + .../gms/auth/api/phone/SmsRetriever.java | 72 + .../gms/auth/api/phone/SmsRetrieverApi.java | 58 + .../auth/api/phone/SmsRetrieverClient.java | 27 + .../api/phone/SmsRetrieverStatusCodes.java | 51 + .../gms/auth/api/phone/package-info.java | 36 + .../api/phone/SmsCodeAutofillClientImpl.java | 56 + .../api/phone/SmsCodeBrowserClientImpl.java | 24 + .../auth/api/phone/SmsRetrieverApiClient.java | 102 + .../api/phone/SmsRetrieverClientImpl.java | 32 + .../phone/SmsRetrieverResultCallbackImpl.java | 28 + .../auth/api/phone/StatusCallbackImpl.java | 28 + play-services-auth-base/build.gradle | 45 + .../src/main/AndroidManifest.xml | 6 + .../android/auth/IAuthManagerService.aidl | 23 + .../gms/auth/AccountChangeEventsRequest.aidl | 3 + .../gms/auth/AccountChangeEventsResponse.aidl | 3 + .../android/gms/auth/GetAccountsRequest.aidl | 3 + .../gms/auth/GetHubTokenInternalResponse.aidl | 3 + .../android/gms/auth/GetHubTokenRequest.aidl | 3 + .../gms/auth/HasCapabilitiesRequest.aidl | 3 + .../auth/account/data/IBundleCallback.aidl | 7 + .../data/IGetAccountChangeEventsCallback.aidl | 8 + .../account/data/IGetAccountsCallback.aidl | 7 + .../account/data/IGetHubTokenCallback.aidl | 8 + .../data/IGetTokenWithDetailsCallback.aidl | 7 + .../auth/account/data/IGoogleAuthService.aidl | 27 + .../data/IHasCapabilitiesCallback.aidl | 7 + .../gms/auth/api/internal/IAuthCallbacks.aidl | 8 + .../gms/auth/api/internal/IAuthService.aidl | 11 + .../gms/auth/api/proxy/ProxyRequest.aidl | 3 + .../gms/auth/api/proxy/ProxyResponse.aidl | 3 + .../dataservice/ClearTokenRequest.aidl | 3 + .../DeviceManagementInfoResponse.aidl | 8 + .../gms/auth/folsom/RecoveryRequest.aidl | 8 + .../gms/auth/folsom/RecoveryResult.aidl | 8 + .../android/gms/auth/folsom/SharedKey.aidl | 8 + .../folsom/internal/IBooleanCallback.aidl | 12 + .../folsom/internal/IByteArrayCallback.aidl | 12 + .../internal/IByteArrayListCallback.aidl | 12 + .../internal/IKeyRetrievalCallback.aidl | 12 + .../IKeyRetrievalConsentCallback.aidl | 12 + .../folsom/internal/IKeyRetrievalService.aidl | 42 + .../IKeyRetrievalSyncStatusCallback.aidl | 12 + .../internal/IRecoveryResultCallback.aidl | 13 + .../ISecurityDomainMembersCallback.aidl | 12 + .../folsom/internal/ISharedKeyCallback.aidl | 13 + .../folsom/internal/IStringListCallback.aidl | 12 + .../android/gms/auth/AccountChangeEvent.java | 23 + .../gms/auth/AccountChangeEventsRequest.java | 45 + .../gms/auth/AccountChangeEventsResponse.java | 36 + .../android/gms/auth/GetAccountsRequest.java | 25 + .../gms/auth/GetHubTokenInternalResponse.java | 23 + .../android/gms/auth/GetHubTokenRequest.java | 22 + .../gms/auth/HasCapabilitiesRequest.java | 20 + .../google/android/gms/auth/TokenData.java | 72 + .../gms/auth/api/proxy/ProxyRequest.java | 43 + .../gms/auth/api/proxy/ProxyResponse.java | 32 + .../dataservice/ClearTokenRequest.java | 19 + .../DeviceManagementInfoResponse.java | 44 + .../gms/auth/folsom/RecoveryRequest.java | 24 + .../gms/auth/folsom/RecoveryResult.java | 24 + .../android/gms/auth/folsom/SharedKey.java | 47 + .../google/android/gms/auth/package-info.java | 11 + play-services-auth-blockstore/build.gradle | 45 + .../core/build.gradle | 42 + .../core/src/main/AndroidManifest.xml | 18 + .../gms/auth/blockstore/BlockStoreImpl.kt | 89 + .../auth/blockstore/BlockstoreApiService.kt | 163 + .../src/main/AndroidManifest.xml | 6 + .../gms/auth/blockstore/AppRestoreInfo.aidl | 8 + .../auth/blockstore/DeleteBytesRequest.aidl | 8 + .../auth/blockstore/RetrieveBytesRequest.aidl | 8 + .../blockstore/RetrieveBytesResponse.aidl | 8 + .../gms/auth/blockstore/StoreBytesData.aidl | 8 + .../internal/IBlockstoreService.aidl | 36 + .../internal/IDeleteBytesCallback.aidl | 12 + .../IGetAccessForPackageCallback.aidl | 12 + .../internal/IGetBlockstoreDataCallback.aidl | 12 + ...IsEndToEndEncryptionAvailableCallback.aidl | 12 + .../internal/IRetrieveBytesCallback.aidl | 14 + .../internal/ISetBlockstoreDataCallback.aidl | 12 + .../internal/IStoreBytesCallback.aidl | 12 + .../gms/auth/blockstore/AppRestoreInfo.java | 46 + .../gms/auth/blockstore/Blockstore.java | 26 + .../gms/auth/blockstore/BlockstoreClient.java | 119 + .../blockstore/BlockstoreStatusCodes.java | 35 + .../auth/blockstore/DeleteBytesRequest.java | 138 + .../auth/blockstore/RetrieveBytesRequest.java | 132 + .../blockstore/RetrieveBytesResponse.java | 139 + .../gms/auth/blockstore/StoreBytesData.java | 134 + .../gms/auth/blockstore/package-info.java | 11 + play-services-auth-workaccount/build.gradle | 38 + .../core/build.gradle | 45 + .../core/src/main/AndroidManifest.xml | 43 + .../authenticator/WorkAccountAuthenticator.kt | 240 + .../WorkAccountAuthenticatorService.kt | 22 + .../auth/workaccount/WorkAccountService.kt | 168 + .../auth/workaccount/WorkProfileSettings.kt | 28 + .../src/main/res/drawable/ic_briefcase.xml | 9 + .../core/src/main/res/values/strings.xml | 12 + .../main/res/xml/auth_work_authenticator.xml | 11 + .../src/main/AndroidManifest.xml | 6 + .../auth/account/IWorkAccountCallback.aidl | 13 + .../gms/auth/account/IWorkAccountService.aidl | 18 + play-services-auth/build.gradle | 48 + .../src/main/AndroidManifest.xml | 6 + .../account/data/IAccountDataService.aidl | 16 + .../data/IDeviceManagementInfoCallback.aidl | 13 + .../gms/auth/api/credentials/Credential.aidl | 3 + .../api/credentials/CredentialRequest.aidl | 3 + .../credentials/internal/DeleteRequest.aidl | 3 + .../internal/GeneratePasswordRequest.aidl | 3 + .../internal/ICredentialsCallbacks.aidl | 10 + .../internal/ICredentialsService.aidl | 15 + .../api/credentials/internal/SaveRequest.aidl | 3 + .../api/identity/AuthorizationRequest.aidl | 8 + .../api/identity/AuthorizationResult.aidl | 8 + .../auth/api/identity/BeginSignInRequest.aidl | 8 + .../auth/api/identity/BeginSignInResult.aidl | 8 + .../GetPhoneNumberHintIntentRequest.aidl | 8 + .../api/identity/GetSignInIntentRequest.aidl | 8 + .../auth/api/identity/SignInCredential.aidl | 8 + .../api/identity/VerifyWithGoogleRequest.aidl | 8 + .../api/identity/VerifyWithGoogleResult.aidl | 8 + .../internal/IAuthorizationCallback.aidl | 13 + .../internal/IAuthorizationService.aidl | 16 + .../internal/IBeginSignInCallback.aidl | 13 + .../IGetPhoneNumberHintIntentCallback.aidl | 12 + .../internal/IGetSignInIntentCallback.aidl | 12 + .../api/identity/internal/ISignInService.aidl | 21 + .../internal/IVerifyWithGoogleCallback.aidl | 13 + .../api/signin/internal/ISignInCallbacks.aidl | 10 + .../api/signin/internal/ISignInService.aidl | 10 + .../com/google/android/gms/auth/api/Auth.java | 32 + .../gms/auth/api/credentials/Credential.java | 235 + .../credentials/CredentialPickerConfig.java | 96 + .../api/credentials/CredentialRequest.java | 77 + .../gms/auth/api/credentials/HintRequest.java | 170 + .../gms/auth/api/credentials/IdToken.java | 50 + .../api/credentials/IdentityProviders.java | 34 + .../credentials/internal/DeleteRequest.java | 23 + .../internal/GeneratePasswordRequest.java | 23 + .../api/credentials/internal/SaveRequest.java | 23 + .../auth/api/credentials/package-info.java | 11 + .../api/identity/AuthorizationClient.java | 66 + .../api/identity/AuthorizationOptions.java | 13 + .../api/identity/AuthorizationRequest.java | 67 + .../api/identity/AuthorizationResult.java | 153 + .../auth/api/identity/BeginSignInRequest.java | 660 + .../auth/api/identity/BeginSignInResult.java | 45 + .../auth/api/identity/ClearTokenRequest.java | 119 + .../api/identity/CredentialSavingClient.java | 56 + .../api/identity/CredentialSavingOptions.java | 23 + .../GetPhoneNumberHintIntentRequest.java | 69 + .../api/identity/GetSignInIntentRequest.java | 214 + .../gms/auth/api/identity/Identity.java | 70 + .../api/identity/RevokeAccessRequest.java | 146 + .../SaveAccountLinkingTokenRequest.java | 221 + .../SaveAccountLinkingTokenResult.java | 73 + .../api/identity/SavePasswordRequest.java | 108 + .../auth/api/identity/SavePasswordResult.java | 62 + .../gms/auth/api/identity/SignInClient.java | 82 + .../auth/api/identity/SignInCredential.java | 141 + .../gms/auth/api/identity/SignInOptions.java | 23 + .../gms/auth/api/identity/SignInPassword.java | 70 + .../api/identity/VerifyWithGoogleRequest.java | 47 + .../api/identity/VerifyWithGoogleResult.java | 48 + .../gms/auth/api/identity/package-info.java | 12 + .../gms/auth/api/signin/GoogleSignIn.java | 187 + .../gms/auth/api/signin/GoogleSignInApi.java | 103 + .../auth/api/signin/GoogleSignInClient.java | 100 + .../auth/api/signin/GoogleSignInResult.java | 61 + .../api/signin/GoogleSignInStatusCodes.java | 65 + .../gms/auth/api/signin/SignInAccount.java | 29 + .../signin/internal/SignInConfiguration.java | 76 + .../google/android/gms/auth/package-info.java | 11 + .../auth/api/signin/GoogleSignInApiImpl.java | 51 + .../auth/api/signin/GoogleSignInCommon.java | 57 + .../api/signin/GoogleSignInGmsClientImpl.java | 26 + play-services-base/build.gradle | 49 + play-services-base/core/build.gradle | 63 + play-services-base/core/package/build.gradle | 45 + .../core/package/src/main/AndroidManifest.xml | 23 + .../gms/moduleinstall/ModuleInstallService.kt | 65 + .../org/microg/gms/profile/ProfileProvider.kt | 52 + .../core/src/main/AndroidManifest.xml | 45 + .../microg/gms/AbstractGmsServiceBroker.java | 276 + .../main/java/org/microg/gms/BaseService.java | 73 + .../java/org/microg/gms/DummyService.java | 37 + .../java/org/microg/gms/auth/AuthRequest.java | 263 + .../org/microg/gms/auth/AuthResponse.java | 138 + .../gms/common/DeviceConfiguration.java | 196 + .../microg/gms/common/DeviceIdentifier.java | 61 + .../gms/common/ForegroundServiceContext.java | 106 + .../gms/common/ForegroundServiceInfo.java | 21 + .../org/microg/gms/common/HttpFormClient.java | 278 + .../microg/gms/common/MultiListenerProxy.java | 225 + .../org/microg/gms/common/NonCancelToken.java | 28 + .../microg/gms/common/NotOkayException.java | 20 + .../org/microg/gms/common/PackageUtils.java | 393 + .../java/org/microg/gms/common/PhoneInfo.java | 35 + .../gms/common/RemoteListenerProxy.java | 138 + .../java/org/microg/gms/common/Utils.java | 68 + .../kotlin/org/microg/gms/auth/AuthPrefs.kt | 43 + .../org/microg/gms/checkin/LastCheckinInfo.kt | 77 + .../microg/gms/common/DeviceConfigProto.kt | 26 + .../microg/gms/common/KnownGooglePackages.kt | 222 + .../CrossProfileRequestActivity.kt | 90 + .../crossprofile/CrossProfileSendActivity.kt | 57 + .../gms/crossprofile/UserInitReceiver.kt | 40 + .../kotlin/org/microg/gms/profile/Build.kt | 104 + .../org/microg/gms/profile/ProfileManager.kt | 408 + .../gms/settings/MetaDataPreferences.kt | 45 + .../microg/gms/settings/SettingsContract.kt | 349 + .../microg/gms/settings/SettingsProvider.kt | 494 + .../org/microg/gms/ui/AppHeadingPreference.kt | 49 + .../org/microg/gms/ui/AppIconPreference.kt | 32 + .../kotlin/org/microg/gms/ui/AppPreference.kt | 54 + .../kotlin/org/microg/gms/ui/Constants.kt | 8 + .../org/microg/gms/ui/FooterPreference.kt | 29 + .../org/microg/gms/ui/SwitchBarPreference.kt | 62 + .../org/microg/gms/ui/TextPreference.kt | 35 + .../main/kotlin/org/microg/gms/ui/Utils.kt | 78 + .../gms/ui/settings/SettingsProvider.kt | 58 + .../org/microg/gms/utils/BinderUtils.kt | 24 + .../org/microg/gms/utils/BitmapUtils.kt | 33 + .../microg/gms/utils/ExtendedPackageInfo.kt | 54 + .../microg/gms/utils/FileXmlResourceParser.kt | 127 + .../microg/gms/utils/IntentCacheManager.kt | 149 + .../microg/gms/utils/PackageManagerUtils.kt | 51 + .../microg/gms/utils/PackageManagerWrapper.kt | 529 + .../microg/gms/utils/SingleInstanceUtil.kt | 42 + .../org/microg/gms/vending/InstallerData.kt | 61 + .../res/drawable/ic_background_notify.xml | 9 + .../src/main/res/drawable/ic_expand_apps.xml | 19 + .../src/main/res/drawable/ic_info_outline.xml | 17 + .../core/src/main/res/drawable/ic_open.xml | 17 + .../core/src/main/res/drawable/ic_radio.xml | 16 + .../main/res/drawable/ic_radio_checked.xml | 16 + .../main/res/drawable/ic_radio_unchecked.xml | 16 + .../core/src/main/res/layout/list_no_item.xml | 50 + .../res/layout/preference_app_heading.xml | 46 + .../layout/preference_category_no_label.xml | 9 + .../src/main/res/layout/preference_footer.xml | 51 + .../res/layout/preference_progress_bar.xml | 17 + .../main/res/layout/preference_switch_bar.xml | 42 + .../core/src/main/res/values-ar/strings.xml | 16 + .../core/src/main/res/values-ast/strings.xml | 12 + .../core/src/main/res/values-az/strings.xml | 15 + .../core/src/main/res/values-be/strings.xml | 25 + .../core/src/main/res/values-cs/strings.xml | 17 + .../core/src/main/res/values-de/strings.xml | 20 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 19 + .../core/src/main/res/values-fa/strings.xml | 17 + .../core/src/main/res/values-fi/strings.xml | 13 + .../core/src/main/res/values-fil/strings.xml | 17 + .../core/src/main/res/values-fr/strings.xml | 20 + .../core/src/main/res/values-ga/strings.xml | 17 + .../core/src/main/res/values-in/strings.xml | 17 + .../core/src/main/res/values-is/strings.xml | 17 + .../core/src/main/res/values-it/strings.xml | 17 + .../core/src/main/res/values-ja/strings.xml | 19 + .../core/src/main/res/values-ko/strings.xml | 17 + .../core/src/main/res/values-lv/strings.xml | 2 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 17 + .../src/main/res/values-nb-rNO/strings.xml | 17 + .../core/src/main/res/values-nl/strings.xml | 16 + .../core/src/main/res/values-pl/strings.xml | 20 + .../src/main/res/values-pt-rBR/strings.xml | 20 + .../core/src/main/res/values-pt/strings.xml | 17 + .../core/src/main/res/values-ro/strings.xml | 17 + .../core/src/main/res/values-ru/strings.xml | 20 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 20 + .../core/src/main/res/values-sv/strings.xml | 17 + .../core/src/main/res/values-ta/strings.xml | 17 + .../core/src/main/res/values-th/strings.xml | 17 + .../core/src/main/res/values-tr/strings.xml | 16 + .../core/src/main/res/values-ug/strings.xml | 17 + .../core/src/main/res/values-uk/strings.xml | 20 + .../core/src/main/res/values-vi/strings.xml | 17 + .../src/main/res/values-zh-rCN/strings.xml | 17 + .../src/main/res/values-zh-rTW/strings.xml | 19 + .../core/src/main/res/values/strings.xml | 26 + .../core/src/main/res/values/themes.xml | 95 + .../src/main/AndroidManifest.xml | 16 + .../auth/api/signin/GoogleSignInAccount.aidl | 3 + .../auth/api/signin/GoogleSignInOptions.aidl | 3 + .../common/api/internal/IStatusCallback.aidl | 7 + .../gms/common/data/BitmapTeleporter.aidl | 8 + .../android/gms/common/data/DataHolder.aidl | 3 + .../android/gms/common/images/WebImage.aidl | 3 + .../common/internal/AuthAccountRequest.aidl | 3 + .../internal/IResolveAccountCallbacks.aidl | 5 + .../common/internal/ISignInButtonCreator.aidl | 7 + .../gms/common/internal/MethodInvocation.aidl | 8 + .../internal/ResolveAccountRequest.aidl | 3 + .../gms/common/internal/TelemetryData.aidl | 8 + .../service/IClientTelemetryService.aidl | 12 + .../ModuleAvailabilityResponse.aidl | 3 + .../ModuleInstallIntentResponse.aidl | 3 + .../moduleinstall/ModuleInstallResponse.aidl | 3 + .../ModuleInstallStatusUpdate.aidl | 3 + .../internal/ApiFeatureRequest.aidl | 3 + .../internal/IModuleInstallCallbacks.aidl | 13 + .../internal/IModuleInstallService.aidl | 14 + .../IModuleInstallStatusListener.aidl | 7 + .../common/server/FavaDiagnosticsEntity.aidl | 3 + .../signin/internal/AuthAccountResult.aidl | 3 + .../internal/CheckServerAuthResult.aidl | 3 + .../gms/signin/internal/ISignInCallbacks.aidl | 17 + .../gms/signin/internal/ISignInService.aidl | 27 + .../RecordConsentByConsentResultRequest.aidl | 3 + .../RecordConsentByConsentResultResponse.aidl | 3 + .../signin/internal/RecordConsentRequest.aidl | 3 + .../gms/signin/internal/SignInRequest.aidl | 3 + .../gms/signin/internal/SignInResponse.aidl | 3 + .../auth/api/signin/GoogleSignInAccount.java | 352 + .../auth/api/signin/GoogleSignInOptions.java | 433 + .../signin/GoogleSignInOptionsExtension.java | 36 + ...oogleSignInOptionsExtensionParcelable.java | 52 + .../api/signin/internal/HashAccumulator.java | 41 + .../gms/auth/api/signin/internal/Storage.java | 100 + .../gms/common/GoogleApiAvailability.java | 303 + .../gms/common/GooglePlayServicesClient.java | 56 + .../gms/common/GooglePlayServicesUtil.java | 243 + .../android/gms/common/api/AccountInfo.java | 24 + .../google/android/gms/common/api/Api.java | 249 + .../android/gms/common/api/GoogleApi.java | 222 + .../gms/common/api/GoogleApiActivity.java | 26 + .../gms/common/api/GoogleApiClient.java | 695 + .../android/gms/common/api/HasApiKey.java | 16 + .../gms/common/api/OptionalModuleApi.java | 19 + .../gms/common/api/OptionalPendingResult.java | 34 + .../android/gms/common/api/PendingResult.java | 106 + .../api/internal/ApiExceptionMapper.java | 20 + .../gms/common/api/internal/ApiKey.java | 47 + .../api/internal/ConnectionCallbacks.java | 46 + .../common/api/internal/ListenerHolder.java | 12 + .../internal/OnConnectionFailedListener.java | 30 + .../internal/SignInConnectionListener.java | 13 + .../gms/common/data/AbstractDataBuffer.java | 88 + .../gms/common/data/BitmapTeleporter.java | 110 + .../android/gms/common/data/DataBuffer.java | 57 + .../gms/common/data/DataBufferIterator.java | 40 + .../gms/common/data/DataBufferRef.java | 71 + .../android/gms/common/data/DataHolder.java | 577 + .../android/gms/common/data/Freezable.java | 39 + .../data/SingleRefDataBufferIterator.java | 37 + .../android/gms/common/data/package-info.java | 11 + .../gms/common/images/ImageManager.java | 199 + .../android/gms/common/images/Size.java | 107 + .../android/gms/common/images/WebImage.java | 97 + .../gms/common/images/package-info.java | 11 + .../gms/common/internal/ApiExceptionUtil.java | 20 + .../common/internal/AuthAccountRequest.java | 12 + .../gms/common/internal/ClientIdentity.java | 39 + .../gms/common/internal/ClientSettings.java | 140 + .../gms/common/internal/MethodInvocation.java | 78 + .../common/internal/PendingResultUtil.java | 51 + .../internal/ResolveAccountRequest.java | 39 + .../internal/ResolveAccountResponse.java | 39 + .../gms/common/internal/ResultTransform.java | 68 + .../gms/common/internal/TelemetryData.java | 52 + .../common/internal/TransformedResult.java | 38 + .../moduleinstall/InstallStatusListener.java | 19 + .../ModuleAvailabilityResponse.java | 82 + .../common/moduleinstall/ModuleInstall.java | 31 + .../moduleinstall/ModuleInstallClient.java | 100 + .../ModuleInstallIntentResponse.java | 54 + .../moduleinstall/ModuleInstallRequest.java | 110 + .../moduleinstall/ModuleInstallResponse.java | 59 + .../ModuleInstallStatusCodes.java | 55 + .../ModuleInstallStatusUpdate.java | 167 + .../internal/ApiFeatureRequest.java | 48 + .../android/gms/common/package-info.java | 11 + .../common/server/FavaDiagnosticsEntity.java | 24 + .../android/gms/common/util/IOUtils.java | 101 + .../gms/dynamic/DeferredLifecycleHelper.java | 166 + .../com/google/android/gms/signin/SignIn.java | 15 + .../android/gms/signin/SignInClient.java | 17 + .../android/gms/signin/SignInOptions.java | 16 + .../signin/internal/AuthAccountResult.java | 30 + .../internal/CheckServerAuthResult.java | 24 + .../RecordConsentByConsentResultRequest.java | 12 + .../RecordConsentByConsentResultResponse.java | 12 + .../signin/internal/RecordConsentRequest.java | 25 + .../gms/signin/internal/SignInRequest.java | 30 + .../gms/signin/internal/SignInResponse.java | 34 + .../org/microg/gms/common/DummyApiClient.java | 149 + .../common/ForwardConnectionCallbacks.java | 51 + .../ForwardConnectionFailedListener.java | 47 + .../java/org/microg/gms/common/GmsClient.java | 302 + .../org/microg/gms/common/GmsConnector.java | 92 + .../gms/common/MultiConnectionKeeper.java | 347 + .../api/AbstractPlayServicesClient.java | 99 + .../gms/common/api/ApiClientBuilder.java | 30 + .../gms/common/api/BasePendingResult.java | 112 + .../gms/common/api/GoogleApiClientImpl.java | 252 + .../gms/common/api/GoogleApiManager.java | 191 + .../gms/common/api/InstantPendingResult.java | 61 + .../gms/common/api/PendingGoogleApiCall.java | 13 + .../gms/common/api/ResultCallbackHandler.java | 70 + .../common/api/ReturningGoogleApiCall.java | 22 + .../api/VoidReturningGoogleApiCall.java | 23 + .../microg/gms/signin/SignInClientImpl.java | 112 + play-services-basement/build.gradle | 55 + play-services-basement/consumer-rules.pro | 19 + play-services-basement/ktx/build.gradle | 44 + .../ktx/src/main/AndroidManifest.xml | 7 + .../android/gms/dynamic/ObjectWrapper.kt | 19 + .../src/main/AndroidManifest.xml | 13 + .../android/gms/common/ConnectionResult.aidl | 3 + .../common/GoogleCertificatesLookupQuery.aidl | 3 + .../GoogleCertificatesLookupResponse.aidl | 3 + .../gms/common/GoogleCertificatesQuery.aidl | 3 + .../android/gms/common/api/ApiMetadata.aidl | 8 + .../gms/common/api/ComplianceOptions.aidl | 8 + .../google/android/gms/common/api/Scope.aidl | 8 + .../google/android/gms/common/api/Status.aidl | 3 + .../gms/common/internal/ConnectionInfo.aidl | 7 + .../common/internal/GetServiceRequest.aidl | 3 + .../gms/common/internal/IAccountAccessor.aidl | 5 + .../gms/common/internal/ICancelToken.aidl | 5 + .../gms/common/internal/ICertData.aidl | 8 + .../gms/common/internal/IGmsCallbacks.aidl | 15 + .../common/internal/IGmsServiceBroker.aidl | 39 + .../internal/IGoogleCertificatesApi.aidl | 18 + .../internal/ValidateAccountRequest.aidl | 3 + .../android/gms/dynamic/IObjectWrapper.aidl | 8 + .../android/gms/dynamite/IDynamiteLoader.aidl | 16 + .../android/gms/actions/package-info.java | 11 + .../android/gms/common/ConnectionResult.java | 357 + .../google/android/gms/common/Feature.java | 54 + .../common/GoogleCertificatesLookupQuery.java | 50 + .../GoogleCertificatesLookupResponse.java | 38 + .../gms/common/GoogleCertificatesQuery.java | 51 + ...oglePlayServicesNotAvailableException.java | 23 + ...GooglePlayServicesRepairableException.java | 44 + .../com/google/android/gms/common/Scopes.java | 106 + .../gms/common/UserRecoverableException.java | 32 + .../android/gms/common/api/ApiException.java | 63 + .../android/gms/common/api/ApiMetadata.java | 85 + .../gms/common/api/CommonStatusCodes.java | 92 + .../gms/common/api/ComplianceOptions.java | 52 + .../android/gms/common/api/Releasable.java | 24 + .../common/api/ResolvableApiException.java | 54 + .../android/gms/common/api/Response.java | 35 + .../google/android/gms/common/api/Result.java | 27 + .../gms/common/api/ResultCallback.java | 33 + .../gms/common/api/ResultCallbacks.java | 36 + .../google/android/gms/common/api/Scope.java | 75 + .../google/android/gms/common/api/Status.java | 198 + .../api/internal/StatusExceptionMapper.java | 16 + .../gms/common/internal/BaseGmsClient.java | 22 + .../gms/common/internal/BinderWrapper.java | 51 + .../android/gms/common/internal/CertData.java | 104 + .../gms/common/internal/ConnectionInfo.java | 31 + .../common/internal/GetServiceRequest.java | 103 + .../internal/ValidateAccountRequest.java | 33 + .../safeparcel/AbstractSafeParcelable.java | 30 + .../internal/safeparcel/SafeParcelReader.java | 328 + .../internal/safeparcel/SafeParcelWriter.java | 384 + .../internal/safeparcel/SafeParcelable.java | 55 + .../SafeParcelableCreatorAndWriter.java | 13 + .../safeparcel/SafeParcelableSerializer.java | 30 + .../android/gms/common/package-info.java | 11 + .../gms/dynamic/LifecycleDelegate.java | 38 + .../android/gms/dynamic/ObjectWrapper.java | 102 + .../dynamic/OnDelegateCreatedListener.java | 10 + .../android/gms/dynamite/DynamiteModule.java | 163 + .../gms/security/ProviderInstaller.java | 61 + .../stats/GCoreWakefulBroadcastReceiver.java | 24 + .../org/microg/gms/auth/AuthConstants.java | 43 + .../java/org/microg/gms/common/Constants.java | 32 + .../org/microg/gms/common/GmsService.java | 220 + .../main/java/org/microg/gms/common/Hide.java | 19 + .../java/org/microg/gms/common/PublicApi.java | 50 + .../java/org/microg/gms/gcm/GcmConstants.java | 101 + .../org/microg/gms/utils/ToStringHelper.java | 130 + .../org/microg/gms/utils/WorkSourceUtil.java | 62 + .../microg/safeparcel/AutoSafeParcelable.java | 48 + ...flectedSafeParcelableCreatorAndWriter.java | 36 + .../safeparcel/SafeParcelReflectionUtil.java | 538 + .../org/microg/safeparcel/SafeParceled.java | 26 + .../src/main/res/values/version.xml | 9 + play-services-cast-framework/build.gradle | 54 + .../core/build.gradle | 56 + .../core/src/main/AndroidManifest.xml | 11 + .../framework/internal/CastContextImpl.java | 154 + .../internal/CastDynamiteModuleImpl.java | 77 + .../framework/internal/CastSessionImpl.java | 79 + .../internal/DiscoveryManagerImpl.java | 68 + .../internal/MediaRouterCallbackImpl.java | 68 + .../cast/framework/internal/SessionImpl.java | 197 + .../internal/SessionManagerImpl.java | 230 + .../src/main/AndroidManifest.xml | 30 + .../gms/cast/framework/CastOptions.aidl | 3 + .../framework/IAppVisibilityListener.aidl | 10 + .../framework/ICastConnectionController.aidl | 11 + .../gms/cast/framework/ICastContext.aidl | 20 + .../gms/cast/framework/ICastSession.aidl | 15 + .../cast/framework/ICastStateListener.aidl | 9 + .../gms/cast/framework/IDiscoveryManager.aidl | 12 + .../framework/IDiscoveryManagerListener.aidl | 8 + .../cast/framework/IReconnectionService.aidl | 8 + .../android/gms/cast/framework/ISession.aidl | 22 + .../gms/cast/framework/ISessionManager.aidl | 19 + .../framework/ISessionManagerListener.aidl | 17 + .../gms/cast/framework/ISessionProvider.aidl | 10 + .../gms/cast/framework/ISessionProxy.aidl | 14 + .../internal/ICastDynamiteModule.aidl | 24 + .../cast/framework/internal/IMediaRouter.aidl | 19 + .../internal/IMediaRouterCallback.aidl | 12 + .../framework/media/CastMediaOptions.aidl | 3 + .../cast/framework/media/IImagePicker.aidl | 11 + .../media/IMediaNotificationService.aidl | 5 + .../media/INotificationActionsProvider.aidl | 5 + .../framework/media/NotificationOptions.aidl | 3 + .../media/internal/IFetchBitmapTask.aidl | 5 + .../IFetchBitmapTaskProgressPublisher.aidl | 5 + .../gms/cast/framework/CastButtonFactory.java | 9 + .../gms/cast/framework/CastContext.java | 191 + .../gms/cast/framework/CastOptions.java | 124 + .../gms/cast/framework/CastSession.java | 9 + .../android/gms/cast/framework/CastState.java | 39 + .../gms/cast/framework/DiscoveryManager.java | 30 + .../framework/ModuleUnavailableException.java | 18 + .../gms/cast/framework/OptionsProvider.java | 40 + .../cast/framework/ReconnectionService.java | 68 + .../android/gms/cast/framework/Session.java | 9 + .../gms/cast/framework/SessionManager.java | 72 + .../gms/cast/framework/SessionProvider.java | 67 + .../framework/media/CastMediaOptions.java | 40 + .../framework/media/MediaIntentReceiver.java | 198 + .../media/MediaNotificationService.java | 19 + .../framework/media/NotificationOptions.java | 125 + .../microg/gms/cast/CastDynamiteModule.java | 47 + .../microg/gms/cast/CastSessionProvider.java | 31 + .../microg/gms/cast/ISessionProviderImpl.java | 41 + play-services-cast/build.gradle | 49 + play-services-cast/core/build.gradle | 61 + .../core/src/main/AndroidManifest.xml | 22 + .../media/CastMediaRouteProviderService.java | 33 + .../gms/cast/CastDeviceControllerImpl.java | 328 + .../gms/cast/CastDeviceControllerService.java | 50 + .../gms/cast/CastMediaRouteController.java | 93 + .../gms/cast/CastMediaRouteProvider.java | 359 + .../src/main/AndroidManifest.xml | 18 + .../android/gms/cast/ApplicationMetadata.aidl | 3 + .../android/gms/cast/ApplicationStatus.aidl | 3 + .../android/gms/cast/CastDeviceStatus.aidl | 3 + .../google/android/gms/cast/JoinOptions.aidl | 3 + .../android/gms/cast/LaunchOptions.aidl | 3 + .../google/android/gms/cast/RequestItem.aidl | 8 + .../gms/cast/internal/IBundleCallback.aidl | 10 + .../cast/internal/ICastDeviceController.aidl | 14 + .../ICastDeviceControllerListener.aidl | 21 + .../gms/cast/internal/ICastService.aidl | 18 + .../android/gms/cast/ApplicationMetadata.java | 85 + .../android/gms/cast/ApplicationStatus.java | 36 + .../com/google/android/gms/cast/Cast.java | 223 + .../google/android/gms/cast/CastDevice.java | 194 + .../android/gms/cast/CastDeviceStatus.java | 49 + .../gms/cast/CastMediaControlIntent.java | 145 + .../android/gms/cast/CastPresentation.java | 33 + .../android/gms/cast/CastRemoteDisplay.java | 76 + .../gms/cast/CastRemoteDisplayApi.java | 26 + .../cast/CastRemoteDisplayLocalService.java | 28 + .../android/gms/cast/CastStatusCodes.java | 38 + .../android/gms/cast/CredentialsData.java | 76 + .../google/android/gms/cast/JoinOptions.java | 29 + .../android/gms/cast/LaunchOptions.java | 104 + .../google/android/gms/cast/RequestItem.java | 22 + .../google/android/gms/cast/package-info.java | 11 + .../microg/gms/cast/CastApiClientBuilder.java | 35 + .../java/org/microg/gms/cast/CastApiImpl.java | 134 + .../org/microg/gms/cast/CastClientImpl.java | 30 + .../CastRemoteDisplayApiClientBuilder.java | 36 + .../gms/cast/CastRemoteDisplayApiImpl.java | 34 + play-services-chimera-core/build.gradle | 47 + .../src/main/AndroidManifest.xml | 8 + .../android/chimera/InstanceProvider.java | 10 + .../google/android/chimera/IntentService.java | 118 + .../com/google/android/chimera/Service.java | 131 + .../org/microg/gms/chimera/ServiceLoader.kt | 18 + .../org/microg/gms/chimera/ServiceProxy.kt | 134 + .../microg/gms/chimera/StaticServiceLoader.kt | 15 + play-services-clearcut/build.gradle | 43 + .../src/main/AndroidManifest.xml | 6 + .../gms/clearcut/LogEventParcelable.aidl | 3 + .../internal/IClearcutLoggerCallbacks.aidl | 13 + .../internal/IClearcutLoggerService.aidl | 14 + .../clearcut/internal/PlayLoggerContext.aidl | 3 + .../gms/playlog/internal/IPlayLogService.aidl | 10 + .../gms/playlog/internal/LogEvent.aidl | 3 + .../gms/clearcut/LogEventParcelable.java | 127 + .../internal/LogVerifierResultParcelable.java | 15 + .../clearcut/internal/PlayLoggerContext.java | 92 + .../gms/playlog/internal/LogEvent.java | 55 + .../build.gradle | 30 + .../src/main/AndroidManifest.xml | 9 + .../security/ProviderInstallerImpl.java | 59 + .../dynamite/ModuleDescriptor.java | 14 + .../ProviderInstallerImpl.java | 218 + play-services-core-proto/build.gradle | 35 + .../src/main/proto/apitoken.proto | 31 + .../src/main/proto/appcert.proto | 33 + .../src/main/proto/auth.proto | 99 + .../src/main/proto/checkin.proto | 205 + .../src/main/proto/controlsettings.proto | 26 + .../src/main/proto/cryptauth/LICENSE | 27 + ...auth_better_together_device_metadata.proto | 69 + ...uth_better_together_feature_metadata.proto | 37 + .../cryptauth_client_app_metadata.proto | 139 + .../proto/cryptauth/cryptauth_common.proto | 164 + .../cryptauth/cryptauth_devicesync.proto | 318 + .../proto/cryptauth/cryptauth_directive.proto | 113 + .../cryptauth/cryptauth_enrollment.proto | 298 + .../src/main/proto/deviceconfig.proto | 76 + .../src/main/proto/familymanagement.proto | 278 + .../src/main/proto/games.proto | 65 + .../src/main/proto/gnots.proto | 183 + .../src/main/proto/help.proto | 53 + .../locationsharingreporter/reporting.proto | 31 + .../user_location_frontend_service.proto | 212 + .../src/main/proto/mcs.proto | 270 + .../src/main/proto/potoken.proto | 63 + .../src/main/proto/registration.proto | 210 + .../src/main/proto/snapshot.proto | 126 + .../src/main/proto/uploaddeviceconfig.proto | 18 + play-services-core/build.gradle | 224 + .../microg-ui-tools/build.gradle | 46 + .../src/main/AndroidManifest.xml | 18 + .../tools/selfcheck/PermissionCheckGroup.java | 65 + .../tools/selfcheck/SelfCheckGroup.java | 41 + .../tools/ui/AbstractAboutFragment.java | 136 + .../tools/ui/AbstractDashboardActivity.java | 113 + .../tools/ui/AbstractSelfCheckFragment.java | 128 + .../tools/ui/AbstractSettingsActivity.java | 80 + .../tools/ui/AbstractSettingsFragment.java | 38 + .../java/org/microg/tools/ui/Condition.java | 338 + .../org/microg/tools/ui/DialogPreference.java | 114 + .../microg/tools/ui/LongTextPreference.java | 52 + .../tools/ui/RadioButtonPreference.java | 46 + .../tools/ui/ResourceSettingsFragment.java | 39 + .../java/org/microg/tools/ui/SwitchBar.java | 264 + .../ui/SwitchBarResourceSettingsFragment.java | 69 + .../org/microg/tools/ui/ToggleSwitch.java | 63 + .../res/drawable-v21/switchbar_background.xml | 6 + .../src/main/res/drawable/empty.xml | 18 + .../src/main/res/drawable/ic_expand_less.xml | 30 + .../src/main/res/drawable/ic_expand_more.xml | 30 + .../res/drawable/switchbar_background.xml | 20 + .../preference_category_dashboard.xml | 24 + .../res/layout-v21/preference_material.xml | 87 + .../src/main/res/layout/about_root.xml | 76 + .../src/main/res/layout/app_bar.xml | 50 + .../src/main/res/layout/condition_card.xml | 137 + .../main/res/layout/dashboard_activity.xml | 35 + .../layout/preference_widget_radiobutton.xml | 24 + .../src/main/res/layout/self_check.xml | 30 + .../src/main/res/layout/self_check_entry.xml | 58 + .../src/main/res/layout/self_check_group.xml | 40 + .../src/main/res/layout/settings_activity.xml | 47 + .../src/main/res/layout/switch_bar.xml | 43 + .../src/main/res/layout/toolbar.xml | 24 + .../src/main/res/values-be/strings.xml | 44 + .../src/main/res/values-cs/strings.xml | 44 + .../src/main/res/values-de/strings.xml | 44 + .../src/main/res/values-eo/strings.xml | 19 + .../src/main/res/values-es/strings.xml | 44 + .../src/main/res/values-fil/strings.xml | 45 + .../src/main/res/values-fr/strings.xml | 42 + .../src/main/res/values-it/strings.xml | 44 + .../src/main/res/values-ja/strings.xml | 44 + .../src/main/res/values-pl/strings.xml | 41 + .../src/main/res/values-pt-rBR/strings.xml | 45 + .../src/main/res/values-ro/strings.xml | 39 + .../src/main/res/values-ru/strings.xml | 45 + .../src/main/res/values-sr/strings.xml | 28 + .../src/main/res/values-tr/strings.xml | 44 + .../src/main/res/values-uk/strings.xml | 44 + .../src/main/res/values-vi/strings.xml | 29 + .../src/main/res/values-zh-rCN/strings.xml | 16 + .../src/main/res/values-zh-rTW/strings.xml | 44 + .../src/main/res/values/colors.xml | 24 + .../src/main/res/values/strings.xml | 45 + play-services-core/multidex-keep.pro | 12 + play-services-core/proguard-rules.pro | 1 + .../src/huawei/AndroidManifest.xml | 62 + .../src/huaweilh/AndroidManifest.xml | 62 + .../src/main/AndroidManifest.xml | 1331 ++ .../analytics/service/AnalyticsService.java | 32 + .../com/google/android/gms/auth/GetToken.java | 30 + .../android/gms/auth/TokenActivity.java | 54 + .../gms/chimera/DynamiteContextFactory.java | 103 + .../chimera/DynamiteModuleInitializer.java | 25 + .../chimera/container/DynamiteContext.java | 61 + .../chimera/container/DynamiteLoaderImpl.java | 104 + .../chimera/container/DynamiteModuleInfo.java | 61 + .../container/FilteredClassLoader.java | 56 + .../common/ui/SignInButtonCreatorImpl.java | 33 + .../firebase_database/ModuleDescriptor.java | 22 + .../googlecertificates/ModuleDescriptor.java | 22 + .../dynamite/ModuleDescriptor.java | 22 + .../gms/gcm/http/GoogleHttpService.java | 37 + .../plusone/PlusOneButtonCreatorImpl.java | 40 + .../android/gms/recovery/RecoveryService.java | 32 + .../SemanticLocationService.kt | 56 + .../dynamite/WalletDynamiteCreatorImpl.java | 20 + .../idl/IPersistentConnectionImpl.java | 124 + .../java/org/microg/gms/ads/GService.java | 39 + .../gms/auth/AccountContentProvider.java | 134 + .../gms/auth/AskPermissionActivity.java | 299 + .../java/org/microg/gms/auth/AuthManager.java | 367 + .../gms/auth/AuthManagerServiceImpl.java | 279 + .../gms/auth/login/AssistantActivity.java | 118 + .../microg/gms/auth/login/LoginActivity.java | 727 + .../loginservice/AccountAuthenticator.java | 199 + .../auth/loginservice/GoogleLoginService.java | 41 + .../java/org/microg/gms/car/CarService.java | 34 + .../org/microg/gms/checkin/CheckinClient.java | 158 + .../microg/gms/checkin/CheckinManager.java | 75 + .../microg/gms/checkin/CheckinService.java | 130 + .../microg/gms/checkin/TriggerReceiver.java | 75 + .../microg/gms/drive/api/DriveApiService.java | 38 + .../gms/drive/api/DriveServiceImpl.java | 318 + .../gms/feeds/SubscribedFeedsProvider.java | 56 + .../microg/gms/games/GamesStubService.java | 59 + .../org/microg/gms/games/UpgradeActivity.java | 73 + .../java/org/microg/gms/gcm/GcmDatabase.java | 317 + .../org/microg/gms/gcm/GcmLegacyData.java | 110 + .../java/org/microg/gms/gcm/McsConstants.java | 47 + .../org/microg/gms/gcm/McsInputStream.java | 186 + .../org/microg/gms/gcm/McsOutputStream.java | 140 + .../java/org/microg/gms/gcm/McsService.java | 833 + .../microg/gms/gcm/PushRegisterManager.java | 172 + .../org/microg/gms/gcm/RegisterRequest.java | 156 + .../org/microg/gms/gcm/RegisterResponse.java | 42 + .../java/org/microg/gms/gcm/SendReceiver.java | 44 + .../org/microg/gms/gcm/TriggerReceiver.java | 115 + .../microg/gms/gcm/UnregisterReceiver.java | 50 + .../microg/gms/gservices/DatabaseHelper.java | 103 + .../org/microg/gms/gservices/GServices.java | 73 + .../gms/gservices/GServicesProvider.java | 132 + .../microg/gms/icing/AppDataSearchImpl.java | 64 + .../gms/icing/GlobalSearchAdminImpl.java | 77 + .../org/microg/gms/icing/IndexService.java | 66 + .../icing/LightweightAppDataSearchImpl.java | 42 + .../gms/icing/LightweightIndexService.java | 38 + .../microg/gms/icing/SearchCorporaImpl.java | 79 + .../microg/gms/icing/SearchQueriesImpl.java | 44 + .../gms/location/LocationConstants.java | 33 + .../microg/gms/mdm/NetworkQualityService.java | 32 + .../microg/gms/people/ContactSyncService.java | 44 + .../org/microg/gms/people/DatabaseHelper.java | 128 + .../org/microg/gms/people/PeopleManager.java | 172 + .../org/microg/gms/people/PeopleService.java | 38 + .../microg/gms/people/PeopleServiceImpl.java | 165 + .../gms/phenotype/ConfigurationProvider.java | 66 + .../org/microg/gms/places/GeoDataService.java | 36 + .../gms/places/PlaceDetectionService.java | 37 + .../gms/places/PlaceDetectionServiceImpl.java | 34 + .../microg/gms/places/PlacesServiceImpl.java | 34 + .../microg/gms/playlog/PlayLogService.java | 40 + .../gms/playlog/PlayLogServiceImpl.java | 51 + .../microg/gms/plus/PlusOneButtonImpl.java | 27 + .../gms/reminders/RemindersService.java | 37 + .../gms/reminders/RemindersServiceImpl.java | 169 + .../microg/gms/settings/GmsFileProvider.kt | 69 + .../gms/settings/GoogleSettingsProvider.java | 54 + .../java/org/microg/gms/ui/AboutFragment.java | 63 + .../org/microg/gms/ui/AskPushPermission.java | 100 + .../java/org/microg/gms/ui/Conditions.java | 98 + .../org/microg/gms/ui/GoogleMoreFragment.java | 30 + .../gms/ui/LocationSettingsActivity.java | 22 + .../microg/gms/ui/MainSettingsActivity.java | 78 + .../microg/gms/ui/PlacePickerActivity.java | 255 + .../gms/ui/SafetyNetAdvancedFragment.java | 85 + .../org/microg/gms/ui/SelfCheckFragment.java | 149 + .../gms/ui/SettingsDashboardActivity.java | 39 + .../org/microg/gms/wallet/OwServiceImpl.java | 66 + .../org/microg/gms/wallet/PaymentService.java | 53 + .../microg/tools/AccountPickerActivity.java | 41 + .../selfcheck/InstalledPackagesChecks.java | 88 + .../selfcheck/RomSpoofSignatureChecks.java | 80 + .../microg/tools/selfcheck/SystemChecks.java | 61 + .../com/google/android/gms/ads/AdActivity.kt | 20 + .../google/android/gms/ads/omid/AdSession.kt | 7 + .../android/gms/ads/omid/DynamiteOmid.kt | 61 + .../gms/common/GoogleCertificatesImpl.kt | 96 + .../manager/PasswordManagerActivity.kt | 36 + .../family/v2/manage/DeleteMemberActivity.kt | 61 + .../gms/family/v2/manage/FamilyApiClient.kt | 162 + .../gms/family/v2/manage/FamilyExtensions.kt | 266 + .../v2/manage/FamilyManagementActivity.kt | 155 + .../manage/fragment/FamilyDeleteFragment.kt | 179 + .../fragment/FamilyManagementFragment.kt | 127 + .../manage/fragment/MemberDetailFragment.kt | 100 + .../family/v2/manage/model/FamilyViewModel.kt | 258 + .../gms/family/v2/manage/ui/DeleteUI.kt | 235 + .../gms/family/v2/manage/ui/FamilyUI.kt | 358 + .../gms/family/v2/manage/ui/ManagementUI.kt | 211 + .../android/gms/feedback/FeedbackActivity.kt | 21 + .../service/LocationShareIssue.kt | 24 + .../LocationSharingReporterApiService.kt | 279 + .../LocationSharingReporterExtensions.kt | 306 + .../service/LocationSharingUpdate.kt | 91 + .../service/RefreshPolicy.kt | 10 + .../service/ReportingRequestStoreFile.kt | 109 + .../settings/LocationShareConfirmActivity.kt | 34 + .../LocationSharingSettingsActivity.kt | 181 + .../android/gms/maps/auth/ApiTokenService.kt | 129 + .../internal/AppMeasurementDynamiteService.kt | 312 + .../SemanticLocationHistoryService.kt | 156 + .../consent/TermsOfServiceActivity.kt | 18 + .../accountaction/AccountActionActivity.kt | 125 + .../gms/accountaction/AccountNotification.kt | 109 + .../microg/gms/accountaction/ErrorResolver.kt | 184 + .../microg/gms/accountaction/Resolution.kt | 43 + .../UserInterventionComponents.kt | 183 + .../gms/accountsettings/ui/LoaderActivity.kt | 174 + .../gms/accountsettings/ui/MainActivity.kt | 338 + .../accountsettings/ui/PicturePickerUtils.kt | 115 + .../gms/accountsettings/ui/WebViewHelper.kt | 219 + .../ui/bridge/OcAdvertisingIdBridge.kt | 26 + .../ui/bridge/OcAndroidIdBridge.kt | 27 + .../ui/bridge/OcAppBarBridge.kt | 132 + .../ui/bridge/OcAppPermissionsBridge.kt | 38 + .../ui/bridge/OcClientInfoBridge.kt | 50 + .../ui/bridge/OcConsistencyBridge.kt | 33 + .../ui/bridge/OcContactsBridge.kt | 27 + .../ui/bridge/OcFido2Bridge.kt | 28 + .../ui/bridge/OcFidoU2fBridge.kt | 32 + .../ui/bridge/OcFilePickerBridge.kt | 121 + .../ui/bridge/OcFolsomBridge.kt | 23 + .../ui/bridge/OcPermissionsBridge.kt | 34 + .../ui/bridge/OcPlayProtectBridge.kt | 72 + .../ui/bridge/OcTelephonyBridge.kt | 68 + .../ui/bridge/OcTrustAgentBridge.kt | 72 + .../accountsettings/ui/bridge/OcUdcBridge.kt | 68 + .../accountsettings/ui/bridge/OcUiBridge.kt | 144 + .../gms/accountsettings/ui/extensions.kt | 86 + .../org/microg/gms/audit/AuditService.kt | 45 + .../gms/auth/AskPackageOverrideActivity.kt | 115 + .../auth/account/data/AccountDataService.kt | 52 + .../auth/account/data/GoogleAuthService.kt | 97 + .../microg/gms/auth/appcert/AppCertManager.kt | 195 + .../microg/gms/auth/appcert/AppCertService.kt | 43 + .../gms/auth/consent/ConsentSignInActivity.kt | 185 + .../credentials/CredentialPickerActivity.kt | 38 + .../auth/credentials/CredentialsService.kt | 74 + .../identity/AuthorizationService.kt | 122 + .../identity/IdentityFidoProxyActivity.kt | 64 + .../identity/IdentitySignInService.kt | 190 + .../gms/auth/folsom/KeyRetrievalService.kt | 197 + .../gms/auth/folsom/ui/GenericActivity.kt | 20 + .../gms/auth/login/DroidGuardHandler.kt | 24 + .../org/microg/gms/auth/login/FidoHandler.kt | 192 + .../microg/gms/auth/proxy/AuthProxyService.kt | 63 + .../gms/auth/signin/AssistedSignInActivity.kt | 169 + .../gms/auth/signin/AssistedSignInFragment.kt | 354 + .../gms/auth/signin/AuthSignInActivity.kt | 253 + .../gms/auth/signin/AuthSignInService.kt | 179 + .../auth/signin/SignInConfigurationService.kt | 180 + .../org/microg/gms/auth/signin/extensions.kt | 236 + .../gms/backup/BackupSettingsActivity.kt | 18 + .../microg/gms/checkin/CheckinPreferences.kt | 32 + .../org/microg/gms/checkin/ServiceInfo.kt | 42 + .../org/microg/gms/chimera/ServiceProvider.kt | 89 + .../gms/clearcut/ClearcutLoggerService.kt | 77 + .../gms/common/ClientTelemetryService.kt | 40 + .../credential/CredentialManagerService.kt | 102 + .../org/microg/gms/cryptauth/CryptAuthFlow.kt | 153 + .../microg/gms/cryptauth/CryptAuthRequests.kt | 138 + .../microg/gms/feedback/FeedbackService.kt | 89 + .../dynamiclinks/DynamicLinksService.kt | 133 + .../org/microg/gms/fonts/FontsProvider.kt | 97 + .../gms/games/FirstPartyGamesService.kt | 74 + .../microg/gms/games/GameProfileSettings.kt | 36 + .../gms/games/GamesConfigurationService.kt | 247 + .../microg/gms/games/GamesConnectService.kt | 125 + .../org/microg/gms/games/GamesService.kt | 796 + .../microg/gms/games/GamesSignInActivity.kt | 89 + .../achievements/AchievementResponseKt.kt | 194 + .../games/achievements/AchievementsAdapter.kt | 101 + .../achievements/AchievementsApiClient.kt | 94 + .../kotlin/org/microg/gms/games/extensions.kt | 443 + .../leaderboards/LeaderboardResponseKt.kt | 323 + .../leaderboards/LeaderboardScoresAdapter.kt | 95 + .../games/leaderboards/LeaderboardsAdapter.kt | 61 + .../leaderboards/LeaderboardsApiClient.kt | 120 + .../gms/games/snapshot/SnapshotResponseKt.kt | 110 + .../gms/games/snapshot/SnapshotsAdapter.kt | 96 + .../gms/games/snapshot/SnapshotsApiClient.kt | 208 + .../gms/games/snapshot/SnapshotsDataClient.kt | 287 + .../gms/games/ui/GameAccountChangeAdapter.kt | 48 + .../gms/games/ui/GameChangeAccountFragment.kt | 249 + .../gms/games/ui/GameDataDeleteAdapter.kt | 48 + .../games/ui/GameDeletePlayAccountFragment.kt | 250 + .../gms/games/ui/GamePlayDataActivity.kt | 88 + .../microg/gms/games/ui/GamesUiFragment.kt | 464 + .../microg/gms/games/ui/InGameUiActivity.kt | 50 + .../gms/games/utils/AccountPromptManager.kt | 137 + .../kotlin/org/microg/gms/gass/GassService.kt | 39 + .../org/microg/gms/gcm/GcmInGmsService.kt | 513 + .../kotlin/org/microg/gms/gcm/GcmPrefs.kt | 192 + .../org/microg/gms/gcm/PushRegisterService.kt | 377 + .../kotlin/org/microg/gms/gcm/ServiceInfo.kt | 85 + .../kotlin/org/microg/gms/gcm/extensions.kt | 47 + .../gms/gcm/registeration/ChimeGmsAccount.kt | 47 + .../ChimeGmsRegistrationHelper.kt | 178 + .../gms/googlehelp/GoogleHelpService.kt | 106 + .../ui/GoogleHelpRedirectActivity.kt | 127 + .../languageprofile/LanguageProfileService.kt | 83 + .../gms/measurement/MeasurementService.kt | 95 + .../gms/mlkit/BarcodeScanningActivity.kt | 91 + .../microg/gms/phenotype/PhenotypeService.kt | 212 + .../org/microg/gms/phenotype/extensions.kt | 19 + .../org/microg/gms/potokens/PoTokenHelper.kt | 255 + .../org/microg/gms/potokens/PoTokenStore.kt | 65 + .../microg/gms/potokens/PoTokensService.kt | 66 + .../org/microg/gms/potokens/extensions.kt | 59 + .../microg/gms/provision/ProvisionService.kt | 67 + .../gms/pseudonymous/PseudonymousIdService.kt | 52 + .../org/microg/gms/signin/SignInService.kt | 154 + .../microg/gms/udc/ActivityControlSettings.kt | 42 + .../org/microg/gms/udc/FacsCacheService.kt | 64 + .../org/microg/gms/ui/AccountsFragment.kt | 159 + .../gms/ui/DeviceRegistrationFragment.kt | 175 + .../org/microg/gms/ui/GameProfileFragment.kt | 96 + .../ui/PushNotificationAdvancedFragment.kt | 124 + .../gms/ui/PushNotificationAllAppsFragment.kt | 107 + .../gms/ui/PushNotificationAppFragment.kt | 140 + .../microg/gms/ui/PushNotificationFragment.kt | 160 + .../gms/ui/SafetyNetAdvancedFragment.kt | 12 + .../microg/gms/ui/SafetyNetAllAppsFragment.kt | 92 + .../org/microg/gms/ui/SafetyNetAppFragment.kt | 90 + .../org/microg/gms/ui/SafetyNetFragment.kt | 311 + ...NetRecentAttestationPreferencesFragment.kt | 89 + .../gms/ui/SafetyNetRecentDialogFragment.kt | 62 + ...tRecaptchaEnterprisePreferencesFragment.kt | 42 + ...tyNetRecentRecaptchaPreferencesFragment.kt | 42 + .../org/microg/gms/ui/SafetyNetUtils.kt | 139 + .../org/microg/gms/ui/SettingsFragment.kt | 147 + .../org/microg/gms/ui/VendingFragment.kt | 153 + .../gms/ui/VendingInstallSettingsFragment.kt | 85 + .../org/microg/gms/ui/WorkProfileFragment.kt | 58 + .../usagereporting/UsageReportingService.kt | 60 + .../microg/gms/vending/VendingPreferences.kt | 132 + .../gms/workprofile/WorkProfilePreferences.kt | 30 + .../color/material_switch_bar_text_color.xml | 9 + .../preference_material_switch_color.xml | 5 + .../microg_light_color_24.xml | 9 + .../src/main/res/drawable-hdpi/ic_gamepad.png | Bin 0 -> 2696 bytes .../main/res/drawable-hdpi/ic_generic_man.png | Bin 0 -> 2375 bytes .../src/main/res/drawable-hdpi/ic_magnify.png | Bin 0 -> 575 bytes .../src/main/res/drawable-mdpi/ic_gamepad.png | Bin 0 -> 1751 bytes .../main/res/drawable-mdpi/ic_generic_man.png | Bin 0 -> 1657 bytes .../src/main/res/drawable-mdpi/ic_magnify.png | Bin 0 -> 337 bytes .../res/drawable-v21/ic_app_foreground.xml | 47 + .../drawable-v21/ic_app_foreground_mono.xml | 56 + .../ic_app_settings_foreground.xml | 50 + .../ic_app_settings_foreground_mono.xml | 59 + .../drawable-v21/ic_app_settings_system.xml | 46 + .../material_switch_bar_background.xml | 14 + ...aterial_switch_bar_background_disabled.xml | 14 + .../main/res/drawable-xhdpi/ic_gamepad.png | Bin 0 -> 3654 bytes .../res/drawable-xhdpi/ic_generic_man.png | Bin 0 -> 3149 bytes .../main/res/drawable-xhdpi/ic_magnify.png | Bin 0 -> 581 bytes ...ry_auth_gls_ic_google_minitab_selected.png | Bin 0 -> 3053 bytes ...roprietary_auth_gls_ic_google_selected.png | Bin 0 -> 3922 bytes ...proprietary_auth_ic_scope_icon_default.png | Bin 0 -> 1228 bytes .../main/res/drawable-xxhdpi/ic_gamepad.png | Bin 0 -> 5805 bytes .../res/drawable-xxhdpi/ic_generic_man.png | Bin 0 -> 3607 bytes .../main/res/drawable-xxhdpi/ic_magnify.png | Bin 0 -> 930 bytes .../main/res/drawable-xxxhdpi/ic_magnify.png | Bin 0 -> 1147 bytes .../res/drawable/circle_shape_background.xml | 19 + .../src/main/res/drawable/dots_horizontal.xml | 18 + .../res/drawable/ic_achievement_locked.xml | 5 + .../main/res/drawable/ic_achievement_logo.xml | 28 + .../res/drawable/ic_achievement_unlocked.xml | 8 + .../src/main/res/drawable/ic_add.xml | 16 + .../src/main/res/drawable/ic_add_account.xml | 17 + .../main/res/drawable/ic_add_account_alt.xml | 11 + .../src/main/res/drawable/ic_arrow_back.xml | 10 + .../src/main/res/drawable/ic_arrow_close.xml | 10 + .../src/main/res/drawable/ic_arrow_right.xml | 10 + .../main/res/drawable/ic_bg_circle_gray.xml | 6 + .../src/main/res/drawable/ic_bg_prompt.xml | 15 + .../src/main/res/drawable/ic_certificate.xml | 19 + .../src/main/res/drawable/ic_check_list.xml | 17 + .../drawable/ic_choose_rounded_background.xml | 5 + .../src/main/res/drawable/ic_circle_check.xml | 16 + .../src/main/res/drawable/ic_circle_error.xml | 17 + .../main/res/drawable/ic_circle_pending.xml | 19 + .../src/main/res/drawable/ic_circle_warn.xml | 16 + .../src/main/res/drawable/ic_close_btn.xml | 11 + .../src/main/res/drawable/ic_cloud_bell.xml | 17 + .../src/main/res/drawable/ic_device_login.xml | 17 + .../src/main/res/drawable/ic_google_logo.xml | 19 + .../drawable/ic_leaderboard_placeholder.xml | 6 + .../src/main/res/drawable/ic_link.xml | 14 + .../main/res/drawable/ic_manage_accounts.xml | 22 + .../src/main/res/drawable/ic_map_marker.xml | 16 + .../src/main/res/drawable/ic_more_vert.xml | 10 + .../main/res/drawable/ic_plusone_medium.xml | 17 + .../main/res/drawable/ic_plusone_small.xml | 17 + .../main/res/drawable/ic_plusone_standard.xml | 17 + .../src/main/res/drawable/ic_plusone_tall.xml | 17 + .../src/main/res/drawable/ic_refresh.xml | 12 + .../src/main/res/drawable/ic_shop.xml | 17 + .../res/drawable/ic_snapshot_choose_fill.xml | 5 + .../drawable/ic_snapshot_choose_stroke.xml | 5 + .../drawable/ic_snapshot_load_error_image.xml | 32 + .../src/main/res/drawable/ic_work.xml | 9 + .../layout-v21/activity_barcode_scanning.xml | 30 + .../main/res/layout-w600dp/signin_picker.xml | 108 + .../res/layout/activity_consent_sign_in.xml | 18 + .../activity_location_sharing_settings.xml | 166 + .../src/main/res/layout/ask_gcm.xml | 53 + .../src/main/res/layout/ask_permission.xml | 135 + .../res/layout/ask_permission_list_entry.xml | 48 + .../assisted_signin_back_consent_layout.xml | 116 + .../layout/assisted_signin_choose_layout.xml | 71 + .../layout/assisted_signin_google_dialog.xml | 47 + .../res/layout/assisted_signin_hint_login.xml | 51 + .../layout/assisted_signin_loading_layout.xml | 79 + .../layout/assisted_signin_multi_layout.xml | 57 + ...ialog_game_account_change_confirmation.xml | 90 + ...ialog_game_account_delete_confirmation.xml | 64 + .../layout/fragment_game_change_account.xml | 80 + .../res/layout/fragment_game_delete_data.xml | 111 + .../res/layout/fragment_games_ui_layout.xml | 106 + .../src/main/res/layout/games_info.xml | 108 + .../layout/item_achievement_data_layout.xml | 53 + .../layout/item_achievement_header_layout.xml | 16 + .../res/layout/item_achievements_counter.xml | 25 + .../res/layout/item_game_account_data.xml | 46 + .../layout/item_game_account_radio_root.xml | 25 + .../layout/item_leaderboard_data_layout.xml | 35 + .../item_leaderboard_score_data_layout.xml | 56 + .../item_leaderboard_score_header_layout.xml | 25 + .../res/layout/item_snapshot_data_layout.xml | 99 + .../layout/item_view_game_account_prompt.xml | 43 + .../src/main/res/layout/login_assistant.xml | 98 + .../res/layout/login_assistant_loading.xml | 38 + .../src/main/res/layout/pick_place.xml | 133 + .../res/layout/preference_material_switch.xml | 10 + .../layout/preference_material_switch_bar.xml | 58 + .../layout/safety_net_advanced_fragment.xml | 17 + .../res/layout/safety_net_recent_card.xml | 70 + .../res/layout/safety_net_recent_fragment.xml | 24 + .../safety_net_recents_list_fragment.xml | 15 + .../res/layout/settings_root_activity.xml | 48 + .../main/res/layout/signin_account_row.xml | 56 + .../src/main/res/layout/signin_confirm.xml | 106 + .../src/main/res/layout/signin_picker.xml | 100 + .../src/main/res/menu/pick_place.xml | 28 + .../src/main/res/mipmap-anydpi-v26/ic_app.xml | 10 + .../res/mipmap-anydpi-v26/ic_app_settings.xml | 10 + .../src/main/res/mipmap-hdpi/ic_app.png | Bin 0 -> 4189 bytes .../main/res/mipmap-hdpi/ic_app_settings.png | Bin 0 -> 4338 bytes .../src/main/res/mipmap-mdpi/ic_app.png | Bin 0 -> 2612 bytes .../main/res/mipmap-mdpi/ic_app_settings.png | Bin 0 -> 2607 bytes .../src/main/res/mipmap-xhdpi/ic_app.png | Bin 0 -> 5970 bytes .../main/res/mipmap-xhdpi/ic_app_settings.png | Bin 0 -> 6164 bytes .../src/main/res/mipmap-xxhdpi/ic_app.png | Bin 0 -> 9369 bytes .../res/mipmap-xxhdpi/ic_app_settings.png | Bin 0 -> 9707 bytes .../src/main/res/mipmap-xxxhdpi/ic_app.png | Bin 0 -> 13415 bytes .../res/mipmap-xxxhdpi/ic_app_settings.png | Bin 0 -> 14025 bytes .../src/main/res/navigation/nav_settings.xml | 209 + .../src/main/res/values-ar/permissions.xml | 161 + .../src/main/res/values-ar/plurals.xml | 35 + .../src/main/res/values-ar/strings.xml | 187 + .../src/main/res/values-ast/permissions.xml | 59 + .../src/main/res/values-ast/plurals.xml | 19 + .../src/main/res/values-ast/strings.xml | 31 + .../src/main/res/values-az/permissions.xml | 23 + .../src/main/res/values-az/plurals.xml | 19 + .../src/main/res/values-az/strings.xml | 243 + .../src/main/res/values-be/permissions.xml | 173 + .../src/main/res/values-be/plurals.xml | 39 + .../src/main/res/values-be/strings.xml | 251 + .../src/main/res/values-cs/permissions.xml | 161 + .../src/main/res/values-cs/plurals.xml | 23 + .../src/main/res/values-cs/strings.xml | 365 + .../src/main/res/values-de/permissions.xml | 175 + .../src/main/res/values-de/plurals.xml | 33 + .../src/main/res/values-de/strings.xml | 365 + .../src/main/res/values-eo/permissions.xml | 19 + .../src/main/res/values-eo/plurals.xml | 19 + .../src/main/res/values-eo/strings.xml | 18 + .../src/main/res/values-es/permissions.xml | 175 + .../src/main/res/values-es/plurals.xml | 37 + .../src/main/res/values-es/strings.xml | 314 + .../src/main/res/values-fa/permissions.xml | 161 + .../src/main/res/values-fa/plurals.xml | 19 + .../src/main/res/values-fa/strings.xml | 338 + .../src/main/res/values-fi/permissions.xml | 4 + .../src/main/res/values-fi/plurals.xml | 2 + .../src/main/res/values-fi/strings.xml | 2 + .../src/main/res/values-fil/permissions.xml | 18 + .../src/main/res/values-fil/plurals.xml | 19 + .../src/main/res/values-fil/strings.xml | 345 + .../src/main/res/values-fr/permissions.xml | 175 + .../src/main/res/values-fr/plurals.xml | 37 + .../src/main/res/values-fr/strings.xml | 382 + .../src/main/res/values-ga/permissions.xml | 161 + .../src/main/res/values-ga/plurals.xml | 31 + .../src/main/res/values-ga/strings.xml | 365 + .../src/main/res/values-in/permissions.xml | 161 + .../src/main/res/values-in/plurals.xml | 15 + .../src/main/res/values-in/strings.xml | 352 + .../src/main/res/values-is/permissions.xml | 102 + .../src/main/res/values-is/plurals.xml | 19 + .../src/main/res/values-is/strings.xml | 254 + .../src/main/res/values-it/permissions.xml | 175 + .../src/main/res/values-it/plurals.xml | 37 + .../src/main/res/values-it/strings.xml | 356 + .../src/main/res/values-ja/permissions.xml | 104 + .../src/main/res/values-ja/plurals.xml | 35 + .../src/main/res/values-ja/strings.xml | 174 + .../src/main/res/values-ko/permissions.xml | 27 + .../src/main/res/values-ko/plurals.xml | 15 + .../src/main/res/values-ko/strings.xml | 167 + .../src/main/res/values-lv/permissions.xml | 2 + .../src/main/res/values-lv/plurals.xml | 2 + .../src/main/res/values-lv/strings.xml | 12 + .../src/main/res/values-lzh/permissions.xml | 2 + .../src/main/res/values-lzh/plurals.xml | 2 + .../src/main/res/values-lzh/strings.xml | 2 + .../src/main/res/values-ml/permissions.xml | 11 + .../src/main/res/values-ml/plurals.xml | 19 + .../src/main/res/values-ml/strings.xml | 12 + .../main/res/values-nb-rNO/permissions.xml | 78 + .../src/main/res/values-nb-rNO/plurals.xml | 19 + .../src/main/res/values-nb-rNO/strings.xml | 13 + .../src/main/res/values-night-v31/themes.xml | 4 + .../src/main/res/values-night-v8/themes.xml | 110 + .../src/main/res/values-nl/permissions.xml | 91 + .../src/main/res/values-nl/plurals.xml | 19 + .../src/main/res/values-nl/strings.xml | 266 + .../src/main/res/values-pl/permissions.xml | 175 + .../src/main/res/values-pl/plurals.xml | 43 + .../src/main/res/values-pl/strings.xml | 377 + .../main/res/values-pt-rBR/permissions.xml | 161 + .../src/main/res/values-pt-rBR/plurals.xml | 37 + .../src/main/res/values-pt-rBR/strings.xml | 372 + .../src/main/res/values-pt/permissions.xml | 161 + .../src/main/res/values-pt/plurals.xml | 23 + .../src/main/res/values-pt/strings.xml | 338 + .../src/main/res/values-ro/permissions.xml | 175 + .../src/main/res/values-ro/plurals.xml | 37 + .../src/main/res/values-ro/strings.xml | 377 + .../src/main/res/values-ru/permissions.xml | 175 + .../src/main/res/values-ru/plurals.xml | 39 + .../src/main/res/values-ru/strings.xml | 369 + .../src/main/res/values-sl/permissions.xml | 3 + .../src/main/res/values-sl/plurals.xml | 3 + .../src/main/res/values-sl/strings.xml | 3 + .../src/main/res/values-sr/permissions.xml | 175 + .../src/main/res/values-sr/plurals.xml | 37 + .../src/main/res/values-sr/strings.xml | 367 + .../src/main/res/values-sv/permissions.xml | 161 + .../src/main/res/values-sv/plurals.xml | 19 + .../src/main/res/values-sv/strings.xml | 365 + .../src/main/res/values-ta/permissions.xml | 161 + .../src/main/res/values-ta/plurals.xml | 19 + .../src/main/res/values-ta/strings.xml | 338 + .../src/main/res/values-th/permissions.xml | 161 + .../src/main/res/values-th/plurals.xml | 15 + .../src/main/res/values-th/strings.xml | 352 + .../src/main/res/values-tr/permissions.xml | 161 + .../src/main/res/values-tr/plurals.xml | 19 + .../src/main/res/values-tr/strings.xml | 331 + .../src/main/res/values-ug/permissions.xml | 161 + .../src/main/res/values-ug/plurals.xml | 19 + .../src/main/res/values-ug/strings.xml | 294 + .../src/main/res/values-uk/permissions.xml | 175 + .../src/main/res/values-uk/plurals.xml | 41 + .../src/main/res/values-uk/strings.xml | 378 + .../src/main/res/values-v23/themes.xml | 25 + .../main/res/values-v26/ic_app_background.xml | 4 + .../src/main/res/values-v27/themes.xml | 15 + .../src/main/res/values-v31/themes.xml | 4 + .../src/main/res/values-vi/permissions.xml | 161 + .../src/main/res/values-vi/plurals.xml | 15 + .../src/main/res/values-vi/strings.xml | 338 + .../main/res/values-zh-rCN/permissions.xml | 175 + .../src/main/res/values-zh-rCN/plurals.xml | 17 + .../src/main/res/values-zh-rCN/strings.xml | 398 + .../main/res/values-zh-rTW/permissions.xml | 175 + .../src/main/res/values-zh-rTW/plurals.xml | 29 + .../src/main/res/values-zh-rTW/strings.xml | 336 + .../src/main/res/values/arrays.xml | 58 + .../src/main/res/values/bools.xml | 20 + .../src/main/res/values/colors.xml | 74 + .../src/main/res/values/dimens.xml | 19 + .../src/main/res/values/permissions.xml | 181 + .../src/main/res/values/plurals.xml | 35 + .../src/main/res/values/strings.xml | 455 + .../src/main/res/values/themes.xml | 181 + .../src/main/res/xml/authenticator.xml | 23 + .../src/main/res/xml/contact_syncadapter.xml | 21 + .../src/main/res/xml/file_provider_paths.xml | 5 + .../main/res/xml/network_security_config.xml | 13 + .../src/main/res/xml/preferences_accounts.xml | 58 + .../src/main/res/xml/preferences_auth.xml | 39 + .../xml/preferences_device_registration.xml | 59 + .../main/res/xml/preferences_game_profile.xml | 43 + .../main/res/xml/preferences_gcm_advanced.xml | 64 + .../main/res/xml/preferences_google_more.xml | 32 + .../xml/preferences_push_notifications.xml | 46 + ...references_push_notifications_all_apps.xml | 41 + .../preferences_push_notifications_app.xml | 57 + .../main/res/xml/preferences_safetynet.xml | 61 + .../xml/preferences_safetynet_advanced.xml | 18 + .../xml/preferences_safetynet_all_apps.xml | 27 + .../res/xml/preferences_safetynet_app.xml | 25 + .../preferences_snet_recent_attestation.xml | 66 + .../xml/preferences_snet_recent_recaptcha.xml | 39 + .../src/main/res/xml/preferences_start.xml | 77 + .../src/main/res/xml/preferences_vending.xml | 83 + ...preferences_vending_installer_settings.xml | 36 + .../main/res/xml/preferences_work_profile.xml | 25 + .../src/main/res/xml/profile_bullhead_27.xml | 36 + .../res/xml/profile_lineage_falcon_25.xml | 36 + .../res/xml/profile_sdk_gphone64_arm64_33.xml | 37 + .../xml/profile_sdk_gphone64_x86_64_33.xml | 37 + play-services-cronet/core/build.gradle | 44 + .../core/src/main/AndroidManifest.xml | 10 + .../gms/cronet_dynamite/ModuleDescriptor.java | 37 + play-services-drive/build.gradle | 43 + .../src/main/AndroidManifest.xml | 6 + .../google/android/gms/drive/Contents.aidl | 8 + .../com/google/android/gms/drive/DriveId.aidl | 8 + .../internal/AddEventListenerRequest.aidl | 3 + .../drive/internal/AddPermissionRequest.aidl | 3 + .../internal/AuthorizeAccessRequest.aidl | 3 + .../internal/CancelPendingActionsRequest.aidl | 3 + .../ChangeResourceParentsRequest.aidl | 3 + .../drive/internal/ChangeSequenceNumber.aidl | 3 + .../gms/drive/internal/ChangesResponse.aidl | 3 + .../CheckResourceIdsExistRequest.aidl | 3 + ...CloseContentsAndUpdateMetadataRequest.aidl | 3 + .../drive/internal/CloseContentsRequest.aidl | 3 + .../gms/drive/internal/ContentsResponse.aidl | 3 + .../internal/ControlProgressRequest.aidl | 3 + .../drive/internal/CreateContentsRequest.aidl | 3 + .../CreateFileIntentSenderRequest.aidl | 3 + .../gms/drive/internal/CreateFileRequest.aidl | 3 + .../drive/internal/CreateFolderRequest.aidl | 3 + .../drive/internal/DeleteResourceRequest.aidl | 3 + .../DeviceUsagePreferenceResponse.aidl | 3 + .../gms/drive/internal/DisconnectRequest.aidl | 3 + .../internal/DownloadProgressResponse.aidl | 3 + .../gms/drive/internal/DriveIdResponse.aidl | 3 + .../internal/DrivePreferencesResponse.aidl | 3 + .../drive/internal/DriveServiceResponse.aidl | 3 + .../gms/drive/internal/EventResponse.aidl | 3 + .../drive/internal/FetchThumbnailRequest.aidl | 3 + .../internal/FetchThumbnailResponse.aidl | 3 + .../gms/drive/internal/GetChangesRequest.aidl | 3 + .../GetDriveIdFromUniqueIdRequest.aidl | 3 + .../drive/internal/GetMetadataRequest.aidl | 3 + .../drive/internal/GetPermissionsRequest.aidl | 3 + .../internal/GetPermissionsResponse.aidl | 3 + .../gms/drive/internal/IDriveService.aidl | 95 + .../internal/IDriveServiceCallbacks.aidl | 48 + .../gms/drive/internal/IEventCallback.aidl | 7 + .../gms/drive/internal/IRealtimeService.aidl | 5 + .../drive/internal/ListEntriesResponse.aidl | 3 + .../drive/internal/ListParentsRequest.aidl | 3 + .../drive/internal/ListParentsResponse.aidl | 3 + .../drive/internal/LoadRealtimeRequest.aidl | 3 + .../drive/internal/LoadRealtimeResponse.aidl | 3 + .../gms/drive/internal/MetadataResponse.aidl | 3 + .../drive/internal/OpenContentsRequest.aidl | 3 + .../internal/OpenFileIntentSenderRequest.aidl | 3 + .../internal/RealtimeDocumentSyncRequest.aidl | 3 + .../internal/RemoveEventListenerRequest.aidl | 3 + .../internal/RemovePermissionRequest.aidl | 3 + .../drive/internal/ResourceIdSetResponse.aidl | 3 + .../internal/SetDrivePreferencesRequest.aidl | 3 + .../SetFileUploadPreferencesRequest.aidl | 3 + .../internal/SetResourceParentsRequest.aidl | 3 + .../drive/internal/StartStreamSession.aidl | 3 + .../drive/internal/StreamContentsRequest.aidl | 3 + .../drive/internal/StringListResponse.aidl | 3 + .../gms/drive/internal/SyncMoreResponse.aidl | 3 + .../drive/internal/TrashResourceRequest.aidl | 3 + .../internal/UnsubscribeResourceRequest.aidl | 3 + .../internal/UntrashResourceRequest.aidl | 3 + .../drive/internal/UpdateMetadataRequest.aidl | 3 + .../internal/UpdatePermissionRequest.aidl | 3 + .../google/android/gms/drive/Contents.java | 81 + .../com/google/android/gms/drive/DriveId.java | 120 + .../internal/AddEventListenerRequest.java | 23 + .../drive/internal/AddPermissionRequest.java | 23 + .../internal/AuthorizeAccessRequest.java | 23 + .../internal/CancelPendingActionsRequest.java | 23 + .../ChangeResourceParentsRequest.java | 23 + .../drive/internal/ChangeSequenceNumber.java | 23 + .../gms/drive/internal/ChangesResponse.java | 23 + .../CheckResourceIdsExistRequest.java | 23 + ...CloseContentsAndUpdateMetadataRequest.java | 23 + .../drive/internal/CloseContentsRequest.java | 23 + .../gms/drive/internal/ContentsResponse.java | 23 + .../internal/ControlProgressRequest.java | 23 + .../drive/internal/CreateContentsRequest.java | 23 + .../CreateFileIntentSenderRequest.java | 23 + .../gms/drive/internal/CreateFileRequest.java | 23 + .../drive/internal/CreateFolderRequest.java | 23 + .../drive/internal/DeleteResourceRequest.java | 23 + .../DeviceUsagePreferenceResponse.java | 23 + .../gms/drive/internal/DisconnectRequest.java | 23 + .../internal/DownloadProgressResponse.java | 23 + .../gms/drive/internal/DriveIdResponse.java | 23 + .../internal/DrivePreferencesResponse.java | 23 + .../drive/internal/DriveServiceResponse.java | 23 + .../gms/drive/internal/EventResponse.java | 23 + .../drive/internal/FetchThumbnailRequest.java | 23 + .../internal/FetchThumbnailResponse.java | 23 + .../gms/drive/internal/GetChangesRequest.java | 23 + .../GetDriveIdFromUniqueIdRequest.java | 23 + .../drive/internal/GetMetadataRequest.java | 23 + .../drive/internal/GetPermissionsRequest.java | 23 + .../internal/GetPermissionsResponse.java | 23 + .../drive/internal/ListEntriesResponse.java | 23 + .../drive/internal/ListParentsRequest.java | 23 + .../drive/internal/ListParentsResponse.java | 23 + .../drive/internal/LoadRealtimeRequest.java | 23 + .../drive/internal/LoadRealtimeResponse.java | 23 + .../gms/drive/internal/MetadataResponse.java | 23 + .../drive/internal/OpenContentsRequest.java | 23 + .../internal/OpenFileIntentSenderRequest.java | 23 + .../internal/RealtimeDocumentSyncRequest.java | 23 + .../internal/RemoveEventListenerRequest.java | 23 + .../internal/RemovePermissionRequest.java | 23 + .../drive/internal/ResourceIdSetResponse.java | 23 + .../internal/SetDrivePreferencesRequest.java | 23 + .../SetFileUploadPreferencesRequest.java | 23 + .../internal/SetResourceParentsRequest.java | 23 + .../drive/internal/StartStreamSession.java | 23 + .../drive/internal/StreamContentsRequest.java | 23 + .../drive/internal/StringListResponse.java | 23 + .../gms/drive/internal/SyncMoreResponse.java | 23 + .../drive/internal/TrashResourceRequest.java | 23 + .../internal/UnsubscribeResourceRequest.java | 23 + .../internal/UntrashResourceRequest.java | 23 + .../drive/internal/UpdateMetadataRequest.java | 23 + .../internal/UpdatePermissionRequest.java | 23 + .../metadata/internal/MetadataBundle.java | 20 + play-services-droidguard/build.gradle | 49 + play-services-droidguard/core/build.gradle | 72 + .../core/src/main/AndroidManifest.xml | 27 + .../droidguard/DroidGuardChimeraService.java | 145 + .../tracing/wrapper/TracingIntentService.java | 57 + .../microg/gms/droidguard/GuardCallback.java | 80 + .../microg/gms/droidguard/MediaDrmLock.java | 10 + .../gms/droidguard/core/DgDatabaseHelper.kt | 71 + .../gms/droidguard/core/DgpDatabaseHelper.kt | 19 + .../droidguard/core/DroidGuardHandleImpl.kt | 118 + .../droidguard/core/DroidGuardPreferences.kt | 69 + .../gms/droidguard/core/DroidGuardService.kt | 11 + .../core/DroidGuardServiceBroker.kt | 26 + .../droidguard/core/DroidGuardServiceImpl.kt | 42 + .../gms/droidguard/core/FallbackCreator.kt | 33 + .../HardwareAttestationBlockingProvider.kt | 101 + .../core/NetworkHandleProxyFactory.kt | 177 + .../gms/droidguard/core/RemoteHandleImpl.kt | 62 + .../gms/droidguard/core/SignatureVerifier.kt | 31 + .../microg/gms/droidguard/core/VersionUtil.kt | 76 + .../core/ui/ContainedEditTextPreference.kt | 70 + .../core/ui/DroidGuardPreferencesFragment.kt | 66 + .../core/src/main/proto/droidguard.proto | 73 + .../res/layout/preference_edit_widget.xml | 20 + .../preference_material_with_widget_below.xml | 75 + .../core/src/main/res/values-ar/strings.xml | 8 + .../core/src/main/res/values-ast/strings.xml | 2 + .../core/src/main/res/values-az/strings.xml | 8 + .../core/src/main/res/values-be/strings.xml | 12 + .../core/src/main/res/values-cs/strings.xml | 10 + .../core/src/main/res/values-de/strings.xml | 10 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 8 + .../core/src/main/res/values-fa/strings.xml | 10 + .../core/src/main/res/values-fi/strings.xml | 2 + .../core/src/main/res/values-fil/strings.xml | 10 + .../core/src/main/res/values-fr/strings.xml | 10 + .../core/src/main/res/values-ga/strings.xml | 10 + .../core/src/main/res/values-in/strings.xml | 10 + .../core/src/main/res/values-is/strings.xml | 10 + .../core/src/main/res/values-it/strings.xml | 10 + .../core/src/main/res/values-ja/strings.xml | 8 + .../core/src/main/res/values-ko/strings.xml | 10 + .../core/src/main/res/values-lv/strings.xml | 2 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 10 + .../src/main/res/values-nb-rNO/strings.xml | 10 + .../core/src/main/res/values-nl/strings.xml | 2 + .../core/src/main/res/values-pl/strings.xml | 10 + .../src/main/res/values-pt-rBR/strings.xml | 10 + .../core/src/main/res/values-pt/strings.xml | 10 + .../core/src/main/res/values-ro/strings.xml | 10 + .../core/src/main/res/values-ru/strings.xml | 13 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 10 + .../core/src/main/res/values-sv/strings.xml | 10 + .../core/src/main/res/values-ta/strings.xml | 10 + .../core/src/main/res/values-th/strings.xml | 10 + .../core/src/main/res/values-tr/strings.xml | 10 + .../core/src/main/res/values-ug/strings.xml | 10 + .../core/src/main/res/values-uk/strings.xml | 10 + .../core/src/main/res/values-vi/strings.xml | 10 + .../src/main/res/values-zh-rCN/strings.xml | 10 + .../src/main/res/values-zh-rTW/strings.xml | 8 + .../core/src/main/res/values/strings.xml | 14 + .../main/res/xml/preferences_droidguard.xml | 27 + .../src/main/AndroidManifest.xml | 7 + .../internal/DroidGuardInitReply.aidl | 3 + .../internal/DroidGuardResultsRequest.aidl | 3 + .../internal/IDroidGuardCallbacks.aidl | 5 + .../internal/IDroidGuardHandle.aidl | 11 + .../internal/IDroidGuardService.aidl | 14 + .../android/gms/droidguard/DroidGuard.java | 19 + .../gms/droidguard/DroidGuardClient.java | 47 + .../gms/droidguard/DroidGuardHandle.java | 16 + .../internal/DroidGuardInitReply.java | 50 + .../internal/DroidGuardResultsRequest.java | 104 + .../gms/droidguard/DroidGuardApiClient.java | 109 + .../gms/droidguard/DroidGuardClientImpl.java | 63 + .../gms/droidguard/DroidGuardHandleImpl.java | 89 + .../java/org/microg/gms/droidguard/Utils.java | 18 + .../microg/gms/droidguard/BytesException.kt | 22 + .../org/microg/gms/droidguard/HandleProxy.kt | 53 + .../gms/droidguard/HandleProxyFactory.kt | 117 + play-services-fido/build.gradle | 43 + play-services-fido/core/build.gradle | 73 + .../core/src/main/AndroidManifest.xml | 48 + .../org/microg/gms/fido/core/Database.kt | 135 + .../microg/gms/fido/core/RequestHandling.kt | 260 + .../org/microg/gms/fido/core/features.kt | 21 + .../core/privileged/Fido2PrivilegedService.kt | 107 + .../protocol/AndroidKeyAttestationObject.kt | 30 + .../AndroidSafetyNetAttestationObject.kt | 19 + .../fido/core/protocol/AttestationObject.kt | 22 + .../core/protocol/AttestedCredentialData.kt | 39 + .../fido/core/protocol/AuthenticatorData.kt | 65 + .../org/microg/gms/fido/core/protocol/Cbor.kt | 115 + .../microg/gms/fido/core/protocol/CoseKey.kt | 50 + .../gms/fido/core/protocol/CredentialId.kt | 38 + .../core/protocol/FidoU2fAttestationObject.kt | 19 + .../core/protocol/NoneAttestationObject.kt | 15 + .../gms/fido/core/protocol/msgs/Apdu.kt | 36 + .../protocol/msgs/AuthenticatorClientPIN.kt | 66 + .../msgs/AuthenticatorGetAssertion.kt | 81 + .../protocol/msgs/AuthenticatorGetInfo.kt | 167 + .../msgs/AuthenticatorMakeCredential.kt | 76 + .../fido/core/protocol/msgs/Ctap1Command.kt | 37 + .../fido/core/protocol/msgs/Ctap2Command.kt | 33 + .../core/protocol/msgs/U2fAuthentication.kt | 47 + .../core/protocol/msgs/U2fRegistration.kt | 49 + .../gms/fido/core/regular/Fido2AppService.kt | 98 + .../gms/fido/core/transport/CtapConnection.kt | 46 + .../gms/fido/core/transport/Transport.kt | 13 + .../fido/core/transport/TransportHandler.kt | 542 + .../bluetooth/BluetoothTransportHandler.kt | 20 + .../core/transport/nfc/CtapNfcConnection.kt | 152 + .../core/transport/nfc/NfcTransportHandler.kt | 140 + .../screenlock/ScreenLockCredentialStore.kt | 111 + .../screenlock/ScreenLockTransportHandler.kt | 281 + .../usb/UsbDevicePermissionManager.kt | 84 + .../core/transport/usb/UsbTransportHandler.kt | 173 + .../usb/ctaphid/CtapHidConnection.kt | 201 + .../transport/usb/ctaphid/CtapHidMessage.kt | 70 + .../transport/usb/ctaphid/CtapHidPacket.kt | 80 + .../transport/usb/ctaphid/CtapHidRequest.kt | 53 + .../transport/usb/ctaphid/CtapHidResponse.kt | 164 + .../gms/fido/core/transport/usb/extensions.kt | 69 + .../gms/fido/core/ui/AuthenticatorActivity.kt | 365 + .../core/ui/AuthenticatorActivityFragment.kt | 38 + .../ui/AuthenticatorActivityFragmentData.kt | 45 + .../gms/fido/core/ui/NfcTransportFragment.kt | 72 + .../microg/gms/fido/core/ui/PinFragment.kt | 83 + .../fido/core/ui/SignInSelectionFragment.kt | 89 + .../core/ui/TransportSelectionFragment.kt | 38 + .../gms/fido/core/ui/UsbTransportFragment.kt | 83 + .../gms/fido/core/ui/WelcomeFragment.kt | 45 + .../fido_nfc_wait_connect.xml | 101 + .../fido_usb_wait_confirm.xml | 111 + .../fido_usb_wait_connect.xml | 68 + .../res/drawable/fido_nfc_wait_connect.xml | 43 + .../res/drawable/fido_usb_wait_confirm.xml | 57 + .../res/drawable/fido_usb_wait_connect.xml | 45 + .../main/res/drawable/ic_fido_bluetooth.xml | 16 + .../main/res/drawable/ic_fido_close_btn.xml | 15 + .../main/res/drawable/ic_fido_fingerprint.xml | 16 + .../src/main/res/drawable/ic_fido_key.xml | 16 + .../src/main/res/drawable/ic_fido_nfc.xml | 16 + .../src/main/res/drawable/ic_fido_usb.xml | 16 + .../layout/fido_authenticator_activity.xml | 11 + .../layout/fido_nfc_transport_fragment.xml | 108 + .../src/main/res/layout/fido_pin_fragment.xml | 86 + .../res/layout/fido_sign_in_item_layout.xml | 46 + .../fido_sign_in_selection_fragment.xml | 61 + .../fido_transport_selection_fragment.xml | 226 + .../layout/fido_usb_transport_fragment.xml | 148 + .../main/res/layout/fido_welcome_fragment.xml | 88 + .../res/navigation/nav_fido_authenticator.xml | 89 + .../core/src/main/res/values-ar/strings.xml | 28 + .../core/src/main/res/values-ast/strings.xml | 22 + .../core/src/main/res/values-az/strings.xml | 27 + .../core/src/main/res/values-be/strings.xml | 30 + .../core/src/main/res/values-cs/strings.xml | 28 + .../core/src/main/res/values-de/strings.xml | 28 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 28 + .../core/src/main/res/values-fa/strings.xml | 28 + .../core/src/main/res/values-fi/strings.xml | 2 + .../core/src/main/res/values-fil/strings.xml | 28 + .../core/src/main/res/values-fr/strings.xml | 28 + .../core/src/main/res/values-ga/strings.xml | 28 + .../core/src/main/res/values-in/strings.xml | 28 + .../core/src/main/res/values-is/strings.xml | 28 + .../core/src/main/res/values-it/strings.xml | 28 + .../core/src/main/res/values-ja/strings.xml | 21 + .../core/src/main/res/values-ko/strings.xml | 25 + .../core/src/main/res/values-lv/strings.xml | 2 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 28 + .../src/main/res/values-nb-rNO/strings.xml | 28 + .../core/src/main/res/values-nl/strings.xml | 2 + .../core/src/main/res/values-pl/strings.xml | 28 + .../src/main/res/values-pt-rBR/strings.xml | 28 + .../core/src/main/res/values-pt/strings.xml | 28 + .../core/src/main/res/values-ro/strings.xml | 28 + .../core/src/main/res/values-ru/strings.xml | 31 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 28 + .../core/src/main/res/values-sv/strings.xml | 28 + .../core/src/main/res/values-ta/strings.xml | 28 + .../core/src/main/res/values-th/strings.xml | 28 + .../core/src/main/res/values-tr/strings.xml | 28 + .../core/src/main/res/values-ug/strings.xml | 28 + .../core/src/main/res/values-uk/strings.xml | 28 + .../core/src/main/res/values-vi/strings.xml | 28 + .../src/main/res/values-zh-rCN/strings.xml | 34 + .../src/main/res/values-zh-rTW/strings.xml | 31 + .../core/src/main/res/values/strings.xml | 36 + .../src/main/AndroidManifest.xml | 6 + .../gms/fido/fido2/api/IBooleanCallback.aidl | 8 + .../fido2/api/ICredentialListCallback.aidl | 9 + ...serPublicKeyCredentialCreationOptions.aidl | 3 + ...wserPublicKeyCredentialRequestOptions.aidl | 3 + .../api/common/FidoCredentialDetails.aidl | 3 + .../PublicKeyCredentialCreationOptions.aidl | 3 + .../PublicKeyCredentialRequestOptions.aidl | 3 + .../privileged/IFido2PrivilegedCallbacks.aidl | 8 + .../privileged/IFido2PrivilegedService.aidl | 14 + .../internal/regular/IFido2AppCallbacks.aidl | 8 + .../internal/regular/IFido2AppService.aidl | 13 + .../com/google/android/gms/fido/Fido.java | 122 + .../android/gms/fido/common/Transport.java | 109 + .../gms/fido/fido2/Fido2ApiClient.java | 134 + .../gms/fido/fido2/Fido2PendingIntent.java | 37 + .../fido/fido2/Fido2PrivilegedApiClient.java | 171 + .../gms/fido/fido2/api/common/Algorithm.java | 20 + .../gms/fido/fido2/api/common/Attachment.java | 75 + .../AttestationConveyancePreference.java | 79 + .../api/common/AuthenticationExtensions.java | 240 + ...AuthenticationExtensionsClientOutputs.java | 195 + ...henticationExtensionsCredPropsOutputs.java | 55 + ...ationExtensionsDevicePublicKeyOutputs.java | 111 + .../AuthenticationExtensionsPrfOutputs.java | 70 + .../AuthenticatorAssertionResponse.java | 135 + .../AuthenticatorAttestationResponse.java | 125 + .../common/AuthenticatorErrorResponse.java | 123 + .../api/common/AuthenticatorResponse.java | 23 + .../AuthenticatorSelectionCriteria.java | 159 + ...serPublicKeyCredentialCreationOptions.java | 186 + ...wserPublicKeyCredentialRequestOptions.java | 186 + .../api/common/BrowserRequestOptions.java | 27 + .../api/common/COSEAlgorithmIdentifier.java | 84 + .../api/common/CableAuthenticationData.java | 34 + .../common/CableAuthenticationExtension.java | 28 + .../common/CredentialPropertiesOutput.java | 54 + .../api/common/DevicePublicKeyExtension.java | 45 + .../api/common/DevicePublicKeyStringDef.java | 30 + .../fido/fido2/api/common/EC2Algorithm.java | 57 + .../gms/fido/fido2/api/common/ErrorCode.java | 129 + .../fido2/api/common/FidoAppIdExtension.java | 70 + .../api/common/FidoCredentialDetails.java | 140 + .../common/GoogleMultiAssertionExtension.java | 39 + .../api/common/GoogleSessionIdExtension.java | 45 + .../GoogleSilentVerificationExtension.java | 45 + .../GoogleThirdPartyPaymentExtension.java | 45 + .../common/GoogleTunnelServerIdExtension.java | 47 + .../fido2/api/common/HmacSecretExtension.java | 70 + .../fido2/api/common/KeyProtectionTypes.java | 47 + .../api/common/MatcherProtectionTypes.java | 31 + .../fido2/api/common/PaymentExtension.java | 45 + .../fido/fido2/api/common/PrfExtension.java | 41 + .../fido2/api/common/PublicKeyCredential.java | 250 + .../PublicKeyCredentialCreationOptions.java | 341 + .../common/PublicKeyCredentialDescriptor.java | 127 + .../common/PublicKeyCredentialParameters.java | 108 + .../PublicKeyCredentialRequestOptions.java | 286 + .../common/PublicKeyCredentialRpEntity.java | 95 + .../api/common/PublicKeyCredentialType.java | 78 + .../common/PublicKeyCredentialUserEntity.java | 132 + .../fido/fido2/api/common/RSAAlgorithm.java | 64 + .../fido/fido2/api/common/RequestOptions.java | 40 + .../api/common/ResidentKeyRequirement.java | 86 + ...mpleTransactionAuthorizationExtension.java | 45 + .../fido/fido2/api/common/TokenBinding.java | 206 + .../UserVerificationMethodExtension.java | 66 + .../api/common/UserVerificationMethods.java | 74 + .../common/UserVerificationRequirement.java | 69 + .../gms/fido/fido2/api/common/UvmEntries.java | 99 + .../gms/fido/fido2/api/common/UvmEntry.java | 105 + .../SourceDirectTransferClient.java | 49 + .../SourceDirectTransferResult.java | 51 + .../SourceStartDirectTransferOptions.java | 52 + .../android/gms/fido/u2f/U2fApiClient.java | 67 + .../gms/fido/u2f/U2fPendingIntent.java | 39 + .../microg/gms/fido/fido2/Fido2GmsClient.java | 45 + .../fido/fido2/Fido2PendingIntentImpl.java | 31 + .../fido/fido2/Fido2PrivilegedGmsClient.java | 50 + play-services-fitness/.gitignore | 1 + play-services-fitness/build.gradle | 36 + play-services-fitness/core/build.gradle | 50 + .../core/src/main/AndroidManifest.xml | 47 + .../fitness/service/config/FitConfigBroker.kt | 56 + .../android/gms/fitness/service/extensions.kt | 15 + .../service/history/FitHistoryBroker.kt | 109 + .../service/recording/FitRecordingBroker.kt | 55 + .../service/sessions/FitSessionsBroker.kt | 64 + .../src/main/AndroidManifest.xml | 4 + .../fitness/internal/IDailyTotalCallback.aidl | 10 + .../internal/IDataPointChangesCallback.aidl | 10 + .../fitness/internal/IDataReadCallback.aidl | 12 + .../fitness/internal/IDataTypeCallback.aidl | 12 + .../fitness/internal/IDebugInfoCallback.aidl | 10 + .../fitness/internal/IFileUriCallback.aidl | 10 + .../fitness/internal/IGoogleFitConfigApi.aidl | 16 + .../internal/IGoogleFitHistoryApi.aidl | 39 + .../internal/IGoogleFitRecordingApi.aidl | 16 + .../internal/IGoogleFitSessionsApi.aidl | 21 + .../internal/IListSubscriptionsCallback.aidl | 12 + .../fitness/internal/IReadRawCallback.aidl | 10 + .../fitness/internal/IReadStatsCallback.aidl | 12 + .../internal/ISessionChangesCallback.aidl | 10 + .../internal/ISessionReadCallback.aidl | 11 + .../internal/ISessionStopCallback.aidl | 11 + .../gms/fitness/internal/IStatusCallback.aidl | 12 + .../fitness/internal/ISyncInfoCallback.aidl | 10 + .../fitness/request/DailyTotalRequest.aidl | 8 + .../fitness/request/DataDeleteRequest.aidl | 8 + .../fitness/request/DataInsertRequest.aidl | 8 + .../request/DataPointChangesRequest.aidl | 8 + .../gms/fitness/request/DataReadRequest.aidl | 8 + .../gms/fitness/request/DataReadResult.aidl | 8 + .../request/DataSourceQueryParams.aidl | 8 + .../request/DataTypeCreateRequest.aidl | 8 + ...DataUpdateListenerRegistrationRequest.aidl | 8 + ...taUpdateListenerUnregistrationRequest.aidl | 8 + .../fitness/request/DataUpdateRequest.aidl | 8 + .../gms/fitness/request/DebugInfoRequest.aidl | 8 + .../fitness/request/DisableFitRequest.aidl | 8 + .../fitness/request/GetFileUriRequest.aidl | 8 + .../fitness/request/GetSyncInfoRequest.aidl | 8 + .../request/ListSubscriptionsRequest.aidl | 8 + .../fitness/request/ReadDataTypeRequest.aidl | 8 + .../gms/fitness/request/ReadRawRequest.aidl | 8 + .../gms/fitness/request/ReadStatsRequest.aidl | 8 + .../request/SessionChangesRequest.aidl | 8 + .../fitness/request/SessionInsertRequest.aidl | 8 + .../fitness/request/SessionReadRequest.aidl | 8 + .../request/SessionRegistrationRequest.aidl | 8 + .../fitness/request/SessionStartRequest.aidl | 8 + .../fitness/request/SessionStopRequest.aidl | 8 + .../request/SessionUnregistrationRequest.aidl | 8 + .../gms/fitness/request/SubscribeRequest.aidl | 8 + .../fitness/request/UnsubscribeRequest.aidl | 8 + .../fitness/result/DataSourceStatsResult.aidl | 8 + .../gms/fitness/result/DataStatsResult.aidl | 8 + .../gms/fitness/result/DataTypeResult.aidl | 8 + .../result/ListSubscriptionsResult.aidl | 8 + .../gms/fitness/result/SessionReadResult.aidl | 8 + .../gms/fitness/result/SessionStopResult.aidl | 8 + .../android/gms/fitness/data/Application.java | 53 + .../android/gms/fitness/data/Bucket.java | 157 + .../android/gms/fitness/data/DataPoint.java | 394 + .../android/gms/fitness/data/DataSet.java | 211 + .../android/gms/fitness/data/DataSource.java | 284 + .../android/gms/fitness/data/DataType.java | 205 + .../android/gms/fitness/data/Device.java | 177 + .../android/gms/fitness/data/Field.java | 490 + .../android/gms/fitness/data/MapValue.java | 60 + .../android/gms/fitness/data/Session.java | 212 + .../gms/fitness/data/SessionDataSet.java | 37 + .../gms/fitness/data/Subscription.java | 44 + .../android/gms/fitness/data/Value.java | 270 + .../gms/fitness/data/package-info.java | 11 + .../android/gms/fitness/package-info.java | 11 + .../fitness/request/DailyTotalRequest.java | 34 + .../fitness/request/DataDeleteRequest.java | 70 + .../fitness/request/DataInsertRequest.java | 34 + .../request/DataPointChangesRequest.java | 33 + .../gms/fitness/request/DataReadRequest.java | 59 + .../gms/fitness/request/DataReadResult.java | 42 + .../request/DataSourceQueryParams.java | 37 + .../request/DataTypeCreateRequest.java | 35 + ...DataUpdateListenerRegistrationRequest.java | 38 + ...taUpdateListenerUnregistrationRequest.java | 32 + .../fitness/request/DataUpdateRequest.java | 36 + .../gms/fitness/request/DebugInfoRequest.java | 29 + .../fitness/request/DisableFitRequest.java | 29 + .../fitness/request/GetFileUriRequest.java | 29 + .../fitness/request/GetSyncInfoRequest.java | 30 + .../request/ListSubscriptionsRequest.java | 31 + .../fitness/request/ReadDataTypeRequest.java | 31 + .../gms/fitness/request/ReadRawRequest.java | 33 + .../gms/fitness/request/ReadStatsRequest.java | 36 + .../request/SessionChangesRequest.java | 33 + .../fitness/request/SessionInsertRequest.java | 42 + .../fitness/request/SessionReadRequest.java | 54 + .../request/SessionRegistrationRequest.java | 32 + .../fitness/request/SessionStartRequest.java | 32 + .../fitness/request/SessionStopRequest.java | 33 + .../request/SessionUnregistrationRequest.java | 31 + .../gms/fitness/request/SubscribeRequest.java | 33 + .../fitness/request/UnsubscribeRequest.java | 34 + .../gms/fitness/request/package-info.java | 11 + .../fitness/result/DataSourceStatsResult.java | 40 + .../gms/fitness/result/DataStatsResult.java | 51 + .../gms/fitness/result/DataTypeResult.java | 76 + .../result/ListSubscriptionsResult.java | 40 + .../gms/fitness/result/SessionReadResult.java | 133 + .../gms/fitness/result/SessionStopResult.java | 74 + .../gms/fitness/result/package-info.java | 11 + .../gms/fitness/service/package-info.java | 11 + play-services-games/build.gradle | 44 + .../src/main/AndroidManifest.xml | 6 + .../android/gms/games/PlayerEntity.aidl | 3 + .../gms/games/client/IPlayGamesCallbacks.aidl | 9 + .../gms/games/client/IPlayGamesService.aidl | 14 + .../client/PlayGamesConsistencyTokens.aidl | 3 + .../gms/games/internal/IGamesCallbacks.aidl | 52 + .../gms/games/internal/IGamesClient.aidl | 4 + .../gms/games/internal/IGamesService.aidl | 120 + .../internal/connect/GamesSignInRequest.aidl | 3 + .../internal/connect/GamesSignInResponse.aidl | 3 + .../connect/IGamesConnectCallbacks.aidl | 8 + .../connect/IGamesConnectService.aidl | 8 + .../multiplayer/realtime/RealTimeMessage.aidl | 3 + .../SnapshotMetadataChangeEntity.aidl | 8 + .../snapshot/SnapshotMetadataEntity.aidl | 8 + .../android/gms/games/AnnotatedData.java | 40 + .../android/gms/games/CurrentPlayerInfo.java | 23 + .../gms/games/CurrentPlayerInfoEntity.java | 46 + .../com/google/android/gms/games/Game.java | 169 + .../google/android/gms/games/GameColumns.java | 45 + .../google/android/gms/games/GameEntity.java | 382 + .../android/gms/games/GamesStatusCodes.java | 89 + .../com/google/android/gms/games/Player.java | 202 + .../android/gms/games/PlayerBuffer.java | 28 + .../android/gms/games/PlayerColumns.java | 80 + .../android/gms/games/PlayerEntity.java | 276 + .../google/android/gms/games/PlayerLevel.java | 73 + .../android/gms/games/PlayerLevelInfo.java | 87 + .../google/android/gms/games/PlayerRef.java | 133 + .../gms/games/PlayerRelationshipInfo.java | 24 + .../games/PlayerRelationshipInfoEntity.java | 67 + .../com/google/android/gms/games/Players.java | 18 + .../android/gms/games/PlayersClient.java | 68 + .../gms/games/achievement/package-info.java | 11 + .../client/PlayGamesConsistencyTokens.java | 53 + .../internal/connect/GamesSignInRequest.java | 28 + .../internal/connect/GamesSignInResponse.java | 14 + .../connect/SignInResolutionResult.java | 24 + .../internal/player/MostRecentGameInfo.java | 24 + .../player/MostRecentGameInfoEntity.java | 82 + .../gms/games/leaderboard/package-info.java | 11 + .../multiplayer/realtime/RealTimeMessage.java | 65 + .../android/gms/games/package-info.java | 11 + .../gms/games/snapshot/SnapshotColumns.java | 34 + .../gms/games/snapshot/SnapshotMetadata.java | 144 + .../snapshot/SnapshotMetadataChange.java | 41 + .../SnapshotMetadataChangeEntity.java | 116 + .../snapshot/SnapshotMetadataEntity.java | 265 + .../gms/games/snapshot/package-info.java | 11 + play-services-gcm/build.gradle | 35 + .../src/main/AndroidManifest.xml | 26 + .../android/gms/gcm/GcmListenerService.java | 194 + .../android/gms/gcm/GcmNetworkManager.java | 244 + .../com/google/android/gms/gcm/GcmPubSub.java | 121 + .../google/android/gms/gcm/GcmReceiver.java | 127 + .../android/gms/gcm/GcmTaskService.java | 149 + .../android/gms/gcm/GoogleCloudMessaging.java | 319 + .../google/android/gms/gcm/OneoffTask.java | 221 + .../android/gms/gcm/PendingCallback.java | 59 + .../google/android/gms/gcm/PeriodicTask.java | 235 + .../java/com/google/android/gms/gcm/Task.java | 271 + .../google/android/gms/gcm/TaskParams.java | 49 + .../org/microg/gms/gcm/CloudMessagingRpc.java | 165 + play-services-gmscompliance/build.gradle | 40 + play-services-gmscompliance/core/build.gradle | 60 + .../core/src/main/AndroidManifest.xml | 16 + .../GmsDeviceComplianceService.kt | 47 + .../src/main/AndroidManifest.xml | 7 + .../GmsDeviceComplianceResponse.aidl | 3 + .../IGmsDeviceComplianceService.aidl | 8 + .../IGmsDeviceComplianceServiceCallback.aidl | 8 + .../GmsDeviceComplianceResponse.java | 21 + play-services-iid/build.gradle | 38 + .../src/main/AndroidManifest.xml | 12 + .../android/gms/iid/IMessengerCompat.aidl | 7 + .../google/android/gms/iid/InstanceID.java | 282 + .../gms/iid/InstanceIDListenerService.java | 139 + .../android/gms/iid/MessengerCompat.java | 105 + .../org/microg/gms/iid/InstanceIdRpc.java | 423 + .../org/microg/gms/iid/InstanceIdStore.java | 127 + play-services-location/build.gradle | 43 + play-services-location/core/base/build.gradle | 51 + .../core/base/src/main/AndroidManifest.xml | 6 + .../microg/gms/location/LocationSettings.kt | 102 + .../org/microg/gms/location/extensions.kt | 89 + .../gms/location/network/OnlineSource.kt | 98 + play-services-location/core/build.gradle | 84 + .../core/provider/build.gradle | 58 + .../provider/src/main/AndroidManifest.xml | 88 + .../network/DatabaseExportFileProvider.kt | 23 + .../gms/location/network/LocationDatabase.kt | 674 + .../gms/location/network/NetworkDetails.kt | 11 + .../network/NetworkLocationRequest.kt | 34 + .../network/NetworkLocationService.kt | 619 + .../gms/location/network/cell/CellDetails.kt | 31 + .../network/cell/CellDetailsCallback.kt | 10 + .../network/cell/CellDetailsSource.kt | 74 + .../gms/location/network/cell/extensions.kt | 159 + .../microg/gms/location/network/extensions.kt | 39 + .../network/ichnaea/BluetoothBeacon.kt | 25 + .../gms/location/network/ichnaea/CellTower.kt | 45 + .../gms/location/network/ichnaea/Fallback.kt | 20 + .../network/ichnaea/GeolocateRequest.kt | 36 + .../network/ichnaea/GeolocateResponse.kt | 17 + .../location/network/ichnaea/GeosubmitItem.kt | 20 + .../network/ichnaea/GeosubmitPosition.kt | 49 + .../network/ichnaea/GeosubmitRequest.kt | 10 + .../network/ichnaea/GeosubmitSource.kt | 14 + .../network/ichnaea/IchnaeaServiceClient.kt | 241 + .../gms/location/network/ichnaea/RadioType.kt | 14 + .../network/ichnaea/RawGeolocateEntry.kt | 20 + .../location/network/ichnaea/ResponseError.kt | 11 + .../network/ichnaea/ResponseLocation.kt | 16 + .../network/ichnaea/ServiceException.kt | 8 + .../network/ichnaea/WifiAccessPoint.kt | 41 + .../location/network/ichnaea/extensions.kt | 260 + .../location/network/wifi/MovingWifiHelper.kt | 515 + .../gms/location/network/wifi/WifiDetails.kt | 18 + .../network/wifi/WifiDetailsCallback.kt | 11 + .../network/wifi/WifiDetailsSource.kt | 22 + .../network/wifi/WifiManagerSource.kt | 41 + .../network/wifi/WifiScannerSource.kt | 59 + .../gms/location/network/wifi/extensions.kt | 96 + .../AbstractLocationProviderPreTiramisu.kt | 70 + .../provider/FusedLocationProviderService.kt | 78 + .../provider/GenericLocationProvider.kt | 18 + .../provider/GeocodeProviderService.kt | 29 + .../IntentLocationProviderPreTiramisu.kt | 124 + .../provider/IntentLocationProviderService.kt | 91 + .../NetworkLocationProviderService.kt | 74 + .../OpenStreetMapNominatimGeocodeProvider.kt | 188 + .../gms/location/provider/extensions.kt | 28 + .../main/res/xml/location_exported_files.xml | 7 + .../core/src/huawei/AndroidManifest.xml | 34 + .../AskPermissionNotificationActivity.kt | 270 + .../res/drawable-zh/permission_step_1.jpg | Bin 0 -> 38513 bytes .../res/drawable-zh/permission_step_2.jpg | Bin 0 -> 55318 bytes .../core/src/huawei/res/drawable/arrow.png | Bin 0 -> 297 bytes .../core/src/huawei/res/drawable/ic_app.png | Bin 0 -> 8784 bytes .../drawable/ic_permission_notification.xml | 5 + .../huawei/res/drawable/permission_step_1.jpg | Bin 0 -> 41041 bytes .../huawei/res/drawable/permission_step_2.jpg | Bin 0 -> 57346 bytes .../layout/extended_permission_request.xml | 113 + .../src/huawei/res/values-zh-rCN/strings.xml | 23 + .../core/src/huawei/res/values/strings.xml | 27 + .../core/src/main/AndroidManifest.xml | 88 + .../LocationHistorySettingsActivity.kt | 26 + .../AbstractLocationManagerInstance.kt | 268 + .../location/manager/AskPermissionActivity.kt | 147 + .../manager/DeviceOrientationManager.kt | 345 + .../location/manager/LastLocationCapsule.kt | 162 + .../location/manager/LocationAppsDatabase.kt | 131 + .../gms/location/manager/LocationManager.kt | 394 + .../manager/LocationManagerInstance.kt | 420 + .../manager/LocationManagerService.kt | 66 + .../location/manager/LocationPostProcessor.kt | 147 + .../manager/LocationRequestManager.kt | 491 + .../microg/gms/location/manager/extensions.kt | 234 + .../reporting/ReportingAndroidService.kt | 28 + .../reporting/ReportingServiceInstance.kt | 71 + .../gms/location/reporting/extensions.kt | 8 + .../DetailedLocationSettingsStates.kt | 72 + .../GoogleLocationSettingsActivity.kt | 19 + .../LocationSettingsCheckerActivity.kt | 229 + .../ui/ConfigurationRequiredReceiver.kt | 49 + .../location/ui/LocationAllAppsFragment.kt | 86 + .../gms/location/ui/LocationAppFragment.kt | 132 + .../gms/location/ui/LocationMapPreference.kt | 110 + .../ui/LocationPreferencesFragment.kt | 384 + .../org/microg/gms/location/ui/extensions.kt | 9 + .../core/src/main/res/drawable/ic_gps.xml | 16 + .../src/main/res/drawable/ic_location.xml | 16 + .../res/layout/location_settings_dialog.xml | 68 + .../layout/location_settings_dialog_item.xml | 25 + .../res/layout/preference_full_container.xml | 12 + .../layout/preference_location_custom_url.xml | 45 + .../preference_location_online_source.xml | 84 + .../src/main/res/navigation/nav_location.xml | 44 + .../core/src/main/res/values-ar/strings.xml | 48 + .../core/src/main/res/values-ast/strings.xml | 18 + .../core/src/main/res/values-az/strings.xml | 32 + .../core/src/main/res/values-be/strings.xml | 47 + .../core/src/main/res/values-cs/strings.xml | 48 + .../core/src/main/res/values-de/strings.xml | 48 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 48 + .../core/src/main/res/values-fa/strings.xml | 48 + .../core/src/main/res/values-fi/strings.xml | 7 + .../core/src/main/res/values-fil/strings.xml | 48 + .../core/src/main/res/values-fr/strings.xml | 48 + .../core/src/main/res/values-ga/strings.xml | 48 + .../core/src/main/res/values-in/strings.xml | 48 + .../core/src/main/res/values-is/strings.xml | 48 + .../core/src/main/res/values-it/strings.xml | 48 + .../core/src/main/res/values-ja/strings.xml | 19 + .../core/src/main/res/values-ko/strings.xml | 24 + .../core/src/main/res/values-lv/strings.xml | 2 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 12 + .../src/main/res/values-nb-rNO/strings.xml | 48 + .../core/src/main/res/values-nl/strings.xml | 16 + .../core/src/main/res/values-pl/strings.xml | 48 + .../src/main/res/values-pt-rBR/strings.xml | 48 + .../core/src/main/res/values-pt/strings.xml | 48 + .../core/src/main/res/values-ro/strings.xml | 48 + .../core/src/main/res/values-ru/strings.xml | 48 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 48 + .../core/src/main/res/values-sv/strings.xml | 48 + .../core/src/main/res/values-ta/strings.xml | 48 + .../core/src/main/res/values-th/strings.xml | 48 + .../core/src/main/res/values-tr/strings.xml | 48 + .../core/src/main/res/values-ug/strings.xml | 48 + .../core/src/main/res/values-uk/strings.xml | 48 + .../core/src/main/res/values-vi/strings.xml | 48 + .../src/main/res/values-zh-rCN/strings.xml | 48 + .../src/main/res/values-zh-rTW/strings.xml | 48 + .../core/src/main/res/values/strings.xml | 60 + .../src/main/res/xml/preferences_location.xml | 85 + .../res/xml/preferences_location_all_apps.xml | 19 + .../xml/preferences_location_app_details.xml | 37 + .../core/system-api/build.gradle | 23 + .../system-api/src/main/AndroidManifest.xml | 6 + .../java/android/location/GeocoderParams.java | 84 + .../main/java/android/location/Geofence.java | 172 + .../main/java/android/location/Location.java | 555 + .../android/location/LocationManager.java | 1052 ++ .../android/location/LocationRequest.java | 473 + .../java/android/net/wifi/WifiScanner.java | 1812 ++ .../internal/location/ProviderProperties.java | 124 + .../internal/location/ProviderRequest.java | 62 + .../location/provider/GeocodeProvider.java | 54 + .../location/provider/LocationProvider.java | 232 + .../provider/LocationProviderBase.java | 276 + .../provider/LocationRequestUnbundled.java | 107 + .../provider/ProviderPropertiesUnbundled.java | 29 + .../provider/ProviderRequestUnbundled.java | 103 + .../src/main/AndroidManifest.xml | 18 + .../location/ActivityRecognitionRequest.aidl | 3 + .../location/ActivityRecognitionResult.aidl | 3 + .../location/ActivityTransitionRequest.aidl | 3 + .../gms/location/CurrentLocationRequest.aidl | 3 + .../gms/location/DeviceOrientation.aidl | 3 + .../gms/location/GeofencingRequest.aidl | 3 + .../android/gms/location/GestureRequest.aidl | 3 + .../location/IDeviceOrientationListener.aidl | 7 + .../gms/location/ILocationCallback.aidl | 12 + .../gms/location/ILocationListener.aidl | 8 + .../gms/location/LastLocationRequest.aidl | 3 + .../gms/location/LocationAvailability.aidl | 3 + .../location/LocationAvailabilityRequest.aidl | 3 + .../android/gms/location/LocationRequest.aidl | 3 + .../android/gms/location/LocationResult.aidl | 3 + .../gms/location/LocationSettingsRequest.aidl | 3 + .../gms/location/LocationSettingsResult.aidl | 3 + .../android/gms/location/LocationStatus.aidl | 3 + .../gms/location/SleepSegmentRequest.aidl | 3 + .../DeviceOrientationRequestUpdateData.aidl | 3 + .../internal/FusedLocationProviderResult.aidl | 3 + .../internal/IBooleanStatusCallback.aidl | 7 + .../IFusedLocationProviderCallback.aidl | 8 + .../internal/IGeofencerCallbacks.aidl | 9 + .../IGoogleLocationManagerService.aidl | 158 + .../ILocationAvailabilityStatusCallback.aidl | 8 + .../internal/ILocationStatusCallback.aidl | 8 + .../location/internal/ISettingsCallbacks.aidl | 7 + .../location/internal/LocationReceiver.aidl | 3 + .../internal/LocationRequestInternal.aidl | 3 + .../internal/LocationRequestUpdateData.aidl | 3 + .../location/internal/ParcelableGeofence.aidl | 3 + .../internal/RemoveGeofencingRequest.aidl | 3 + .../SetGoogleLocationAccuracyRequest.aidl | 8 + .../gms/location/reporting/OptInRequest.aidl | 3 + .../location/reporting/ReportingState.aidl | 3 + .../location/reporting/SendDataRequest.aidl | 3 + .../reporting/UlrPrivateModeRequest.aidl | 3 + .../gms/location/reporting/UploadRequest.aidl | 3 + .../reporting/UploadRequestResult.aidl | 3 + .../reporting/internal/IReportingService.aidl | 21 + .../gms/location/ActivityRecognition.java | 57 + .../gms/location/ActivityRecognitionApi.java | 109 + .../location/ActivityRecognitionClient.java | 107 + .../location/ActivityRecognitionRequest.java | 40 + .../location/ActivityRecognitionResult.java | 173 + .../gms/location/ActivityTransition.java | 122 + .../gms/location/ActivityTransitionEvent.java | 91 + .../location/ActivityTransitionRequest.java | 107 + .../location/ActivityTransitionResult.java | 91 + .../gms/location/CurrentLocationRequest.java | 269 + .../gms/location/DetectedActivity.java | 147 + .../gms/location/DeviceOrientation.java | 136 + .../location/DeviceOrientationRequest.java | 45 + .../location/FusedLocationProviderApi.java | 268 + .../location/FusedLocationProviderClient.java | 296 + .../google/android/gms/location/Geofence.java | 229 + .../gms/location/GeofenceStatusCodes.java | 64 + .../android/gms/location/GeofencingApi.java | 58 + .../gms/location/GeofencingClient.java | 41 + .../android/gms/location/GeofencingEvent.java | 133 + .../gms/location/GeofencingRequest.java | 163 + .../android/gms/location/GestureRequest.java | 25 + .../android/gms/location/Granularity.java | 43 + .../gms/location/LastLocationRequest.java | 163 + .../gms/location/LocationAvailability.java | 134 + .../location/LocationAvailabilityRequest.java | 21 + .../gms/location/LocationCallback.java | 44 + .../android/gms/location/LocationClient.java | 105 + .../gms/location/LocationListener.java | 35 + .../android/gms/location/LocationRequest.java | 853 + .../android/gms/location/LocationResult.java | 121 + .../gms/location/LocationServices.java | 111 + .../LocationSettingsConfiguration.java | 21 + .../gms/location/LocationSettingsRequest.java | 135 + .../location/LocationSettingsResponse.java | 41 + .../gms/location/LocationSettingsResult.java | 86 + .../gms/location/LocationSettingsStates.java | 138 + .../location/LocationSettingsStatusCodes.java | 43 + .../android/gms/location/LocationStatus.java | 94 + .../gms/location/LocationStatusCodes.java | 41 + .../gms/location/NetworkLocationStatus.java | 33 + .../google/android/gms/location/Priority.java | 49 + .../android/gms/location/SettingsApi.java | 36 + .../android/gms/location/SettingsClient.java | 44 + .../gms/location/SleepClassifyEvent.java | 77 + .../gms/location/SleepSegmentEvent.java | 36 + .../gms/location/SleepSegmentRequest.java | 72 + .../gms/location/ThrottleBehavior.java | 24 + .../gms/location/internal/ClientIdentity.java | 76 + .../DeviceOrientationRequestInternal.java | 38 + .../DeviceOrientationRequestUpdateData.java | 41 + .../internal/FusedLocationProviderResult.java | 42 + .../location/internal/LocationReceiver.java | 112 + .../internal/LocationRequestInternal.java | 132 + .../internal/LocationRequestUpdateData.java | 60 + .../location/internal/ParcelableGeofence.java | 104 + .../internal/RemoveGeofencingRequest.java | 50 + .../SetGoogleLocationAccuracyRequest.java | 53 + .../gms/location/reporting/OptInRequest.java | 21 + .../location/reporting/ReportingState.java | 34 + .../location/reporting/SendDataRequest.java | 17 + .../reporting/UlrPrivateModeRequest.java | 17 + .../gms/location/reporting/UploadRequest.java | 41 + .../reporting/UploadRequestResult.java | 34 + .../ActivityRecognitionApiClientBuilder.java | 35 + .../location/ActivityRecognitionApiImpl.java | 67 + .../ActivityRecognitionClientImpl.java | 38 + .../FusedLocationProviderApiImpl.java | 177 + .../FusedLocationProviderClientImpl.java | 128 + .../gms/location/GeofencingApiImpl.java | 116 + .../gms/location/GeofencingClientImpl.java | 43 + .../location/GoogleLocationManagerClient.java | 52 + .../microg/gms/location/GranularityUtil.java | 42 + .../gms/location/LocationClientImpl.java | 180 + .../LocationServicesApiClientBuilder.java | 35 + .../org/microg/gms/location/PriorityUtil.java | 46 + .../microg/gms/location/SettingsApiImpl.java | 33 + .../gms/location/SettingsClientImpl.java | 39 + .../gms/location/ThrottleBehaviorUtil.java | 43 + play-services-maps/build.gradle | 43 + play-services-maps/core/hms/build.gradle | 61 + .../core/hms/proguard-rules.pro | 9 + .../core/hms/src/main/AndroidManifest.xml | 20 + .../core/hms/src/main/assets/.gitignore | 1 + .../gms/maps_dynamite/ModuleDescriptor.java | 14 + .../gms/maps/internal/CreatorImpl.java | 92 + .../gms/maps/hms/CameraUpdateFactory.kt | 71 + .../org/microg/gms/maps/hms/GoogleMap.kt | 984 ++ .../org/microg/gms/maps/hms/MapFragment.kt | 115 + .../kotlin/org/microg/gms/maps/hms/MapView.kt | 69 + .../org/microg/gms/maps/hms/Projection.kt | 142 + .../maps/hms/StreetViewPanoramaFragment.kt | 63 + .../gms/maps/hms/StreetViewPanoramaView.kt | 54 + .../org/microg/gms/maps/hms/UiSettings.kt | 316 + .../maps/hms/model/BitmapDescriptorFactory.kt | 68 + .../org/microg/gms/maps/hms/model/Circle.kt | 124 + .../gms/maps/hms/model/GroundOverlay.kt | 144 + .../org/microg/gms/maps/hms/model/Marker.kt | 154 + .../org/microg/gms/maps/hms/model/Polygon.kt | 172 + .../org/microg/gms/maps/hms/model/Polyline.kt | 220 + .../microg/gms/maps/hms/model/TileOverlay.kt | 81 + .../microg/gms/maps/hms/utils/MapContext.kt | 80 + .../gms/maps/hms/utils/MapUiController.kt | 71 + .../gms/maps/hms/utils/typeConverter.kt | 239 + .../res/drawable-hdpi/maps_default_marker.png | Bin 0 -> 1974 bytes .../res/drawable-ldpi/maps_default_marker.png | Bin 0 -> 946 bytes .../res/drawable-mdpi/maps_default_marker.png | Bin 0 -> 1277 bytes .../drawable-xhdpi/maps_default_marker.png | Bin 0 -> 2745 bytes .../drawable-xxhdpi/maps_default_marker.png | Bin 0 -> 4277 bytes .../drawable-xxxhdpi/maps_default_marker.png | Bin 0 -> 5890 bytes .../main/res/raw/mapstyle_grayscale_hms.json | 101 + .../src/main/res/raw/mapstyle_night_hms.json | 376 + .../core/hms/src/main/res/values/strings.xml | 1 + play-services-maps/core/mapbox/build.gradle | 84 + .../core/mapbox/src/main/AndroidManifest.xml | 35 + ...Open Sans Regular,Arial Unicode MS Regular | 1 + .../src/main/assets/Roboto Bold/0-255.pbf | Bin 0 -> 84683 bytes .../src/main/assets/Roboto Bold/1024-1279.pbf | Bin 0 -> 137401 bytes .../main/assets/Roboto Bold/10240-10495.pbf | 3 + .../main/assets/Roboto Bold/10496-10751.pbf | 3 + .../main/assets/Roboto Bold/10752-11007.pbf | 3 + .../main/assets/Roboto Bold/11008-11263.pbf | 3 + .../main/assets/Roboto Bold/11264-11519.pbf | 3 + .../main/assets/Roboto Bold/11520-11775.pbf | 3 + .../main/assets/Roboto Bold/11776-12031.pbf | 3 + .../main/assets/Roboto Bold/12032-12287.pbf | 3 + .../main/assets/Roboto Bold/12288-12543.pbf | 3 + .../main/assets/Roboto Bold/12544-12799.pbf | 3 + .../src/main/assets/Roboto Bold/1280-1535.pbf | Bin 0 -> 11193 bytes .../main/assets/Roboto Bold/12800-13055.pbf | 3 + .../main/assets/Roboto Bold/13056-13311.pbf | 3 + .../main/assets/Roboto Bold/13312-13567.pbf | 3 + .../main/assets/Roboto Bold/13568-13823.pbf | 3 + .../main/assets/Roboto Bold/13824-14079.pbf | 3 + .../main/assets/Roboto Bold/14080-14335.pbf | 3 + .../main/assets/Roboto Bold/14336-14591.pbf | 3 + .../main/assets/Roboto Bold/14592-14847.pbf | 3 + .../main/assets/Roboto Bold/14848-15103.pbf | 3 + .../main/assets/Roboto Bold/15104-15359.pbf | 3 + .../src/main/assets/Roboto Bold/1536-1791.pbf | 3 + .../main/assets/Roboto Bold/15360-15615.pbf | 3 + .../main/assets/Roboto Bold/15616-15871.pbf | 3 + .../main/assets/Roboto Bold/15872-16127.pbf | 3 + .../main/assets/Roboto Bold/16128-16383.pbf | 3 + .../main/assets/Roboto Bold/16384-16639.pbf | 3 + .../main/assets/Roboto Bold/16640-16895.pbf | 3 + .../main/assets/Roboto Bold/16896-17151.pbf | 3 + .../main/assets/Roboto Bold/17152-17407.pbf | 3 + .../main/assets/Roboto Bold/17408-17663.pbf | 3 + .../main/assets/Roboto Bold/17664-17919.pbf | 3 + .../src/main/assets/Roboto Bold/1792-2047.pbf | 3 + .../main/assets/Roboto Bold/17920-18175.pbf | 3 + .../main/assets/Roboto Bold/18176-18431.pbf | 3 + .../main/assets/Roboto Bold/18432-18687.pbf | 3 + .../main/assets/Roboto Bold/18688-18943.pbf | 3 + .../main/assets/Roboto Bold/18944-19199.pbf | 3 + .../main/assets/Roboto Bold/19200-19455.pbf | 3 + .../main/assets/Roboto Bold/19456-19711.pbf | 3 + .../main/assets/Roboto Bold/19712-19967.pbf | 3 + .../main/assets/Roboto Bold/19968-20223.pbf | 3 + .../main/assets/Roboto Bold/20224-20479.pbf | 3 + .../src/main/assets/Roboto Bold/2048-2303.pbf | 3 + .../main/assets/Roboto Bold/20480-20735.pbf | 3 + .../main/assets/Roboto Bold/20736-20991.pbf | 3 + .../main/assets/Roboto Bold/20992-21247.pbf | 3 + .../main/assets/Roboto Bold/21248-21503.pbf | 3 + .../main/assets/Roboto Bold/21504-21759.pbf | 3 + .../main/assets/Roboto Bold/21760-22015.pbf | 3 + .../main/assets/Roboto Bold/22016-22271.pbf | 3 + .../main/assets/Roboto Bold/22272-22527.pbf | 3 + .../main/assets/Roboto Bold/22528-22783.pbf | 3 + .../main/assets/Roboto Bold/22784-23039.pbf | 3 + .../src/main/assets/Roboto Bold/2304-2559.pbf | 3 + .../main/assets/Roboto Bold/23040-23295.pbf | 3 + .../main/assets/Roboto Bold/23296-23551.pbf | 3 + .../main/assets/Roboto Bold/23552-23807.pbf | 3 + .../main/assets/Roboto Bold/23808-24063.pbf | 3 + .../main/assets/Roboto Bold/24064-24319.pbf | 3 + .../main/assets/Roboto Bold/24320-24575.pbf | 3 + .../main/assets/Roboto Bold/24576-24831.pbf | 3 + .../main/assets/Roboto Bold/24832-25087.pbf | 3 + .../main/assets/Roboto Bold/25088-25343.pbf | 3 + .../main/assets/Roboto Bold/25344-25599.pbf | 3 + .../src/main/assets/Roboto Bold/256-511.pbf | Bin 0 -> 74748 bytes .../src/main/assets/Roboto Bold/2560-2815.pbf | 3 + .../main/assets/Roboto Bold/25600-25855.pbf | 3 + .../main/assets/Roboto Bold/25856-26111.pbf | 3 + .../main/assets/Roboto Bold/26112-26367.pbf | 3 + .../main/assets/Roboto Bold/26368-26623.pbf | 3 + .../main/assets/Roboto Bold/26624-26879.pbf | 3 + .../main/assets/Roboto Bold/26880-27135.pbf | 3 + .../main/assets/Roboto Bold/27136-27391.pbf | 3 + .../main/assets/Roboto Bold/27392-27647.pbf | 3 + .../main/assets/Roboto Bold/27648-27903.pbf | 3 + .../main/assets/Roboto Bold/27904-28159.pbf | 3 + .../src/main/assets/Roboto Bold/2816-3071.pbf | 3 + .../main/assets/Roboto Bold/28160-28415.pbf | 3 + .../main/assets/Roboto Bold/28416-28671.pbf | 3 + .../main/assets/Roboto Bold/28672-28927.pbf | 3 + .../main/assets/Roboto Bold/28928-29183.pbf | 3 + .../main/assets/Roboto Bold/29184-29439.pbf | 3 + .../main/assets/Roboto Bold/29440-29695.pbf | 3 + .../main/assets/Roboto Bold/29696-29951.pbf | 3 + .../main/assets/Roboto Bold/29952-30207.pbf | 3 + .../main/assets/Roboto Bold/30208-30463.pbf | 3 + .../main/assets/Roboto Bold/30464-30719.pbf | 3 + .../src/main/assets/Roboto Bold/3072-3327.pbf | 3 + .../main/assets/Roboto Bold/30720-30975.pbf | 3 + .../main/assets/Roboto Bold/30976-31231.pbf | 3 + .../main/assets/Roboto Bold/31232-31487.pbf | 3 + .../main/assets/Roboto Bold/31488-31743.pbf | 3 + .../main/assets/Roboto Bold/31744-31999.pbf | 3 + .../main/assets/Roboto Bold/32000-32255.pbf | 3 + .../main/assets/Roboto Bold/32256-32511.pbf | 3 + .../main/assets/Roboto Bold/32512-32767.pbf | 3 + .../main/assets/Roboto Bold/32768-33023.pbf | 3 + .../main/assets/Roboto Bold/33024-33279.pbf | 3 + .../src/main/assets/Roboto Bold/3328-3583.pbf | 3 + .../main/assets/Roboto Bold/33280-33535.pbf | 3 + .../main/assets/Roboto Bold/33536-33791.pbf | 3 + .../main/assets/Roboto Bold/33792-34047.pbf | 3 + .../main/assets/Roboto Bold/34048-34303.pbf | 3 + .../main/assets/Roboto Bold/34304-34559.pbf | 3 + .../main/assets/Roboto Bold/34560-34815.pbf | 3 + .../main/assets/Roboto Bold/34816-35071.pbf | 3 + .../main/assets/Roboto Bold/35072-35327.pbf | 3 + .../main/assets/Roboto Bold/35328-35583.pbf | 3 + .../main/assets/Roboto Bold/35584-35839.pbf | 3 + .../src/main/assets/Roboto Bold/3584-3839.pbf | 3 + .../main/assets/Roboto Bold/35840-36095.pbf | 3 + .../main/assets/Roboto Bold/36096-36351.pbf | 3 + .../main/assets/Roboto Bold/36352-36607.pbf | 3 + .../main/assets/Roboto Bold/36608-36863.pbf | 3 + .../main/assets/Roboto Bold/36864-37119.pbf | 3 + .../main/assets/Roboto Bold/37120-37375.pbf | 3 + .../main/assets/Roboto Bold/37376-37631.pbf | 3 + .../main/assets/Roboto Bold/37632-37887.pbf | 3 + .../main/assets/Roboto Bold/37888-38143.pbf | 3 + .../main/assets/Roboto Bold/38144-38399.pbf | 3 + .../src/main/assets/Roboto Bold/3840-4095.pbf | 3 + .../main/assets/Roboto Bold/38400-38655.pbf | 3 + .../main/assets/Roboto Bold/38656-38911.pbf | 3 + .../main/assets/Roboto Bold/38912-39167.pbf | 3 + .../main/assets/Roboto Bold/39168-39423.pbf | 3 + .../main/assets/Roboto Bold/39424-39679.pbf | 3 + .../main/assets/Roboto Bold/39680-39935.pbf | 3 + .../main/assets/Roboto Bold/39936-40191.pbf | 3 + .../main/assets/Roboto Bold/40192-40447.pbf | 3 + .../main/assets/Roboto Bold/40448-40703.pbf | 3 + .../main/assets/Roboto Bold/40704-40959.pbf | 3 + .../src/main/assets/Roboto Bold/4096-4351.pbf | 3 + .../main/assets/Roboto Bold/40960-41215.pbf | 3 + .../main/assets/Roboto Bold/41216-41471.pbf | 3 + .../main/assets/Roboto Bold/41472-41727.pbf | 3 + .../main/assets/Roboto Bold/41728-41983.pbf | 3 + .../main/assets/Roboto Bold/41984-42239.pbf | 3 + .../main/assets/Roboto Bold/42240-42495.pbf | 3 + .../main/assets/Roboto Bold/42496-42751.pbf | 3 + .../main/assets/Roboto Bold/42752-43007.pbf | 3 + .../main/assets/Roboto Bold/43008-43263.pbf | 3 + .../main/assets/Roboto Bold/43264-43519.pbf | 3 + .../src/main/assets/Roboto Bold/4352-4607.pbf | 3 + .../main/assets/Roboto Bold/43520-43775.pbf | 3 + .../main/assets/Roboto Bold/43776-44031.pbf | 3 + .../main/assets/Roboto Bold/44032-44287.pbf | 3 + .../main/assets/Roboto Bold/44288-44543.pbf | 3 + .../main/assets/Roboto Bold/44544-44799.pbf | 3 + .../main/assets/Roboto Bold/44800-45055.pbf | 3 + .../main/assets/Roboto Bold/45056-45311.pbf | 3 + .../main/assets/Roboto Bold/45312-45567.pbf | 3 + .../main/assets/Roboto Bold/45568-45823.pbf | 3 + .../main/assets/Roboto Bold/45824-46079.pbf | 3 + .../src/main/assets/Roboto Bold/4608-4863.pbf | 3 + .../main/assets/Roboto Bold/46080-46335.pbf | 3 + .../main/assets/Roboto Bold/46336-46591.pbf | 3 + .../main/assets/Roboto Bold/46592-46847.pbf | 3 + .../main/assets/Roboto Bold/46848-47103.pbf | 3 + .../main/assets/Roboto Bold/47104-47359.pbf | 3 + .../main/assets/Roboto Bold/47360-47615.pbf | 3 + .../main/assets/Roboto Bold/47616-47871.pbf | 3 + .../main/assets/Roboto Bold/47872-48127.pbf | 3 + .../main/assets/Roboto Bold/48128-48383.pbf | 3 + .../main/assets/Roboto Bold/48384-48639.pbf | 3 + .../src/main/assets/Roboto Bold/4864-5119.pbf | 3 + .../main/assets/Roboto Bold/48640-48895.pbf | 3 + .../main/assets/Roboto Bold/48896-49151.pbf | 3 + .../main/assets/Roboto Bold/49152-49407.pbf | 3 + .../main/assets/Roboto Bold/49408-49663.pbf | 3 + .../main/assets/Roboto Bold/49664-49919.pbf | 3 + .../main/assets/Roboto Bold/49920-50175.pbf | 3 + .../main/assets/Roboto Bold/50176-50431.pbf | 3 + .../main/assets/Roboto Bold/50432-50687.pbf | 3 + .../main/assets/Roboto Bold/50688-50943.pbf | 3 + .../main/assets/Roboto Bold/50944-51199.pbf | 3 + .../src/main/assets/Roboto Bold/512-767.pbf | Bin 0 -> 4774 bytes .../src/main/assets/Roboto Bold/5120-5375.pbf | 3 + .../main/assets/Roboto Bold/51200-51455.pbf | 3 + .../main/assets/Roboto Bold/51456-51711.pbf | 3 + .../main/assets/Roboto Bold/51712-51967.pbf | 3 + .../main/assets/Roboto Bold/51968-52223.pbf | 3 + .../main/assets/Roboto Bold/52224-52479.pbf | 3 + .../main/assets/Roboto Bold/52480-52735.pbf | 3 + .../main/assets/Roboto Bold/52736-52991.pbf | 3 + .../main/assets/Roboto Bold/52992-53247.pbf | 3 + .../main/assets/Roboto Bold/53248-53503.pbf | 3 + .../main/assets/Roboto Bold/53504-53759.pbf | 3 + .../src/main/assets/Roboto Bold/5376-5631.pbf | 3 + .../main/assets/Roboto Bold/53760-54015.pbf | 3 + .../main/assets/Roboto Bold/54016-54271.pbf | 3 + .../main/assets/Roboto Bold/54272-54527.pbf | 3 + .../main/assets/Roboto Bold/54528-54783.pbf | 3 + .../main/assets/Roboto Bold/54784-55039.pbf | 3 + .../main/assets/Roboto Bold/55040-55295.pbf | 3 + .../main/assets/Roboto Bold/55296-55551.pbf | 3 + .../main/assets/Roboto Bold/55552-55807.pbf | 3 + .../main/assets/Roboto Bold/55808-56063.pbf | 3 + .../main/assets/Roboto Bold/56064-56319.pbf | 3 + .../src/main/assets/Roboto Bold/5632-5887.pbf | 3 + .../main/assets/Roboto Bold/56320-56575.pbf | 3 + .../main/assets/Roboto Bold/56576-56831.pbf | 3 + .../main/assets/Roboto Bold/56832-57087.pbf | 3 + .../main/assets/Roboto Bold/57088-57343.pbf | 3 + .../main/assets/Roboto Bold/57344-57599.pbf | 3 + .../main/assets/Roboto Bold/57600-57855.pbf | 3 + .../main/assets/Roboto Bold/57856-58111.pbf | 3 + .../main/assets/Roboto Bold/58112-58367.pbf | 3 + .../main/assets/Roboto Bold/58368-58623.pbf | 3 + .../main/assets/Roboto Bold/58624-58879.pbf | 3 + .../src/main/assets/Roboto Bold/5888-6143.pbf | 3 + .../main/assets/Roboto Bold/58880-59135.pbf | 3 + .../main/assets/Roboto Bold/59136-59391.pbf | 3 + .../main/assets/Roboto Bold/59392-59647.pbf | 3 + .../main/assets/Roboto Bold/59648-59903.pbf | 3 + .../main/assets/Roboto Bold/59904-60159.pbf | 3 + .../main/assets/Roboto Bold/60160-60415.pbf | 3 + .../main/assets/Roboto Bold/60416-60671.pbf | 3 + .../main/assets/Roboto Bold/60672-60927.pbf | 3 + .../main/assets/Roboto Bold/60928-61183.pbf | 3 + .../main/assets/Roboto Bold/61184-61439.pbf | 3 + .../src/main/assets/Roboto Bold/6144-6399.pbf | 3 + .../main/assets/Roboto Bold/61440-61695.pbf | 3 + .../main/assets/Roboto Bold/61696-61951.pbf | 3 + .../main/assets/Roboto Bold/61952-62207.pbf | 3 + .../main/assets/Roboto Bold/62208-62463.pbf | 3 + .../main/assets/Roboto Bold/62464-62719.pbf | 3 + .../main/assets/Roboto Bold/62720-62975.pbf | 3 + .../main/assets/Roboto Bold/62976-63231.pbf | Bin 0 -> 168 bytes .../main/assets/Roboto Bold/63232-63487.pbf | 3 + .../main/assets/Roboto Bold/63488-63743.pbf | 3 + .../main/assets/Roboto Bold/63744-63999.pbf | 3 + .../src/main/assets/Roboto Bold/6400-6655.pbf | 3 + .../main/assets/Roboto Bold/64000-64255.pbf | 3 + .../main/assets/Roboto Bold/64256-64511.pbf | Bin 0 -> 2459 bytes .../main/assets/Roboto Bold/64512-64767.pbf | 3 + .../main/assets/Roboto Bold/64768-65023.pbf | 3 + .../main/assets/Roboto Bold/65024-65279.pbf | Bin 0 -> 82 bytes .../main/assets/Roboto Bold/65280-65535.pbf | Bin 0 -> 2041 bytes .../src/main/assets/Roboto Bold/6656-6911.pbf | 3 + .../src/main/assets/Roboto Bold/6912-7167.pbf | 3 + .../src/main/assets/Roboto Bold/7168-7423.pbf | 3 + .../src/main/assets/Roboto Bold/7424-7679.pbf | 3 + .../src/main/assets/Roboto Bold/768-1023.pbf | Bin 0 -> 37736 bytes .../src/main/assets/Roboto Bold/7680-7935.pbf | Bin 0 -> 60415 bytes .../src/main/assets/Roboto Bold/7936-8191.pbf | Bin 0 -> 771 bytes .../src/main/assets/Roboto Bold/8192-8447.pbf | Bin 0 -> 15677 bytes .../src/main/assets/Roboto Bold/8448-8703.pbf | Bin 0 -> 5442 bytes .../src/main/assets/Roboto Bold/8704-8959.pbf | Bin 0 -> 5494 bytes .../src/main/assets/Roboto Bold/8960-9215.pbf | 3 + .../src/main/assets/Roboto Bold/9216-9471.pbf | 3 + .../src/main/assets/Roboto Bold/9472-9727.pbf | Bin 0 -> 478 bytes .../src/main/assets/Roboto Bold/9728-9983.pbf | 3 + .../main/assets/Roboto Bold/9984-10239.pbf | 4 + .../src/main/assets/Roboto Medium/0-255.pbf | Bin 0 -> 82965 bytes .../main/assets/Roboto Medium/1024-1279.pbf | Bin 0 -> 135083 bytes .../main/assets/Roboto Medium/10240-10495.pbf | 3 + .../main/assets/Roboto Medium/10496-10751.pbf | 3 + .../main/assets/Roboto Medium/10752-11007.pbf | 3 + .../main/assets/Roboto Medium/11008-11263.pbf | 3 + .../main/assets/Roboto Medium/11264-11519.pbf | 3 + .../main/assets/Roboto Medium/11520-11775.pbf | 3 + .../main/assets/Roboto Medium/11776-12031.pbf | 3 + .../main/assets/Roboto Medium/12032-12287.pbf | 3 + .../main/assets/Roboto Medium/12288-12543.pbf | 3 + .../main/assets/Roboto Medium/12544-12799.pbf | 3 + .../main/assets/Roboto Medium/1280-1535.pbf | Bin 0 -> 11032 bytes .../main/assets/Roboto Medium/12800-13055.pbf | 3 + .../main/assets/Roboto Medium/13056-13311.pbf | 3 + .../main/assets/Roboto Medium/13312-13567.pbf | 3 + .../main/assets/Roboto Medium/13568-13823.pbf | 3 + .../main/assets/Roboto Medium/13824-14079.pbf | 3 + .../main/assets/Roboto Medium/14080-14335.pbf | 3 + .../main/assets/Roboto Medium/14336-14591.pbf | 3 + .../main/assets/Roboto Medium/14592-14847.pbf | 3 + .../main/assets/Roboto Medium/14848-15103.pbf | 3 + .../main/assets/Roboto Medium/15104-15359.pbf | 3 + .../main/assets/Roboto Medium/1536-1791.pbf | 3 + .../main/assets/Roboto Medium/15360-15615.pbf | 3 + .../main/assets/Roboto Medium/15616-15871.pbf | 3 + .../main/assets/Roboto Medium/15872-16127.pbf | 3 + .../main/assets/Roboto Medium/16128-16383.pbf | 3 + .../main/assets/Roboto Medium/16384-16639.pbf | 3 + .../main/assets/Roboto Medium/16640-16895.pbf | 3 + .../main/assets/Roboto Medium/16896-17151.pbf | 3 + .../main/assets/Roboto Medium/17152-17407.pbf | 3 + .../main/assets/Roboto Medium/17408-17663.pbf | 3 + .../main/assets/Roboto Medium/17664-17919.pbf | 3 + .../main/assets/Roboto Medium/1792-2047.pbf | 3 + .../main/assets/Roboto Medium/17920-18175.pbf | 3 + .../main/assets/Roboto Medium/18176-18431.pbf | 3 + .../main/assets/Roboto Medium/18432-18687.pbf | 3 + .../main/assets/Roboto Medium/18688-18943.pbf | 3 + .../main/assets/Roboto Medium/18944-19199.pbf | 3 + .../main/assets/Roboto Medium/19200-19455.pbf | 3 + .../main/assets/Roboto Medium/19456-19711.pbf | 3 + .../main/assets/Roboto Medium/19712-19967.pbf | 3 + .../main/assets/Roboto Medium/19968-20223.pbf | 3 + .../main/assets/Roboto Medium/20224-20479.pbf | 3 + .../main/assets/Roboto Medium/2048-2303.pbf | 3 + .../main/assets/Roboto Medium/20480-20735.pbf | 3 + .../main/assets/Roboto Medium/20736-20991.pbf | 3 + .../main/assets/Roboto Medium/20992-21247.pbf | 3 + .../main/assets/Roboto Medium/21248-21503.pbf | 3 + .../main/assets/Roboto Medium/21504-21759.pbf | 3 + .../main/assets/Roboto Medium/21760-22015.pbf | 3 + .../main/assets/Roboto Medium/22016-22271.pbf | 3 + .../main/assets/Roboto Medium/22272-22527.pbf | 3 + .../main/assets/Roboto Medium/22528-22783.pbf | 3 + .../main/assets/Roboto Medium/22784-23039.pbf | 3 + .../main/assets/Roboto Medium/2304-2559.pbf | 3 + .../main/assets/Roboto Medium/23040-23295.pbf | 3 + .../main/assets/Roboto Medium/23296-23551.pbf | 3 + .../main/assets/Roboto Medium/23552-23807.pbf | 3 + .../main/assets/Roboto Medium/23808-24063.pbf | 3 + .../main/assets/Roboto Medium/24064-24319.pbf | 3 + .../main/assets/Roboto Medium/24320-24575.pbf | 3 + .../main/assets/Roboto Medium/24576-24831.pbf | 3 + .../main/assets/Roboto Medium/24832-25087.pbf | 3 + .../main/assets/Roboto Medium/25088-25343.pbf | 3 + .../main/assets/Roboto Medium/25344-25599.pbf | 3 + .../src/main/assets/Roboto Medium/256-511.pbf | Bin 0 -> 73791 bytes .../main/assets/Roboto Medium/2560-2815.pbf | 3 + .../main/assets/Roboto Medium/25600-25855.pbf | 3 + .../main/assets/Roboto Medium/25856-26111.pbf | 3 + .../main/assets/Roboto Medium/26112-26367.pbf | 3 + .../main/assets/Roboto Medium/26368-26623.pbf | 3 + .../main/assets/Roboto Medium/26624-26879.pbf | 3 + .../main/assets/Roboto Medium/26880-27135.pbf | 3 + .../main/assets/Roboto Medium/27136-27391.pbf | 3 + .../main/assets/Roboto Medium/27392-27647.pbf | 3 + .../main/assets/Roboto Medium/27648-27903.pbf | 3 + .../main/assets/Roboto Medium/27904-28159.pbf | 3 + .../main/assets/Roboto Medium/2816-3071.pbf | 3 + .../main/assets/Roboto Medium/28160-28415.pbf | 3 + .../main/assets/Roboto Medium/28416-28671.pbf | 3 + .../main/assets/Roboto Medium/28672-28927.pbf | 3 + .../main/assets/Roboto Medium/28928-29183.pbf | 3 + .../main/assets/Roboto Medium/29184-29439.pbf | 3 + .../main/assets/Roboto Medium/29440-29695.pbf | 3 + .../main/assets/Roboto Medium/29696-29951.pbf | 3 + .../main/assets/Roboto Medium/29952-30207.pbf | 3 + .../main/assets/Roboto Medium/30208-30463.pbf | 3 + .../main/assets/Roboto Medium/30464-30719.pbf | 3 + .../main/assets/Roboto Medium/3072-3327.pbf | 3 + .../main/assets/Roboto Medium/30720-30975.pbf | 3 + .../main/assets/Roboto Medium/30976-31231.pbf | 3 + .../main/assets/Roboto Medium/31232-31487.pbf | 3 + .../main/assets/Roboto Medium/31488-31743.pbf | 3 + .../main/assets/Roboto Medium/31744-31999.pbf | 3 + .../main/assets/Roboto Medium/32000-32255.pbf | 3 + .../main/assets/Roboto Medium/32256-32511.pbf | 3 + .../main/assets/Roboto Medium/32512-32767.pbf | 3 + .../main/assets/Roboto Medium/32768-33023.pbf | 3 + .../main/assets/Roboto Medium/33024-33279.pbf | 3 + .../main/assets/Roboto Medium/3328-3583.pbf | 3 + .../main/assets/Roboto Medium/33280-33535.pbf | 3 + .../main/assets/Roboto Medium/33536-33791.pbf | 3 + .../main/assets/Roboto Medium/33792-34047.pbf | 3 + .../main/assets/Roboto Medium/34048-34303.pbf | 3 + .../main/assets/Roboto Medium/34304-34559.pbf | 3 + .../main/assets/Roboto Medium/34560-34815.pbf | 3 + .../main/assets/Roboto Medium/34816-35071.pbf | 3 + .../main/assets/Roboto Medium/35072-35327.pbf | 3 + .../main/assets/Roboto Medium/35328-35583.pbf | 3 + .../main/assets/Roboto Medium/35584-35839.pbf | 3 + .../main/assets/Roboto Medium/3584-3839.pbf | 3 + .../main/assets/Roboto Medium/35840-36095.pbf | 3 + .../main/assets/Roboto Medium/36096-36351.pbf | 3 + .../main/assets/Roboto Medium/36352-36607.pbf | 3 + .../main/assets/Roboto Medium/36608-36863.pbf | 3 + .../main/assets/Roboto Medium/36864-37119.pbf | 3 + .../main/assets/Roboto Medium/37120-37375.pbf | 3 + .../main/assets/Roboto Medium/37376-37631.pbf | 3 + .../main/assets/Roboto Medium/37632-37887.pbf | 3 + .../main/assets/Roboto Medium/37888-38143.pbf | 3 + .../main/assets/Roboto Medium/38144-38399.pbf | 3 + .../main/assets/Roboto Medium/3840-4095.pbf | 3 + .../main/assets/Roboto Medium/38400-38655.pbf | 3 + .../main/assets/Roboto Medium/38656-38911.pbf | 3 + .../main/assets/Roboto Medium/38912-39167.pbf | 3 + .../main/assets/Roboto Medium/39168-39423.pbf | 3 + .../main/assets/Roboto Medium/39424-39679.pbf | 3 + .../main/assets/Roboto Medium/39680-39935.pbf | 3 + .../main/assets/Roboto Medium/39936-40191.pbf | 3 + .../main/assets/Roboto Medium/40192-40447.pbf | 3 + .../main/assets/Roboto Medium/40448-40703.pbf | 3 + .../main/assets/Roboto Medium/40704-40959.pbf | 3 + .../main/assets/Roboto Medium/4096-4351.pbf | 3 + .../main/assets/Roboto Medium/40960-41215.pbf | 3 + .../main/assets/Roboto Medium/41216-41471.pbf | 3 + .../main/assets/Roboto Medium/41472-41727.pbf | 3 + .../main/assets/Roboto Medium/41728-41983.pbf | 3 + .../main/assets/Roboto Medium/41984-42239.pbf | 3 + .../main/assets/Roboto Medium/42240-42495.pbf | 3 + .../main/assets/Roboto Medium/42496-42751.pbf | 3 + .../main/assets/Roboto Medium/42752-43007.pbf | 3 + .../main/assets/Roboto Medium/43008-43263.pbf | 3 + .../main/assets/Roboto Medium/43264-43519.pbf | 3 + .../main/assets/Roboto Medium/4352-4607.pbf | 3 + .../main/assets/Roboto Medium/43520-43775.pbf | 3 + .../main/assets/Roboto Medium/43776-44031.pbf | 3 + .../main/assets/Roboto Medium/44032-44287.pbf | 3 + .../main/assets/Roboto Medium/44288-44543.pbf | 3 + .../main/assets/Roboto Medium/44544-44799.pbf | 3 + .../main/assets/Roboto Medium/44800-45055.pbf | 3 + .../main/assets/Roboto Medium/45056-45311.pbf | 3 + .../main/assets/Roboto Medium/45312-45567.pbf | 3 + .../main/assets/Roboto Medium/45568-45823.pbf | 3 + .../main/assets/Roboto Medium/45824-46079.pbf | 3 + .../main/assets/Roboto Medium/4608-4863.pbf | 3 + .../main/assets/Roboto Medium/46080-46335.pbf | 3 + .../main/assets/Roboto Medium/46336-46591.pbf | 3 + .../main/assets/Roboto Medium/46592-46847.pbf | 3 + .../main/assets/Roboto Medium/46848-47103.pbf | 3 + .../main/assets/Roboto Medium/47104-47359.pbf | 3 + .../main/assets/Roboto Medium/47360-47615.pbf | 3 + .../main/assets/Roboto Medium/47616-47871.pbf | 3 + .../main/assets/Roboto Medium/47872-48127.pbf | 3 + .../main/assets/Roboto Medium/48128-48383.pbf | 3 + .../main/assets/Roboto Medium/48384-48639.pbf | 3 + .../main/assets/Roboto Medium/4864-5119.pbf | 3 + .../main/assets/Roboto Medium/48640-48895.pbf | 3 + .../main/assets/Roboto Medium/48896-49151.pbf | 3 + .../main/assets/Roboto Medium/49152-49407.pbf | 3 + .../main/assets/Roboto Medium/49408-49663.pbf | 3 + .../main/assets/Roboto Medium/49664-49919.pbf | 3 + .../main/assets/Roboto Medium/49920-50175.pbf | 3 + .../main/assets/Roboto Medium/50176-50431.pbf | 3 + .../main/assets/Roboto Medium/50432-50687.pbf | 3 + .../main/assets/Roboto Medium/50688-50943.pbf | 3 + .../main/assets/Roboto Medium/50944-51199.pbf | 3 + .../src/main/assets/Roboto Medium/512-767.pbf | Bin 0 -> 4691 bytes .../main/assets/Roboto Medium/5120-5375.pbf | 3 + .../main/assets/Roboto Medium/51200-51455.pbf | 3 + .../main/assets/Roboto Medium/51456-51711.pbf | 3 + .../main/assets/Roboto Medium/51712-51967.pbf | 3 + .../main/assets/Roboto Medium/51968-52223.pbf | 3 + .../main/assets/Roboto Medium/52224-52479.pbf | 3 + .../main/assets/Roboto Medium/52480-52735.pbf | 3 + .../main/assets/Roboto Medium/52736-52991.pbf | 3 + .../main/assets/Roboto Medium/52992-53247.pbf | 3 + .../main/assets/Roboto Medium/53248-53503.pbf | 3 + .../main/assets/Roboto Medium/53504-53759.pbf | 3 + .../main/assets/Roboto Medium/5376-5631.pbf | 3 + .../main/assets/Roboto Medium/53760-54015.pbf | 3 + .../main/assets/Roboto Medium/54016-54271.pbf | 3 + .../main/assets/Roboto Medium/54272-54527.pbf | 3 + .../main/assets/Roboto Medium/54528-54783.pbf | 3 + .../main/assets/Roboto Medium/54784-55039.pbf | 3 + .../main/assets/Roboto Medium/55040-55295.pbf | 3 + .../main/assets/Roboto Medium/55296-55551.pbf | 3 + .../main/assets/Roboto Medium/55552-55807.pbf | 3 + .../main/assets/Roboto Medium/55808-56063.pbf | 3 + .../main/assets/Roboto Medium/56064-56319.pbf | 3 + .../main/assets/Roboto Medium/5632-5887.pbf | 3 + .../main/assets/Roboto Medium/56320-56575.pbf | 3 + .../main/assets/Roboto Medium/56576-56831.pbf | 3 + .../main/assets/Roboto Medium/56832-57087.pbf | 3 + .../main/assets/Roboto Medium/57088-57343.pbf | 3 + .../main/assets/Roboto Medium/57344-57599.pbf | 3 + .../main/assets/Roboto Medium/57600-57855.pbf | 3 + .../main/assets/Roboto Medium/57856-58111.pbf | 3 + .../main/assets/Roboto Medium/58112-58367.pbf | 3 + .../main/assets/Roboto Medium/58368-58623.pbf | 3 + .../main/assets/Roboto Medium/58624-58879.pbf | 3 + .../main/assets/Roboto Medium/5888-6143.pbf | 3 + .../main/assets/Roboto Medium/58880-59135.pbf | 3 + .../main/assets/Roboto Medium/59136-59391.pbf | 3 + .../main/assets/Roboto Medium/59392-59647.pbf | 3 + .../main/assets/Roboto Medium/59648-59903.pbf | 3 + .../main/assets/Roboto Medium/59904-60159.pbf | 3 + .../main/assets/Roboto Medium/60160-60415.pbf | 3 + .../main/assets/Roboto Medium/60416-60671.pbf | 3 + .../main/assets/Roboto Medium/60672-60927.pbf | 3 + .../main/assets/Roboto Medium/60928-61183.pbf | 4 + .../main/assets/Roboto Medium/61184-61439.pbf | 3 + .../main/assets/Roboto Medium/6144-6399.pbf | 3 + .../main/assets/Roboto Medium/61440-61695.pbf | 3 + .../main/assets/Roboto Medium/61696-61951.pbf | 3 + .../main/assets/Roboto Medium/61952-62207.pbf | 3 + .../main/assets/Roboto Medium/62208-62463.pbf | 3 + .../main/assets/Roboto Medium/62464-62719.pbf | 3 + .../main/assets/Roboto Medium/62720-62975.pbf | 3 + .../main/assets/Roboto Medium/62976-63231.pbf | Bin 0 -> 183 bytes .../main/assets/Roboto Medium/63232-63487.pbf | 3 + .../main/assets/Roboto Medium/63488-63743.pbf | 3 + .../main/assets/Roboto Medium/63744-63999.pbf | 3 + .../main/assets/Roboto Medium/6400-6655.pbf | 3 + .../main/assets/Roboto Medium/64000-64255.pbf | 3 + .../main/assets/Roboto Medium/64256-64511.pbf | Bin 0 -> 2361 bytes .../main/assets/Roboto Medium/64512-64767.pbf | 3 + .../main/assets/Roboto Medium/64768-65023.pbf | 3 + .../main/assets/Roboto Medium/65024-65279.pbf | Bin 0 -> 84 bytes .../main/assets/Roboto Medium/65280-65535.pbf | Bin 0 -> 2043 bytes .../main/assets/Roboto Medium/6656-6911.pbf | 3 + .../main/assets/Roboto Medium/6912-7167.pbf | 3 + .../main/assets/Roboto Medium/7168-7423.pbf | 3 + .../main/assets/Roboto Medium/7424-7679.pbf | 3 + .../main/assets/Roboto Medium/768-1023.pbf | Bin 0 -> 37087 bytes .../main/assets/Roboto Medium/7680-7935.pbf | Bin 0 -> 59130 bytes .../main/assets/Roboto Medium/7936-8191.pbf | Bin 0 -> 773 bytes .../main/assets/Roboto Medium/8192-8447.pbf | Bin 0 -> 15233 bytes .../main/assets/Roboto Medium/8448-8703.pbf | Bin 0 -> 5394 bytes .../main/assets/Roboto Medium/8704-8959.pbf | Bin 0 -> 5355 bytes .../main/assets/Roboto Medium/8960-9215.pbf | 3 + .../main/assets/Roboto Medium/9216-9471.pbf | 3 + .../main/assets/Roboto Medium/9472-9727.pbf | Bin 0 -> 480 bytes .../main/assets/Roboto Medium/9728-9983.pbf | 3 + .../main/assets/Roboto Medium/9984-10239.pbf | 4 + .../src/main/assets/Roboto Regular/0-255.pbf | Bin 0 -> 81237 bytes .../main/assets/Roboto Regular/1024-1279.pbf | Bin 0 -> 131558 bytes .../assets/Roboto Regular/10240-10495.pbf | 3 + .../assets/Roboto Regular/10496-10751.pbf | 3 + .../assets/Roboto Regular/10752-11007.pbf | 3 + .../assets/Roboto Regular/11008-11263.pbf | 3 + .../assets/Roboto Regular/11264-11519.pbf | 3 + .../assets/Roboto Regular/11520-11775.pbf | 3 + .../assets/Roboto Regular/11776-12031.pbf | 3 + .../assets/Roboto Regular/12032-12287.pbf | 3 + .../assets/Roboto Regular/12288-12543.pbf | 3 + .../assets/Roboto Regular/12544-12799.pbf | 3 + .../main/assets/Roboto Regular/1280-1535.pbf | Bin 0 -> 24049 bytes .../assets/Roboto Regular/12800-13055.pbf | 3 + .../assets/Roboto Regular/13056-13311.pbf | 3 + .../assets/Roboto Regular/13312-13567.pbf | 3 + .../assets/Roboto Regular/13568-13823.pbf | 3 + .../assets/Roboto Regular/13824-14079.pbf | 3 + .../assets/Roboto Regular/14080-14335.pbf | 3 + .../assets/Roboto Regular/14336-14591.pbf | 3 + .../assets/Roboto Regular/14592-14847.pbf | 3 + .../assets/Roboto Regular/14848-15103.pbf | 3 + .../assets/Roboto Regular/15104-15359.pbf | 3 + .../main/assets/Roboto Regular/1536-1791.pbf | 3 + .../assets/Roboto Regular/15360-15615.pbf | 3 + .../assets/Roboto Regular/15616-15871.pbf | 3 + .../assets/Roboto Regular/15872-16127.pbf | 3 + .../assets/Roboto Regular/16128-16383.pbf | 3 + .../assets/Roboto Regular/16384-16639.pbf | 3 + .../assets/Roboto Regular/16640-16895.pbf | 3 + .../assets/Roboto Regular/16896-17151.pbf | 3 + .../assets/Roboto Regular/17152-17407.pbf | 3 + .../assets/Roboto Regular/17408-17663.pbf | 3 + .../assets/Roboto Regular/17664-17919.pbf | 3 + .../main/assets/Roboto Regular/1792-2047.pbf | 3 + .../assets/Roboto Regular/17920-18175.pbf | 3 + .../assets/Roboto Regular/18176-18431.pbf | 3 + .../assets/Roboto Regular/18432-18687.pbf | 3 + .../assets/Roboto Regular/18688-18943.pbf | 3 + .../assets/Roboto Regular/18944-19199.pbf | 3 + .../assets/Roboto Regular/19200-19455.pbf | 3 + .../assets/Roboto Regular/19456-19711.pbf | 3 + .../assets/Roboto Regular/19712-19967.pbf | 3 + .../assets/Roboto Regular/19968-20223.pbf | 3 + .../assets/Roboto Regular/20224-20479.pbf | 3 + .../main/assets/Roboto Regular/2048-2303.pbf | 3 + .../assets/Roboto Regular/20480-20735.pbf | 3 + .../assets/Roboto Regular/20736-20991.pbf | 3 + .../assets/Roboto Regular/20992-21247.pbf | 3 + .../assets/Roboto Regular/21248-21503.pbf | 3 + .../assets/Roboto Regular/21504-21759.pbf | 3 + .../assets/Roboto Regular/21760-22015.pbf | 3 + .../assets/Roboto Regular/22016-22271.pbf | 3 + .../assets/Roboto Regular/22272-22527.pbf | 3 + .../assets/Roboto Regular/22528-22783.pbf | 3 + .../assets/Roboto Regular/22784-23039.pbf | 3 + .../main/assets/Roboto Regular/2304-2559.pbf | 3 + .../assets/Roboto Regular/23040-23295.pbf | 3 + .../assets/Roboto Regular/23296-23551.pbf | 3 + .../assets/Roboto Regular/23552-23807.pbf | 3 + .../assets/Roboto Regular/23808-24063.pbf | 3 + .../assets/Roboto Regular/24064-24319.pbf | 3 + .../assets/Roboto Regular/24320-24575.pbf | 3 + .../assets/Roboto Regular/24576-24831.pbf | 3 + .../assets/Roboto Regular/24832-25087.pbf | 3 + .../assets/Roboto Regular/25088-25343.pbf | 3 + .../assets/Roboto Regular/25344-25599.pbf | 3 + .../main/assets/Roboto Regular/256-511.pbf | Bin 0 -> 74366 bytes .../main/assets/Roboto Regular/2560-2815.pbf | 3 + .../assets/Roboto Regular/25600-25855.pbf | 3 + .../assets/Roboto Regular/25856-26111.pbf | 3 + .../assets/Roboto Regular/26112-26367.pbf | 3 + .../assets/Roboto Regular/26368-26623.pbf | 3 + .../assets/Roboto Regular/26624-26879.pbf | 3 + .../assets/Roboto Regular/26880-27135.pbf | 3 + .../assets/Roboto Regular/27136-27391.pbf | 3 + .../assets/Roboto Regular/27392-27647.pbf | 3 + .../assets/Roboto Regular/27648-27903.pbf | 3 + .../assets/Roboto Regular/27904-28159.pbf | 3 + .../main/assets/Roboto Regular/2816-3071.pbf | 3 + .../assets/Roboto Regular/28160-28415.pbf | 3 + .../assets/Roboto Regular/28416-28671.pbf | 3 + .../assets/Roboto Regular/28672-28927.pbf | 3 + .../assets/Roboto Regular/28928-29183.pbf | 3 + .../assets/Roboto Regular/29184-29439.pbf | 3 + .../assets/Roboto Regular/29440-29695.pbf | 3 + .../assets/Roboto Regular/29696-29951.pbf | 3 + .../assets/Roboto Regular/29952-30207.pbf | 3 + .../assets/Roboto Regular/30208-30463.pbf | 3 + .../assets/Roboto Regular/30464-30719.pbf | 3 + .../main/assets/Roboto Regular/3072-3327.pbf | 3 + .../assets/Roboto Regular/30720-30975.pbf | 3 + .../assets/Roboto Regular/30976-31231.pbf | 3 + .../assets/Roboto Regular/31232-31487.pbf | 3 + .../assets/Roboto Regular/31488-31743.pbf | 3 + .../assets/Roboto Regular/31744-31999.pbf | 3 + .../assets/Roboto Regular/32000-32255.pbf | 3 + .../assets/Roboto Regular/32256-32511.pbf | 3 + .../assets/Roboto Regular/32512-32767.pbf | 3 + .../assets/Roboto Regular/32768-33023.pbf | 3 + .../assets/Roboto Regular/33024-33279.pbf | 3 + .../main/assets/Roboto Regular/3328-3583.pbf | 3 + .../assets/Roboto Regular/33280-33535.pbf | 3 + .../assets/Roboto Regular/33536-33791.pbf | 3 + .../assets/Roboto Regular/33792-34047.pbf | 3 + .../assets/Roboto Regular/34048-34303.pbf | 3 + .../assets/Roboto Regular/34304-34559.pbf | 3 + .../assets/Roboto Regular/34560-34815.pbf | 3 + .../assets/Roboto Regular/34816-35071.pbf | 3 + .../assets/Roboto Regular/35072-35327.pbf | 3 + .../assets/Roboto Regular/35328-35583.pbf | 3 + .../assets/Roboto Regular/35584-35839.pbf | 3 + .../main/assets/Roboto Regular/3584-3839.pbf | 3 + .../assets/Roboto Regular/35840-36095.pbf | 3 + .../assets/Roboto Regular/36096-36351.pbf | 3 + .../assets/Roboto Regular/36352-36607.pbf | 3 + .../assets/Roboto Regular/36608-36863.pbf | 3 + .../assets/Roboto Regular/36864-37119.pbf | 3 + .../assets/Roboto Regular/37120-37375.pbf | 3 + .../assets/Roboto Regular/37376-37631.pbf | 3 + .../assets/Roboto Regular/37632-37887.pbf | 3 + .../assets/Roboto Regular/37888-38143.pbf | 3 + .../assets/Roboto Regular/38144-38399.pbf | 3 + .../main/assets/Roboto Regular/3840-4095.pbf | 3 + .../assets/Roboto Regular/38400-38655.pbf | 3 + .../assets/Roboto Regular/38656-38911.pbf | 3 + .../assets/Roboto Regular/38912-39167.pbf | 3 + .../assets/Roboto Regular/39168-39423.pbf | 3 + .../assets/Roboto Regular/39424-39679.pbf | 3 + .../assets/Roboto Regular/39680-39935.pbf | 3 + .../assets/Roboto Regular/39936-40191.pbf | 3 + .../assets/Roboto Regular/40192-40447.pbf | 3 + .../assets/Roboto Regular/40448-40703.pbf | 3 + .../assets/Roboto Regular/40704-40959.pbf | 3 + .../main/assets/Roboto Regular/4096-4351.pbf | 3 + .../assets/Roboto Regular/40960-41215.pbf | 3 + .../assets/Roboto Regular/41216-41471.pbf | 3 + .../assets/Roboto Regular/41472-41727.pbf | 3 + .../assets/Roboto Regular/41728-41983.pbf | 3 + .../assets/Roboto Regular/41984-42239.pbf | 3 + .../assets/Roboto Regular/42240-42495.pbf | 3 + .../assets/Roboto Regular/42496-42751.pbf | 3 + .../assets/Roboto Regular/42752-43007.pbf | Bin 0 -> 1899 bytes .../assets/Roboto Regular/43008-43263.pbf | 3 + .../assets/Roboto Regular/43264-43519.pbf | 3 + .../main/assets/Roboto Regular/4352-4607.pbf | 3 + .../assets/Roboto Regular/43520-43775.pbf | 3 + .../assets/Roboto Regular/43776-44031.pbf | Bin 0 -> 571 bytes .../assets/Roboto Regular/44032-44287.pbf | 3 + .../assets/Roboto Regular/44288-44543.pbf | 3 + .../assets/Roboto Regular/44544-44799.pbf | 3 + .../assets/Roboto Regular/44800-45055.pbf | 3 + .../assets/Roboto Regular/45056-45311.pbf | 3 + .../assets/Roboto Regular/45312-45567.pbf | 3 + .../assets/Roboto Regular/45568-45823.pbf | 3 + .../assets/Roboto Regular/45824-46079.pbf | 3 + .../main/assets/Roboto Regular/4608-4863.pbf | 3 + .../assets/Roboto Regular/46080-46335.pbf | 3 + .../assets/Roboto Regular/46336-46591.pbf | 3 + .../assets/Roboto Regular/46592-46847.pbf | 3 + .../assets/Roboto Regular/46848-47103.pbf | 3 + .../assets/Roboto Regular/47104-47359.pbf | 3 + .../assets/Roboto Regular/47360-47615.pbf | 3 + .../assets/Roboto Regular/47616-47871.pbf | 3 + .../assets/Roboto Regular/47872-48127.pbf | 3 + .../assets/Roboto Regular/48128-48383.pbf | 3 + .../assets/Roboto Regular/48384-48639.pbf | 3 + .../main/assets/Roboto Regular/4864-5119.pbf | 3 + .../assets/Roboto Regular/48640-48895.pbf | 3 + .../assets/Roboto Regular/48896-49151.pbf | 3 + .../assets/Roboto Regular/49152-49407.pbf | 3 + .../assets/Roboto Regular/49408-49663.pbf | 3 + .../assets/Roboto Regular/49664-49919.pbf | 3 + .../assets/Roboto Regular/49920-50175.pbf | 3 + .../assets/Roboto Regular/50176-50431.pbf | 3 + .../assets/Roboto Regular/50432-50687.pbf | 3 + .../assets/Roboto Regular/50688-50943.pbf | 3 + .../assets/Roboto Regular/50944-51199.pbf | 3 + .../main/assets/Roboto Regular/512-767.pbf | Bin 0 -> 4559 bytes .../main/assets/Roboto Regular/5120-5375.pbf | 3 + .../assets/Roboto Regular/51200-51455.pbf | 3 + .../assets/Roboto Regular/51456-51711.pbf | 3 + .../assets/Roboto Regular/51712-51967.pbf | 3 + .../assets/Roboto Regular/51968-52223.pbf | 3 + .../assets/Roboto Regular/52224-52479.pbf | 3 + .../assets/Roboto Regular/52480-52735.pbf | 3 + .../assets/Roboto Regular/52736-52991.pbf | 3 + .../assets/Roboto Regular/52992-53247.pbf | 3 + .../assets/Roboto Regular/53248-53503.pbf | 3 + .../assets/Roboto Regular/53504-53759.pbf | 3 + .../main/assets/Roboto Regular/5376-5631.pbf | 3 + .../assets/Roboto Regular/53760-54015.pbf | 3 + .../assets/Roboto Regular/54016-54271.pbf | 3 + .../assets/Roboto Regular/54272-54527.pbf | 3 + .../assets/Roboto Regular/54528-54783.pbf | 3 + .../assets/Roboto Regular/54784-55039.pbf | 3 + .../assets/Roboto Regular/55040-55295.pbf | 3 + .../assets/Roboto Regular/55296-55551.pbf | 3 + .../assets/Roboto Regular/55552-55807.pbf | 3 + .../assets/Roboto Regular/55808-56063.pbf | 3 + .../assets/Roboto Regular/56064-56319.pbf | 3 + .../main/assets/Roboto Regular/5632-5887.pbf | 3 + .../assets/Roboto Regular/56320-56575.pbf | 3 + .../assets/Roboto Regular/56576-56831.pbf | 3 + .../assets/Roboto Regular/56832-57087.pbf | 3 + .../assets/Roboto Regular/57088-57343.pbf | 3 + .../assets/Roboto Regular/57344-57599.pbf | 3 + .../assets/Roboto Regular/57600-57855.pbf | 3 + .../assets/Roboto Regular/57856-58111.pbf | 3 + .../assets/Roboto Regular/58112-58367.pbf | 3 + .../assets/Roboto Regular/58368-58623.pbf | 3 + .../assets/Roboto Regular/58624-58879.pbf | 3 + .../main/assets/Roboto Regular/5888-6143.pbf | 3 + .../assets/Roboto Regular/58880-59135.pbf | 3 + .../assets/Roboto Regular/59136-59391.pbf | 3 + .../assets/Roboto Regular/59392-59647.pbf | 3 + .../assets/Roboto Regular/59648-59903.pbf | 3 + .../assets/Roboto Regular/59904-60159.pbf | 3 + .../assets/Roboto Regular/60160-60415.pbf | 3 + .../assets/Roboto Regular/60416-60671.pbf | 3 + .../assets/Roboto Regular/60672-60927.pbf | 3 + .../assets/Roboto Regular/60928-61183.pbf | 3 + .../assets/Roboto Regular/61184-61439.pbf | 3 + .../main/assets/Roboto Regular/6144-6399.pbf | 3 + .../assets/Roboto Regular/61440-61695.pbf | 3 + .../assets/Roboto Regular/61696-61951.pbf | 3 + .../assets/Roboto Regular/61952-62207.pbf | 3 + .../assets/Roboto Regular/62208-62463.pbf | 3 + .../assets/Roboto Regular/62464-62719.pbf | 3 + .../assets/Roboto Regular/62720-62975.pbf | 3 + .../assets/Roboto Regular/62976-63231.pbf | 3 + .../assets/Roboto Regular/63232-63487.pbf | 3 + .../assets/Roboto Regular/63488-63743.pbf | 3 + .../assets/Roboto Regular/63744-63999.pbf | 3 + .../main/assets/Roboto Regular/6400-6655.pbf | 3 + .../assets/Roboto Regular/64000-64255.pbf | 3 + .../assets/Roboto Regular/64256-64511.pbf | Bin 0 -> 15620 bytes .../assets/Roboto Regular/64512-64767.pbf | 3 + .../assets/Roboto Regular/64768-65023.pbf | 3 + .../assets/Roboto Regular/65024-65279.pbf | Bin 0 -> 104 bytes .../assets/Roboto Regular/65280-65535.pbf | Bin 0 -> 2063 bytes .../main/assets/Roboto Regular/6656-6911.pbf | 3 + .../main/assets/Roboto Regular/6912-7167.pbf | 3 + .../main/assets/Roboto Regular/7168-7423.pbf | 3 + .../main/assets/Roboto Regular/7424-7679.pbf | 3 + .../main/assets/Roboto Regular/768-1023.pbf | Bin 0 -> 37852 bytes .../main/assets/Roboto Regular/7680-7935.pbf | Bin 0 -> 58681 bytes .../main/assets/Roboto Regular/7936-8191.pbf | Bin 0 -> 930 bytes .../main/assets/Roboto Regular/8192-8447.pbf | Bin 0 -> 22915 bytes .../main/assets/Roboto Regular/8448-8703.pbf | Bin 0 -> 5704 bytes .../main/assets/Roboto Regular/8704-8959.pbf | Bin 0 -> 5692 bytes .../main/assets/Roboto Regular/8960-9215.pbf | 3 + .../main/assets/Roboto Regular/9216-9471.pbf | 3 + .../main/assets/Roboto Regular/9472-9727.pbf | Bin 0 -> 500 bytes .../main/assets/Roboto Regular/9728-9983.pbf | 3 + .../main/assets/Roboto Regular/9984-10239.pbf | 4 + .../core/mapbox/src/main/assets/sprites.json | 261 + .../core/mapbox/src/main/assets/sprites.png | Bin 0 -> 17154 bytes .../mapbox/src/main/assets/sprites@2x.json | 261 + .../mapbox/src/main/assets/sprites@2x.png | Bin 0 -> 38683 bytes .../assets/style-mapbox-outdoors-v12.json | 13845 ++++++++++++++++ .../assets/style-microg-normal-mapbox.json | 4392 +++++ .../assets/style-microg-normal-stadia.json | 4735 ++++++ .../assets/style-microg-satellite-mapbox.json | 3489 ++++ .../assets/style-microg-satellite-stadia.json | 3632 ++++ .../main/assets/style-stadia-outdoors.json | 5912 +++++++ .../gms/maps_dynamite/ModuleDescriptor.java | 14 + .../gms/maps/internal/CreatorImpl.java | 102 + .../android/accounts/v1/MapboxAccounts.java | 28 + .../gms/maps/mapbox/AbstractGoogleMap.kt | 171 + .../maps/mapbox/CameraBoundsWithSizeUpdate.kt | 107 + .../gms/maps/mapbox/CameraUpdateFactory.kt | 167 + .../gms/maps/mapbox/GoogleLocationEngine.kt | 63 + .../org/microg/gms/maps/mapbox/GoogleMap.kt | 993 ++ .../microg/gms/maps/mapbox/LiteGoogleMap.kt | 678 + .../org/microg/gms/maps/mapbox/MapFragment.kt | 133 + .../org/microg/gms/maps/mapbox/MapView.kt | 88 + .../org/microg/gms/maps/mapbox/Pattern.kt | 88 + .../org/microg/gms/maps/mapbox/Projection.kt | 132 + .../gms/maps/mapbox/SourceLocationEngine.kt | 69 + .../maps/mapbox/StreetViewPanoramaFragment.kt | 63 + .../gms/maps/mapbox/StreetViewPanoramaView.kt | 54 + .../org/microg/gms/maps/mapbox/Styles.kt | 452 + .../org/microg/gms/maps/mapbox/UiSettings.kt | 201 + .../gms/maps/mapbox/model/BitmapDescriptor.kt | 63 + .../mapbox/model/BitmapDescriptorFactory.kt | 211 + .../microg/gms/maps/mapbox/model/Circle.kt | 339 + .../gms/maps/mapbox/model/GroundOverlay.kt | 174 + .../gms/maps/mapbox/model/InfoWindow.kt | 171 + .../microg/gms/maps/mapbox/model/Marker.kt | 334 + .../microg/gms/maps/mapbox/model/Markup.kt | 45 + .../microg/gms/maps/mapbox/model/Polygon.kt | 266 + .../microg/gms/maps/mapbox/model/Polyline.kt | 187 + .../gms/maps/mapbox/model/TileOverlay.kt | 64 + .../gms/maps/mapbox/utils/MapContext.kt | 81 + .../gms/maps/mapbox/utils/MultiArchLoader.kt | 85 + .../gms/maps/mapbox/utils/typeConverter.kt | 101 + .../res/drawable-hdpi/maps_default_marker.png | Bin 0 -> 1974 bytes .../res/drawable-ldpi/maps_default_marker.png | Bin 0 -> 946 bytes .../res/drawable-mdpi/maps_default_marker.png | Bin 0 -> 1277 bytes .../drawable-xhdpi/maps_default_marker.png | Bin 0 -> 2745 bytes .../drawable-xxhdpi/maps_default_marker.png | Bin 0 -> 4277 bytes .../drawable-xxxhdpi/maps_default_marker.png | Bin 0 -> 5890 bytes .../src/main/res/drawable/location_dot.xml | 5 + .../main/res/drawable/maps_default_bubble.xml | 33 + .../res/layout/maps_default_bubble_layout.xml | 34 + play-services-maps/core/vtm/build.gradle | 79 + .../core/vtm/microg-theme/build.gradle | 16 + .../resources/assets/styles/microg.xml | 546 + .../resources/assets/symbols/dot_white.svg | 13 + .../assets/symbols/transit/train_station.svg | 7 + .../symbols/transit/train_station_small.svg | 7 + .../src/org/oscim/theme/MicrogThemes.java | 41 + .../core/vtm/src/main/AndroidManifest.xml | 39 + .../gms/maps/internal/CreatorImpl.java | 102 + .../maps/vtm/ApplicationContextWrapper.java | 50 + .../org/microg/gms/maps/vtm/BackendMap.java | 340 + .../microg/gms/maps/vtm/BackendMapView.java | 156 + .../microg/gms/maps/vtm/ContainerLayout.java | 34 + .../gms/maps/vtm/GmsMapsTypeHelper.java | 90 + .../microg/gms/maps/vtm/GoogleMapImpl.java | 735 + .../microg/gms/maps/vtm/MapFragmentImpl.java | 180 + .../org/microg/gms/maps/vtm/MapViewImpl.java | 151 + .../microg/gms/maps/vtm/ProjectionImpl.java | 59 + .../gms/maps/vtm/ResourcesContainer.java | 35 + .../vtm/StreetViewPanoramaFragmentImpl.java | 97 + .../maps/vtm/StreetViewPanoramaViewImpl.java | 81 + .../microg/gms/maps/vtm/UiSettingsImpl.java | 170 + .../vtm/bitmap/AbstractBitmapDescriptor.java | 41 + .../vtm/bitmap/AssetBitmapDescriptor.java | 41 + .../vtm/bitmap/BitmapBitmapDescriptor.java | 38 + .../bitmap/BitmapDescriptorFactoryImpl.java | 72 + .../maps/vtm/bitmap/BitmapDescriptorImpl.java | 93 + .../vtm/bitmap/DefaultBitmapDescriptor.java | 105 + .../maps/vtm/bitmap/FileBitmapDescriptor.java | 34 + .../maps/vtm/bitmap/PathBitmapDescriptor.java | 22 + .../vtm/bitmap/ResourceBitmapDescriptor.java | 55 + .../gms/maps/vtm/camera/CameraUpdate.java | 24 + .../vtm/camera/CameraUpdateFactoryImpl.java | 203 + .../vtm/camera/MapPositionCameraUpdate.java | 44 + .../gms/maps/vtm/camera/NoCameraUpdate.java | 31 + .../gms/maps/vtm/data/SharedTileCache.java | 138 + .../gms/maps/vtm/data/SharedTileProvider.java | 94 + .../gms/maps/vtm/markup/CircleImpl.java | 214 + .../maps/vtm/markup/ClearableVectorLayer.java | 30 + .../gms/maps/vtm/markup/DrawableMarkup.java | 26 + .../maps/vtm/markup/GroundOverlayImpl.java | 165 + .../gms/maps/vtm/markup/InfoWindow.java | 165 + .../gms/maps/vtm/markup/MarkerImpl.java | 289 + .../gms/maps/vtm/markup/MarkerItemMarkup.java | 33 + .../microg/gms/maps/vtm/markup/Markup.java | 41 + .../gms/maps/vtm/markup/PolygonImpl.java | 242 + .../gms/maps/vtm/markup/PolylineImpl.java | 237 + .../gms/maps/vtm/markup/TileOverlayImpl.java | 87 + .../main/res/drawable/maps_default_marker.png | Bin 0 -> 4303 bytes .../res/drawable/maps_default_window.9.png | Bin 0 -> 1335 bytes .../core/vtm/src/main/res/drawable/nop.png | Bin 0 -> 169 bytes .../src/main/AndroidManifest.xml | 22 + .../android/gms/maps/GoogleMapOptions.aidl | 3 + .../gms/maps/StreetViewPanoramaOptions.aidl | 8 + .../ICameraUpdateFactoryDelegate.aidl | 20 + .../maps/internal/ICancelableCallback.aidl | 6 + .../android/gms/maps/internal/ICreator.aidl | 24 + .../gms/maps/internal/IGoogleMapDelegate.aidl | 152 + .../gms/maps/internal/IInfoWindowAdapter.aidl | 9 + .../internal/ILocationSourceDelegate.aidl | 8 + .../maps/internal/IMapFragmentDelegate.aidl | 27 + .../gms/maps/internal/IMapViewDelegate.aidl | 23 + .../internal/IOnCameraChangeListener.aidl | 7 + .../maps/internal/IOnCameraIdleListener.aidl | 5 + .../IOnCameraMoveCanceledListener.aidl | 5 + .../maps/internal/IOnCameraMoveListener.aidl | 5 + .../IOnCameraMoveStartedListener.aidl | 5 + .../maps/internal/IOnCircleClickListener.aidl | 7 + .../IOnGroundOverlayClickListener.aidl | 7 + .../IOnIndoorStateChangeListener.aidl | 6 + .../internal/IOnInfoWindowClickListener.aidl | 7 + .../internal/IOnInfoWindowCloseListener.aidl | 7 + .../IOnInfoWindowLongClickListener.aidl | 7 + .../internal/IOnLocationChangeListener.aidl | 7 + .../maps/internal/IOnMapClickListener.aidl | 7 + .../maps/internal/IOnMapLoadedCallback.aidl | 5 + .../internal/IOnMapLongClickListener.aidl | 7 + .../maps/internal/IOnMapReadyCallback.aidl | 7 + .../maps/internal/IOnMarkerClickListener.aidl | 7 + .../maps/internal/IOnMarkerDragListener.aidl | 9 + .../IOnMyLocationButtonClickListener.aidl | 5 + .../internal/IOnMyLocationChangeListener.aidl | 7 + .../internal/IOnMyLocationClickListener.aidl | 7 + .../internal/IOnPolygonClickListener.aidl | 7 + .../internal/IOnPolylineClickListener.aidl | 7 + ...treetViewPanoramaCameraChangeListener.aidl | 12 + .../IOnStreetViewPanoramaChangeListener.aidl | 12 + .../IOnStreetViewPanoramaClickListener.aidl | 12 + ...OnStreetViewPanoramaLongClickListener.aidl | 12 + .../IOnStreetViewPanoramaReadyCallback.aidl | 12 + .../maps/internal/IProjectionDelegate.aidl | 11 + .../maps/internal/ISnapshotReadyCallback.aidl | 9 + .../internal/IStreetViewPanoramaDelegate.aidl | 42 + .../IStreetViewPanoramaFragmentDelegate.aidl | 30 + .../IStreetViewPanoramaViewDelegate.aidl | 26 + .../maps/internal/IUiSettingsDelegate.aidl | 25 + .../gms/maps/model/CameraPosition.aidl | 3 + .../google/android/gms/maps/model/Cap.aidl | 3 + .../android/gms/maps/model/CircleOptions.aidl | 3 + .../google/android/gms/maps/model/Dash.aidl | 3 + .../google/android/gms/maps/model/Dot.aidl | 3 + .../google/android/gms/maps/model/Gap.aidl | 3 + .../gms/maps/model/GroundOverlayOptions.aidl | 3 + .../google/android/gms/maps/model/LatLng.aidl | 3 + .../android/gms/maps/model/LatLngBounds.aidl | 3 + .../gms/maps/model/MapStyleOptions.aidl | 3 + .../android/gms/maps/model/MarkerOptions.aidl | 3 + .../android/gms/maps/model/PatternItem.aidl | 3 + .../gms/maps/model/PolygonOptions.aidl | 3 + .../gms/maps/model/PolylineOptions.aidl | 3 + .../maps/model/StreetViewPanoramaCamera.aidl | 8 + .../model/StreetViewPanoramaLocation.aidl | 8 + .../model/StreetViewPanoramaOrientation.aidl | 8 + .../gms/maps/model/StreetViewSource.aidl | 8 + .../android/gms/maps/model/StyleSpan.aidl | 3 + .../google/android/gms/maps/model/Tile.aidl | 3 + .../gms/maps/model/TileOverlayOptions.aidl | 3 + .../android/gms/maps/model/VisibleRegion.aidl | 3 + .../IBitmapDescriptorFactoryDelegate.aidl | 14 + .../maps/model/internal/ICircleDelegate.aidl | 32 + .../internal/IGroundOverlayDelegate.aidl | 33 + .../internal/IIndoorBuildingDelegate.aidl | 10 + .../model/internal/IIndoorLevelDelegate.aidl | 9 + .../maps/model/internal/IMarkerDelegate.aidl | 37 + .../maps/model/internal/IPolygonDelegate.aidl | 41 + .../model/internal/IPolylineDelegate.aidl | 40 + .../model/internal/ITileOverlayDelegate.aidl | 17 + .../model/internal/ITileProviderDelegate.aidl | 7 + .../google/android/gms/maps/CameraUpdate.java | 27 + .../android/gms/maps/CameraUpdateFactory.java | 48 + .../google/android/gms/maps/GoogleMap.java | 199 + .../android/gms/maps/GoogleMapOptions.java | 479 + .../google/android/gms/maps/MapFragment.java | 11 + .../com/google/android/gms/maps/MapView.java | 155 + .../android/gms/maps/MapsInitializer.java | 120 + .../android/gms/maps/OnMapReadyCallback.java | 42 + .../maps/OnMapsSdkInitializedCallback.java | 23 + .../OnStreetViewPanoramaReadyCallback.java | 29 + .../android/gms/maps/StreetViewPanorama.java | 421 + .../gms/maps/StreetViewPanoramaFragment.java | 11 + .../gms/maps/StreetViewPanoramaOptions.java | 308 + .../gms/maps/StreetViewPanoramaView.java | 122 + .../gms/maps/model/BitmapDescriptor.java | 38 + .../maps/model/BitmapDescriptorFactory.java | 24 + .../android/gms/maps/model/ButtCap.java | 31 + .../gms/maps/model/CameraPosition.java | 249 + .../google/android/gms/maps/model/Cap.java | 104 + .../google/android/gms/maps/model/Circle.java | 185 + .../android/gms/maps/model/CircleOptions.java | 268 + .../android/gms/maps/model/CustomCap.java | 51 + .../google/android/gms/maps/model/Dash.java | 39 + .../google/android/gms/maps/model/Dot.java | 32 + .../google/android/gms/maps/model/Gap.java | 39 + .../gms/maps/model/GroundOverlayOptions.java | 354 + .../android/gms/maps/model/JointType.java | 27 + .../google/android/gms/maps/model/LatLng.java | 119 + .../android/gms/maps/model/LatLngBounds.java | 227 + .../gms/maps/model/MapStyleOptions.java | 47 + .../android/gms/maps/model/MarkerOptions.java | 341 + .../android/gms/maps/model/PatternItem.java | 56 + .../gms/maps/model/PolygonOptions.java | 302 + .../gms/maps/model/PolylineOptions.java | 345 + .../android/gms/maps/model/RoundCap.java | 29 + .../maps/model/RuntimeRemoteException.java | 18 + .../android/gms/maps/model/SquareCap.java | 29 + .../android/gms/maps/model/StampStyle.java | 18 + .../maps/model/StreetViewPanoramaCamera.java | 199 + .../maps/model/StreetViewPanoramaLink.java | 72 + .../model/StreetViewPanoramaLocation.java | 87 + .../model/StreetViewPanoramaOrientation.java | 150 + .../gms/maps/model/StreetViewSource.java | 81 + .../android/gms/maps/model/StrokeStyle.java | 23 + .../android/gms/maps/model/StyleSpan.java | 25 + .../google/android/gms/maps/model/Tile.java | 69 + .../gms/maps/model/TileOverlayOptions.java | 170 + .../android/gms/maps/model/TileProvider.java | 41 + .../android/gms/maps/model/VisibleRegion.java | 67 + .../android/gms/maps/model/package-info.java | 20 + .../google/android/gms/maps/package-info.java | 11 + .../microg/gms/maps/MapLifecycleDelegate.java | 14 + .../org/microg/gms/maps/MapViewDelegate.java | 162 + .../gms/maps/MapViewLifecycleHelper.java | 57 + .../org/microg/gms/maps/MapsBundleHelper.java | 65 + .../microg/gms/maps/MapsContextLoader.java | 85 + .../gms/maps/StreetViewLifecycleDelegate.java | 14 + .../maps/StreetViewPanoramaViewDelegate.java | 141 + ...StreetViewPanoramaViewLifecycleHelper.java | 57 + .../src/main/res/values/maps_attrs.xml | 41 + play-services-measurement-base/build.gradle | 41 + .../src/main/AndroidManifest.xml | 6 + .../IAppMeasurementDynamiteService.aidl | 70 + .../api/internal/IBundleReceiver.aidl | 5 + .../IDynamiteUploadBatchesCallback.aidl | 5 + .../api/internal/IEventHandlerProxy.aidl | 6 + .../api/internal/IStringProvider.aidl | 4 + .../api/internal/InitializationParams.aidl | 3 + .../api/internal/ScionActivityInfo.aidl | 3 + .../api/internal/InitializationParams.java | 56 + .../api/internal/ScionActivityInfo.java | 37 + .../barcode-scanning/build.gradle | 54 + .../src/main/AndroidManifest.xml | 9 + .../vision/barcode/aidls/IBarcodeScanner.aidl | 11 + .../barcode/aidls/IBarcodeScannerCreator.aidl | 9 + .../vision/barcode/internal/Barcode.aidl | 3 + .../internal/BarcodeScannerOptions.aidl | 3 + .../barcode/internal/ImageMetadata.aidl | 3 + .../vision/barcode/internal/Address.java | 32 + .../vision/barcode/internal/Barcode.java | 85 + .../internal/BarcodeScannerOptions.java | 27 + .../barcode/internal/CalendarDateTime.java | 41 + .../barcode/internal/CalendarEvent.java | 37 + .../vision/barcode/internal/ContactInfo.java | 45 + .../barcode/internal/DriverLicense.java | 66 + .../mlkit/vision/barcode/internal/Email.java | 36 + .../vision/barcode/internal/GeoPoint.java | 27 + .../barcode/internal/ImageMetadata.java | 46 + .../vision/barcode/internal/PersonName.java | 45 + .../mlkit/vision/barcode/internal/Phone.java | 34 + .../mlkit/vision/barcode/internal/Sms.java | 27 + .../vision/barcode/internal/UrlBookmark.java | 27 + .../mlkit/vision/barcode/internal/WiFi.java | 34 + .../face-detection/build.gradle | 43 + .../src/main/AndroidManifest.xml | 9 + .../vision/face/FaceDetectionOptions.aidl | 8 + .../vision/face/FrameMetadataParcel.aidl | 8 + .../mlkit/vision/face/aidls/FaceParcel.aidl | 8 + .../vision/face/aidls/IFaceDetector.aidl | 17 + .../face/aidls/IFaceDetectorCreator.aidl | 14 + .../com/google/mlkit/vision/face/Face.java | 204 + .../google/mlkit/vision/face/FaceContour.java | 124 + .../vision/face/FaceDetectionOptions.java | 145 + .../mlkit/vision/face/FaceLandmark.java | 104 + .../vision/face/FrameMetadataParcel.java | 37 + .../vision/face/aidls/ContourParcel.java | 36 + .../mlkit/vision/face/aidls/FaceParcel.java | 74 + .../vision/face/aidls/LandmarkParcel.java | 34 + play-services-nearby/build.gradle | 43 + play-services-nearby/core/build.gradle | 75 + .../core/package/build.gradle | 47 + .../core/package/src/main/AndroidManifest.xml | 26 + .../ExposureNotificationsSettingsProvider.kt | 65 + .../core/src/main/AndroidManifest.xml | 79 + .../exposurenotification/AdvertiserService.kt | 268 + .../exposurenotification/CleanupService.kt | 64 + .../nearby/exposurenotification/Constants.kt | 46 + .../gms/nearby/exposurenotification/Crypto.kt | 122 + .../nearby/exposurenotification/DeviceInfo.kt | 620 + .../exposurenotification/ExposureDatabase.kt | 1062 ++ .../ExposureFileProvider.kt | 10 + .../ExposureNotificationService.kt | 58 + .../ExposureNotificationServiceImpl.kt | 802 + .../ExposurePreferences.kt | 44 + .../nearby/exposurenotification/Extensions.kt | 40 + .../exposurenotification/MeasuredExposure.kt | 146 + .../exposurenotification/NotifyService.kt | 140 + .../exposurenotification/ScannerService.kt | 197 + .../exposurenotification/ServiceInfo.kt | 31 + .../exposurenotification/ServiceTrigger.kt | 37 + .../ui/DotChartPreference.kt | 40 + .../exposurenotification/ui/DotChartView.kt | 285 + .../ui/ExposureNotificationsAppFragment.kt | 57 + ...sureNotificationsAppPreferencesFragment.kt | 138 + .../ExposureNotificationsConfirmActivity.kt | 252 + .../ui/ExposureNotificationsFragment.kt | 206 + .../ui/ExposureNotificationsRpisFragment.kt | 88 + .../ExposureNotificationsSettingsActivity.kt | 31 + .../nearby/exposurenotification/ui/Utils.kt | 14 + .../main/proto/TemporaryExposureKeyFile.proto | 95 + .../core/src/main/res/drawable/ic_alert.xml | 16 + .../main/res/drawable/ic_bluetooth_off.xml | 16 + .../src/main/res/drawable/ic_location_off.xml | 16 + .../res/drawable/ic_outline_location_on.xml | 13 + .../main/res/drawable/ic_virus_outline.xml | 17 + .../exposure_notifications_app_fragment.xml | 82 + ...xposure_notifications_confirm_activity.xml | 275 + .../exposure_notifications_confirm_delete.xml | 17 + ...posure_notifications_settings_activity.xml | 19 + .../main/res/layout/preference_dot_chart.xml | 12 + .../src/main/res/navigation/nav_nearby.xml | 44 + .../core/src/main/res/values-ar/strings.xml | 28 + .../core/src/main/res/values-ast/strings.xml | 2 + .../core/src/main/res/values-az/strings.xml | 49 + .../core/src/main/res/values-be/strings.xml | 75 + .../core/src/main/res/values-cs/strings.xml | 68 + .../core/src/main/res/values-de/strings.xml | 75 + .../core/src/main/res/values-eo/strings.xml | 2 + .../core/src/main/res/values-es/strings.xml | 65 + .../core/src/main/res/values-fa/strings.xml | 62 + .../core/src/main/res/values-fi/strings.xml | 2 + .../core/src/main/res/values-fil/strings.xml | 2 + .../core/src/main/res/values-fr/strings.xml | 68 + .../core/src/main/res/values-ga/strings.xml | 68 + .../core/src/main/res/values-in/strings.xml | 62 + .../core/src/main/res/values-is/strings.xml | 2 + .../core/src/main/res/values-it/strings.xml | 65 + .../core/src/main/res/values-ja/strings.xml | 7 + .../core/src/main/res/values-ko/strings.xml | 30 + .../core/src/main/res/values-lv/strings.xml | 2 + .../core/src/main/res/values-lzh/strings.xml | 2 + .../core/src/main/res/values-ml/strings.xml | 12 + .../src/main/res/values-nb-rNO/strings.xml | 17 + .../core/src/main/res/values-nl/strings.xml | 7 + .../core/src/main/res/values-pl/strings.xml | 68 + .../src/main/res/values-pt-rBR/strings.xml | 62 + .../core/src/main/res/values-pt/strings.xml | 62 + .../core/src/main/res/values-ro/strings.xml | 68 + .../core/src/main/res/values-ru/strings.xml | 75 + .../core/src/main/res/values-sl/strings.xml | 3 + .../core/src/main/res/values-sr/strings.xml | 68 + .../core/src/main/res/values-sv/strings.xml | 68 + .../core/src/main/res/values-ta/strings.xml | 62 + .../core/src/main/res/values-th/strings.xml | 62 + .../core/src/main/res/values-tr/strings.xml | 62 + .../core/src/main/res/values-ug/strings.xml | 62 + .../core/src/main/res/values-uk/strings.xml | 68 + .../core/src/main/res/values-vi/strings.xml | 62 + .../src/main/res/values-zh-rCN/strings.xml | 75 + .../src/main/res/values-zh-rTW/strings.xml | 6 + .../core/src/main/res/values/strings.xml | 77 + .../preferences_exposure_notifications.xml | 90 + ...preferences_exposure_notifications_app.xml | 40 + ...s_exposure_notifications_exportedfiles.xml | 4 + ...references_exposure_notifications_rpis.xml | 33 + .../exposurenotification/CryptoTest.java | 64 + .../exposurenotification/TestVectors.java | 976 ++ .../src/main/AndroidManifest.xml | 13 + .../exposurenotification/DailySummary.aidl | 8 + .../DiagnosisKeysDataMapping.aidl | 8 + .../ExposureInformation.aidl | 8 + .../exposurenotification/ExposureSummary.aidl | 8 + .../exposurenotification/ExposureWindow.aidl | 8 + .../PackageConfiguration.aidl | 8 + .../TemporaryExposureKey.aidl | 8 + .../GetCalibrationConfidenceParams.aidl | 8 + .../internal/GetDailySummariesParams.aidl | 8 + .../GetDiagnosisKeysDataMappingParams.aidl | 8 + .../GetExposureInformationParams.aidl | 8 + .../internal/GetExposureSummaryParams.aidl | 8 + .../internal/GetExposureWindowsParams.aidl | 8 + .../GetPackageConfigurationParams.aidl | 8 + .../internal/GetStatusParams.aidl | 8 + .../GetTemporaryExposureKeyHistoryParams.aidl | 8 + .../internal/GetVersionParams.aidl | 8 + .../internal/IBooleanCallback.aidl | 12 + .../internal/IDailySummaryListCallback.aidl | 13 + .../internal/IDiagnosisKeyFileSupplier.aidl | 12 + .../IDiagnosisKeysDataMappingCallback.aidl | 13 + .../IExposureInformationListCallback.aidl | 13 + .../internal/IExposureSummaryCallback.aidl | 13 + .../internal/IExposureWindowListCallback.aidl | 13 + .../internal/IIntCallback.aidl | 12 + .../internal/ILongCallback.aidl | 12 + .../INearbyExposureNotificationService.aidl | 49 + .../IPackageConfigurationCallback.aidl | 13 + .../ITemporaryExposureKeyListCallback.aidl | 13 + .../internal/IsEnabledParams.aidl | 8 + .../internal/ProvideDiagnosisKeysParams.aidl | 8 + ...izedTemporaryExposureKeyHistoryParams.aidl | 8 + ...izedTemporaryExposureKeyReleaseParams.aidl | 8 + .../SetDiagnosisKeysDataMappingParams.aidl | 8 + .../internal/StartParams.aidl | 8 + .../internal/StopParams.aidl | 8 + .../com/google/android/gms/nearby/Nearby.java | 23 + .../CalibrationConfidence.java | 37 + .../DailySummariesConfig.java | 244 + .../exposurenotification/DailySummary.java | 158 + .../DiagnosisKeyFileProvider.java | 38 + .../DiagnosisKeysDataMapping.java | 117 + .../ExposureConfiguration.java | 212 + .../ExposureInformation.java | 156 + .../ExposureNotificationClient.java | 261 + .../ExposureNotificationStatus.java | 103 + .../ExposureNotificationStatusCodes.java | 55 + .../exposurenotification/ExposureSummary.java | 132 + .../exposurenotification/ExposureWindow.java | 165 + .../exposurenotification/Infectiousness.java | 24 + .../PackageConfiguration.java | 57 + .../exposurenotification/ReportType.java | 27 + .../exposurenotification/RiskLevel.java | 30 + .../exposurenotification/ScanInstance.java | 93 + .../TemporaryExposureKey.java | 186 + .../exposurenotification/WakeUpService.java | 21 + .../GetCalibrationConfidenceParams.java | 21 + .../internal/GetDailySummariesParams.java | 26 + .../GetDiagnosisKeysDataMappingParams.java | 21 + .../GetExposureInformationParams.java | 24 + .../internal/GetExposureSummaryParams.java | 24 + .../internal/GetExposureWindowsParams.java | 24 + .../GetPackageConfigurationParams.java | 21 + .../internal/GetStatusParams.java | 21 + .../GetTemporaryExposureKeyHistoryParams.java | 21 + .../internal/GetVersionParams.java | 22 + .../internal/IsEnabledParams.java | 22 + .../internal/ProvideDiagnosisKeysParams.java | 60 + ...izedTemporaryExposureKeyHistoryParams.java | 24 + ...izedTemporaryExposureKeyReleaseParams.java | 24 + .../SetDiagnosisKeysDataMappingParams.java | 27 + .../internal/StartParams.java | 27 + .../internal/StopParams.java | 24 + .../nearby/ExposureNotificationApiClient.java | 115 + .../ExposureNotificationClientImpl.java | 510 + play-services-oss-licenses/build.gradle | 47 + play-services-oss-licenses/core/build.gradle | 50 + .../core/src/main/AndroidManifest.xml | 17 + .../oss/licenses/core/OssLicensesService.kt | 50 + .../src/main/AndroidManifest.xml | 14 + .../gms/oss/licenses/IOSSLicenseService.aidl | 10 + .../android/gms/oss/licenses/License.aidl | 5 + .../android/gms/oss/licenses/License.java | 81 + .../gms/oss/licenses/OssLicensesActivity.java | 127 + .../oss/licenses/OssLicensesMenuActivity.java | 210 + .../oss/licenses/OssLicensesServiceImpl.java | 78 + .../microg/gms/oss/licenses/LicenseUtil.java | 104 + .../licenses/OssLicenseServiceApiClient.java | 48 + .../libraries_social_licenses_license.xml | 22 + ...aries_social_licenses_license_activity.xml | 25 + ..._social_licenses_license_menu_activity.xml | 20 + .../license_menu_activity_no_licenses.xml | 18 + .../src/main/res/values-ar/strings.xml | 9 + .../src/main/res/values-ast/strings.xml | 9 + .../src/main/res/values-az/strings.xml | 4 + .../src/main/res/values-be/strings.xml | 9 + .../src/main/res/values-cs/strings.xml | 9 + .../src/main/res/values-de/strings.xml | 9 + .../src/main/res/values-eo/strings.xml | 2 + .../src/main/res/values-es/strings.xml | 9 + .../src/main/res/values-fa/strings.xml | 9 + .../src/main/res/values-fi/strings.xml | 2 + .../src/main/res/values-fil/strings.xml | 9 + .../src/main/res/values-fr/strings.xml | 9 + .../src/main/res/values-ga/strings.xml | 9 + .../src/main/res/values-in/strings.xml | 9 + .../src/main/res/values-is/strings.xml | 9 + .../src/main/res/values-it/strings.xml | 9 + .../src/main/res/values-ja/strings.xml | 9 + .../src/main/res/values-ko/strings.xml | 9 + .../src/main/res/values-lv/strings.xml | 8 + .../src/main/res/values-lzh/strings.xml | 2 + .../src/main/res/values-ml/strings.xml | 9 + .../src/main/res/values-nb-rNO/strings.xml | 9 + .../src/main/res/values-nl/strings.xml | 7 + .../src/main/res/values-pl/strings.xml | 9 + .../src/main/res/values-pt-rBR/strings.xml | 9 + .../src/main/res/values-pt/strings.xml | 9 + .../src/main/res/values-ro/strings.xml | 9 + .../src/main/res/values-ru/strings.xml | 9 + .../src/main/res/values-sl/strings.xml | 3 + .../src/main/res/values-sr/strings.xml | 9 + .../src/main/res/values-sv/strings.xml | 9 + .../src/main/res/values-ta/strings.xml | 9 + .../src/main/res/values-th/strings.xml | 9 + .../src/main/res/values-tr/strings.xml | 9 + .../src/main/res/values-ug/strings.xml | 9 + .../src/main/res/values-uk/strings.xml | 9 + .../src/main/res/values-vi/strings.xml | 9 + .../src/main/res/values-zh-rCN/strings.xml | 9 + .../src/main/res/values-zh-rTW/strings.xml | 9 + .../src/main/res/values/strings.xml | 15 + play-services-panorama/build.gradle | 41 + play-services-panorama/core/build.gradle | 56 + .../core/src/main/AndroidManifest.xml | 15 + .../microg/gms/panorama/PanoramaService.kt | 31 + .../src/AndroidManifest.xml | 6 + .../google/android/gms/panorama/Panorama.java | 30 + .../android/gms/panorama/PanoramaApi.java | 50 + .../panorama/internal/IPanoramaCallbacks.aidl | 11 + .../panorama/internal/IPanoramaService.aidl | 13 + play-services-pay/build.gradle | 46 + play-services-pay/core/build.gradle | 56 + .../core/src/main/AndroidManifest.xml | 39 + .../kotlin/org/microg/gms/pay/PayActivity.kt | 21 + .../kotlin/org/microg/gms/pay/PayService.kt | 99 + .../microg/gms/pay/ThirdPartyPayService.kt | 92 + .../src/main/AndroidManifest.xml | 6 + .../pay/CheckReadinessForEmoneyRequest.aidl | 3 + .../android/gms/pay/EmoneyReadiness.aidl | 3 + .../gms/pay/GetMdocCredentialRequest.aidl | 3 + .../GetPayApiAvailabilityStatusRequest.aidl | 3 + ...etPendingIntentForWalletOnWearRequest.aidl | 3 + .../gms/pay/GetWalletStatusResponse.aidl | 3 + .../gms/pay/NotifyCardTapEventRequest.aidl | 3 + .../NotifyEmoneyCardStatusUpdateRequest.aidl | 3 + .../google/android/gms/pay/PayApiError.aidl | 3 + .../gms/pay/PushEmoneyCardRequest.aidl | 3 + .../android/gms/pay/SavePassesRequest.aidl | 3 + .../android/gms/pay/SyncBundleRequest.aidl | 3 + .../android/gms/pay/internal/IPayService.aidl | 5 + .../pay/internal/IPayServiceCallbacks.aidl | 35 + .../pay/internal/IThirdPartyPayService.aidl | 24 + .../pay/CheckReadinessForEmoneyRequest.java | 32 + .../android/gms/pay/EmoneyReadiness.java | 56 + .../gms/pay/EmoneyReadinessStatus.java | 49 + .../gms/pay/GetMdocCredentialRequest.java | 33 + .../GetPayApiAvailabilityStatusRequest.java | 35 + ...etPendingIntentForWalletOnWearRequest.java | 30 + .../gms/pay/GetWalletStatusResponse.java | 30 + .../gms/pay/NotifyCardTapEventRequest.java | 29 + .../NotifyEmoneyCardStatusUpdateRequest.java | 27 + .../java/com/google/android/gms/pay/Pay.java | 32 + .../gms/pay/PayApiAvailabilityStatus.java | 33 + .../google/android/gms/pay/PayApiError.java | 19 + .../com/google/android/gms/pay/PayClient.java | 188 + .../gms/pay/PushEmoneyCardRequest.java | 27 + .../android/gms/pay/SavePassesRequest.java | 33 + .../android/gms/pay/SyncBundleRequest.java | 27 + .../java/org/microg/gms/pay/PayApiClient.java | 26 + .../org/microg/gms/pay/PayClientImpl.java | 131 + .../microg/gms/pay/PayServiceCallbacks.java | 59 + .../gms/pay/ThirdPartyPayApiClient.java | 26 + play-services-phenotype/build.gradle | 44 + .../src/main/AndroidManifest.xml | 8 + .../android/gms/phenotype/Configuration.java | 19 + .../gms/phenotype/ExperimentTokens.java | 34 + .../google/android/gms/phenotype/Flag.java | 105 + .../gms/phenotype/GenericDimension.java | 19 + play-services-places-placereport/build.gradle | 35 + .../src/main/AndroidManifest.xml | 6 + .../gms/location/places/PlaceReport.java | 32 + play-services-places/build.gradle | 44 + .../src/main/AndroidManifest.xml | 6 + .../location/places/AutocompleteFilter.aidl | 3 + .../location/places/NearbyAlertRequest.aidl | 3 + .../gms/location/places/PlaceFilter.aidl | 3 + .../gms/location/places/PlaceReport.aidl | 3 + .../gms/location/places/PlaceRequest.aidl | 3 + .../gms/location/places/UserAddedPlace.aidl | 3 + .../gms/location/places/UserDataType.aidl | 3 + .../IGooglePlaceDetectionService.aidl | 5 + .../places/internal/IGooglePlacesService.aidl | 5 + .../places/internal/IPlacesCallbacks.aidl | 9 + .../places/internal/PlacesParams.aidl | 3 + .../location/places/AutocompleteFilter.java | 31 + .../location/places/NearbyAlertRequest.java | 27 + .../android/gms/location/places/Place.java | 384 + .../gms/location/places/PlaceFilter.java | 27 + .../gms/location/places/PlaceRequest.java | 26 + .../gms/location/places/UserAddedPlace.java | 31 + .../gms/location/places/UserDataType.java | 27 + .../location/places/internal/PlaceImpl.java | 145 + .../places/internal/PlacesParams.java | 40 + play-services-recaptcha/build.gradle | 41 + play-services-recaptcha/core/build.gradle | 68 + .../core/src/main/AndroidManifest.xml | 18 + .../gms/recaptcha/RecaptchaGuardImpl.kt | 133 + .../org/microg/gms/recaptcha/RecaptchaImpl.kt | 32 + .../microg/gms/recaptcha/RecaptchaService.kt | 182 + .../microg/gms/recaptcha/RecaptchaWebImpl.kt | 736 + .../core/src/main/proto/recaptcha.proto | 90 + .../src/main/AndroidManifest.xml | 7 + .../gms/recaptcha/RecaptchaAction.aidl | 3 + .../gms/recaptcha/RecaptchaHandle.aidl | 3 + .../gms/recaptcha/RecaptchaResultData.aidl | 3 + .../gms/recaptcha/internal/ExecuteParams.aidl | 3 + .../recaptcha/internal/ExecuteResults.aidl | 3 + .../recaptcha/internal/ICloseCallback.aidl | 7 + .../recaptcha/internal/IExecuteCallback.aidl | 11 + .../gms/recaptcha/internal/IInitCallback.aidl | 11 + .../recaptcha/internal/IRecaptchaService.aidl | 20 + .../gms/recaptcha/internal/InitParams.aidl | 3 + .../gms/recaptcha/internal/InitResults.aidl | 3 + .../gms/recaptcha/HttpStatusException.java | 34 + .../android/gms/recaptcha/Recaptcha.java | 42 + .../gms/recaptcha/RecaptchaAction.java | 107 + .../gms/recaptcha/RecaptchaActionType.java | 45 + .../gms/recaptcha/RecaptchaClient.java | 75 + .../gms/recaptcha/RecaptchaHandle.java | 61 + .../recaptcha/RecaptchaNetworkException.java | 26 + .../recaptcha/RecaptchaOptionalObject.java | 35 + .../gms/recaptcha/RecaptchaResultData.java | 35 + .../gms/recaptcha/RecaptchaStatusCodes.java | 69 + .../gms/recaptcha/VerificationHandle.java | 58 + .../gms/recaptcha/VerificationResult.java | 43 + .../gms/recaptcha/internal/ExecuteParams.java | 35 + .../recaptcha/internal/ExecuteResults.java | 17 + .../gms/recaptcha/internal/InitParams.java | 29 + .../gms/recaptcha/internal/InitResults.java | 17 + .../gms/recaptcha/RecaptchaClientImpl.java | 131 + .../gms/recaptcha/RecaptchaGmsClient.java | 56 + play-services-safetynet/build.gradle | 41 + play-services-safetynet/core/build.gradle | 72 + .../core/src/main/AndroidManifest.xml | 29 + .../org/microg/gms/safetynet/Attestation.java | 206 + .../microg/gms/safetynet/ReCaptchaActivity.kt | 240 + .../gms/safetynet/SafetyNetClientService.kt | 277 + .../microg/gms/safetynet/SafetyNetDatabase.kt | 154 + .../gms/safetynet/SafetyNetPreferences.kt | 31 + .../gms/safetynet/SafetyNetRequestType.kt | 8 + .../microg/gms/safetynet/SafetyNetSummary.kt | 87 + .../core/src/main/proto/safetynet.proto | 34 + .../src/main/res/drawable/ic_recaptcha.xml | 64 + .../src/main/res/layout/recaptcha_window.xml | 68 + .../src/main/AndroidManifest.xml | 6 + .../gms/safetynet/AttestationData.aidl | 3 + .../gms/safetynet/HarmfulAppsData.aidl | 3 + .../gms/safetynet/HarmfulAppsInfo.aidl | 3 + .../gms/safetynet/RecaptchaResultData.aidl | 3 + .../gms/safetynet/RemoveHarmfulAppData.aidl | 3 + .../gms/safetynet/SafeBrowsingData.aidl | 3 + .../internal/ISafetyNetCallbacks.aidl | 21 + .../safetynet/internal/ISafetyNetService.aidl | 25 + .../gms/safetynet/AttestationData.java | 29 + .../gms/safetynet/HarmfulAppsData.java | 49 + .../gms/safetynet/HarmfulAppsInfo.java | 21 + .../gms/safetynet/RecaptchaResultData.java | 15 + .../gms/safetynet/RemoveHarmfulAppData.java | 17 + .../gms/safetynet/SafeBrowsingData.java | 33 + .../android/gms/safetynet/SafetyNet.java | 61 + .../android/gms/safetynet/SafetyNetApi.java | 129 + .../gms/safetynet/SafetyNetClient.java | 180 + .../gms/safetynet/SafetyNetStatusCodes.java | 71 + .../gms/safetynet/VerifyAppsConstants.java | 52 + .../ISafetyNetCallbacksDefaultStub.java | 58 + .../gms/safetynet/SafetyNetApiImpl.java | 40 + .../gms/safetynet/SafetyNetGmsClient.java | 46 + play-services-tapandpay/build.gradle | 41 + play-services-tapandpay/core/build.gradle | 56 + .../core/src/main/AndroidManifest.xml | 16 + .../microg/gms/tapandpay/TapAndPayService.kt | 143 + .../src/main/AndroidManifest.xml | 6 + .../firstparty/GetActiveAccountResponse.aidl | 3 + .../firstparty/GetAllCardsResponse.aidl | 3 + .../firstparty/RefreshSeCardsResponse.aidl | 3 + .../gms/tapandpay/firstparty/TokenStatus.aidl | 3 + .../tapandpay/internal/ITapAndPayService.aidl | 51 + .../internal/ITapAndPayServiceCallbacks.aidl | 59 + .../firstparty/GetActiveAccountRequest.aidl | 3 + .../firstparty/GetAllCardsRequest.aidl | 3 + .../firstparty/RefreshSeCardsRequest.aidl | 3 + .../firstparty/SetActiveAccountRequest.aidl | 3 + .../gms/tapandpay/issuer/TokenInfo.aidl | 3 + .../gms/tapandpay/issuer/TokenStatus.aidl | 3 + .../gms/tapandpay/TapAndPayStatusCodes.java | 19 + .../gms/tapandpay/firstparty/AccountInfo.java | 53 + .../gms/tapandpay/firstparty/CardInfo.java | 87 + .../firstparty/GetActiveAccountResponse.java | 25 + .../firstparty/GetAllCardsResponse.java | 46 + .../firstparty/RefreshSeCardsResponse.java | 12 + .../tapandpay/firstparty/TokenReference.java | 17 + .../gms/tapandpay/firstparty/TokenStatus.java | 19 + .../firstparty/GetActiveAccountRequest.java | 12 + .../firstparty/GetAllCardsRequest.java | 20 + .../firstparty/RefreshSeCardsRequest.java | 12 + .../firstparty/SetActiveAccountRequest.java | 17 + .../gms/tapandpay/issuer/TokenInfo.java | 22 + .../gms/tapandpay/issuer/TokenStatus.java | 32 + play-services-tasks/build.gradle | 35 + play-services-tasks/ktx/build.gradle | 46 + .../ktx/src/main/AndroidManifest.xml | 7 + .../com/google/android/gms/tasks/Tasks.kt | 151 + .../src/main/AndroidManifest.xml | 7 + .../android/gms/tasks/CancellationToken.java | 88 + .../gms/tasks/CancellationTokenSource.java | 46 + .../android/gms/tasks/Continuation.java | 62 + .../DuplicateTaskCompletionException.java | 32 + .../android/gms/tasks/OnCanceledListener.java | 22 + .../android/gms/tasks/OnCompleteListener.java | 26 + .../android/gms/tasks/OnFailureListener.java | 27 + .../android/gms/tasks/OnSuccessListener.java | 26 + .../gms/tasks/OnTokenCanceledListener.java | 24 + .../gms/tasks/RuntimeExecutionException.java | 25 + .../gms/tasks/SuccessContinuation.java | 42 + .../com/google/android/gms/tasks/Task.java | 292 + .../gms/tasks/TaskCompletionSource.java | 121 + .../android/gms/tasks/TaskExecutors.java | 33 + .../com/google/android/gms/tasks/Tasks.java | 306 + .../gms/tasks/CancellationTokenImpl.java | 32 + .../microg/gms/tasks/CancelledExecutor.java | 34 + .../microg/gms/tasks/CompletedExecutor.java | 33 + .../gms/tasks/ContinuationExecutor.java | 46 + .../gms/tasks/ContinuationWithExecutor.java | 52 + .../org/microg/gms/tasks/FailureExecutor.java | 33 + .../tasks/SuccessContinuationExecutor.java | 54 + .../org/microg/gms/tasks/SuccessExecutor.java | 33 + .../java/org/microg/gms/tasks/TaskImpl.java | 240 + .../org/microg/gms/tasks/UpdateExecutor.java | 27 + .../org/microg/gms/tasks/UpdateListener.java | 14 + .../UpdateListenerLifecycleObserver.java | 98 + play-services-threadnetwork/build.gradle | 44 + play-services-threadnetwork/core/build.gradle | 49 + .../core/src/main/AndroidManifest.xml | 16 + .../gms/threadnetwork/ThreadNetworkService.kt | 95 + .../src/main/AndroidManifest.xml | 6 + .../gms/threadnetwork/ThreadBorderAgent.aidl | 8 + .../ThreadNetworkCredentials.aidl | 8 + ...GetCredentialsByExtendedPanIdCallback.aidl | 13 + .../IGetPreferredCredentialsCallback.aidl | 13 + .../IIsPreferredCredentialsCallback.aidl | 12 + .../internal/IThreadNetworkService.aidl | 26 + .../IThreadNetworkServiceCallbacks.aidl | 14 + .../IsPreferredCredentialsResult.java | 37 + .../gms/threadnetwork/ThreadBorderAgent.java | 84 + .../threadnetwork/ThreadNetworkClient.java | 12 + .../ThreadNetworkCredentials.java | 204 + .../ThreadNetworkStatusCodes.java | 37 + play-services-vision-common/build.gradle | 43 + .../src/main/AndroidManifest.xml | 6 + .../vision/internal/FrameMetadataParcel.aidl | 8 + .../android/gms/vision/CameraSource.java | 481 + .../google/android/gms/vision/Detector.java | 153 + .../com/google/android/gms/vision/Frame.java | 257 + .../vision/internal/FrameMetadataParcel.java | 25 + play-services-vision/build.gradle | 43 + play-services-vision/core/build.gradle | 58 + .../core/src/main/AndroidManifest.xml | 16 + .../assets/face_detection_yunet_2023mar.onnx | Bin 0 -> 232589 bytes .../gms/vision/barcode/ModuleDescriptor.java | 11 + .../gms/vision/dynamite/ModuleDescriptor.java | 11 + .../dynamite/barcode/ModuleDescriptor.java | 11 + .../dynamite/face/ModuleDescriptor.java | 11 + .../gms/vision/face/ModuleDescriptor.java | 11 + .../mlkit/dynamite/face/ModuleDescriptor.java | 11 + .../ChimeraNativeBarcodeDetectorCreator.kt | 22 + .../barcode/mlkit/BarcodeScannerCreator.kt | 22 + .../DynamiteNativeBarcodeDetectorCreator.kt | 22 + .../DynamiteNativeFaceDetectorCreator.kt | 42 + .../face/ChimeraNativeFaceDetectorCreator.kt | 41 + .../vision/face/mlkit/FaceDetectorCreator.kt | 42 + .../internal/ThickFaceDetectorCreator.kt | 42 + .../gms/vision/barcode/BarcodeDecodeHelper.kt | 119 + .../gms/vision/barcode/BarcodeDetector.kt | 261 + .../gms/vision/barcode/BarcodeScanner.kt | 52 + .../gms/vision/barcode/MultiBarcodeReader.kt | 114 + .../gms/vision/barcode/QRCodeScannerView.kt | 150 + .../gms/vision/barcode/RawBarcodeData.kt | 95 + .../microg/gms/vision/barcode/extensions.kt | 238 + .../microg/gms/vision/face/FaceDetector.kt | 109 + .../gms/vision/face/FaceDetectorHelper.kt | 278 + .../gms/vision/face/mlkit/FaceDetector.kt | 63 + .../src/main/AndroidManifest.xml | 6 + .../android/gms/vision/barcode/Barcode.aidl | 8 + .../client/BarcodeDetectorOptions.aidl | 8 + .../client/INativeBarcodeDetector.aidl | 17 + .../client/INativeBarcodeDetectorCreator.aidl | 14 + .../android/gms/vision/face/Contour.aidl | 8 + .../android/gms/vision/face/Landmark.aidl | 8 + .../internal/client/DetectionOptions.aidl | 8 + .../face/internal/client/FaceParcel.aidl | 8 + .../internal/client/INativeFaceDetector.aidl | 17 + .../client/INativeFaceDetectorCreator.aidl | 14 + .../android/gms/vision/barcode/Barcode.java | 593 + .../gms/vision/barcode/BarcodeDetector.java | 135 + .../client/BarcodeDetectorOptions.java | 17 + .../android/gms/vision/face/Contour.java | 40 + .../android/gms/vision/face/Landmark.java | 43 + .../internal/client/DetectionOptions.java | 38 + .../face/internal/client/FaceParcel.java | 77 + play-services-wearable/build.gradle | 55 + play-services-wearable/core/build.gradle | 56 + .../core/src/main/AndroidManifest.xml | 11 + .../gms/wearable/CapabilityManager.java | 85 + .../wearable/ClockworkNodePreferences.java | 62 + .../wearable/ConfigurationDatabaseHelper.java | 124 + .../microg/gms/wearable/DataItemInternal.java | 63 + .../microg/gms/wearable/DataItemRecord.java | 188 + .../microg/gms/wearable/MessageHandler.java | 180 + .../gms/wearable/NodeDatabaseHelper.java | 297 + .../org/microg/gms/wearable/RpcHelper.java | 70 + .../org/microg/gms/wearable/WearableImpl.java | 642 + .../microg/gms/wearable/WearableService.java | 55 + .../gms/wearable/WearableServiceImpl.java | 507 + .../location/WearableLocationService.java | 150 + .../src/main/AndroidManifest.xml | 18 + .../google/android/gms/wearable/Asset.aidl | 3 + .../gms/wearable/ConnectionConfiguration.aidl | 3 + .../wearable/internal/AddListenerRequest.aidl | 3 + .../internal/AddLocalCapabilityResponse.aidl | 3 + .../internal/AmsEntityUpdateParcelable.aidl | 3 + .../internal/AncsNotificationParcelable.aidl | 3 + .../internal/CapabilityInfoParcelable.aidl | 3 + .../internal/ChannelEventParcelable.aidl | 3 + .../internal/ChannelReceiveFileResponse.aidl | 3 + .../internal/ChannelSendFileResponse.aidl | 3 + .../internal/CloseChannelResponse.aidl | 3 + .../internal/DeleteDataItemsResponse.aidl | 3 + .../internal/GetAllCapabilitiesResponse.aidl | 3 + .../internal/GetCapabilityResponse.aidl | 3 + .../GetChannelInputStreamResponse.aidl | 3 + .../GetChannelOutputStreamResponse.aidl | 3 + .../GetCloudSyncOptInOutDoneResponse.aidl | 3 + .../GetCloudSyncOptInStatusResponse.aidl | 3 + .../internal/GetCloudSyncSettingResponse.aidl | 3 + .../wearable/internal/GetConfigResponse.aidl | 3 + .../wearable/internal/GetConfigsResponse.aidl | 3 + .../internal/GetConnectedNodesResponse.aidl | 3 + .../internal/GetDataItemResponse.aidl | 3 + .../internal/GetFdForAssetResponse.aidl | 3 + .../internal/GetLocalNodeResponse.aidl | 3 + .../internal/IChannelStreamCallbacks.aidl | 4 + .../wearable/internal/IWearableCallbacks.aidl | 65 + .../wearable/internal/IWearableListener.aidl | 21 + .../wearable/internal/IWearableService.aidl | 82 + .../internal/MessageEventParcelable.aidl | 3 + .../gms/wearable/internal/NodeParcelable.aidl | 3 + .../internal/OpenChannelResponse.aidl | 3 + .../gms/wearable/internal/PutDataRequest.aidl | 3 + .../wearable/internal/PutDataResponse.aidl | 3 + .../internal/RemoveListenerRequest.aidl | 3 + .../RemoveLocalCapabilityResponse.aidl | 3 + .../internal/SendMessageResponse.aidl | 3 + .../internal/StorageInfoResponse.aidl | 3 + .../android/gms/wearable/AmsEntityUpdate.java | 20 + .../gms/wearable/AncsNotification.java | 20 + .../google/android/gms/wearable/Asset.java | 154 + .../android/gms/wearable/CapabilityApi.java | 193 + .../android/gms/wearable/CapabilityInfo.java | 34 + .../google/android/gms/wearable/Channel.java | 94 + .../android/gms/wearable/ChannelApi.java | 185 + .../gms/wearable/ChannelIOException.java | 54 + .../gms/wearable/ConnectionConfiguration.java | 85 + .../google/android/gms/wearable/DataApi.java | 166 + .../android/gms/wearable/DataEvent.java | 50 + .../android/gms/wearable/DataEventBuffer.java | 49 + .../google/android/gms/wearable/DataItem.java | 56 + .../android/gms/wearable/DataItemAsset.java | 36 + .../android/gms/wearable/DataItemBuffer.java | 46 + .../google/android/gms/wearable/DataMap.java | 463 + .../android/gms/wearable/DataMapItem.java | 45 + .../android/gms/wearable/MessageApi.java | 88 + .../android/gms/wearable/MessageEvent.java | 42 + .../com/google/android/gms/wearable/Node.java | 41 + .../google/android/gms/wearable/NodeApi.java | 98 + .../gms/wearable/PutDataMapRequest.java | 85 + .../google/android/gms/wearable/Wearable.java | 55 + .../gms/wearable/WearableListenerService.java | 269 + .../gms/wearable/WearableStatusCodes.java | 65 + .../wearable/internal/AddListenerRequest.java | 47 + .../internal/AddLocalCapabilityResponse.java | 36 + .../internal/AmsEntityUpdateParcelable.java | 25 + .../internal/AncsNotificationParcelable.java | 25 + .../internal/CapabilityInfoParcelable.java | 90 + .../internal/ChannelEventParcelable.java | 36 + .../wearable/internal/ChannelParcelable.java | 42 + .../internal/ChannelReceiveFileResponse.java | 26 + .../internal/ChannelSendFileResponse.java | 26 + .../internal/CloseChannelResponse.java | 26 + .../internal/DataItemAssetParcelable.java | 62 + .../wearable/internal/DataItemParcelable.java | 92 + .../internal/DeleteDataItemsResponse.java | 40 + .../internal/GetAllCapabilitiesResponse.java | 33 + .../internal/GetCapabilityResponse.java | 39 + .../GetChannelInputStreamResponse.java | 26 + .../GetChannelOutputStreamResponse.java | 26 + .../GetCloudSyncOptInOutDoneResponse.java | 26 + .../GetCloudSyncOptInStatusResponse.java | 26 + .../internal/GetCloudSyncSettingResponse.java | 38 + .../wearable/internal/GetConfigResponse.java | 43 + .../wearable/internal/GetConfigsResponse.java | 43 + .../internal/GetConnectedNodesResponse.java | 43 + .../internal/GetDataItemResponse.java | 41 + .../internal/GetFdForAssetResponse.java | 43 + .../internal/GetLocalNodeResponse.java | 41 + .../internal/MessageEventParcelable.java | 68 + .../gms/wearable/internal/NodeParcelable.java | 99 + .../internal/OpenChannelResponse.java | 26 + .../gms/wearable/internal/PutDataRequest.java | 152 + .../wearable/internal/PutDataResponse.java | 41 + .../internal/RemoveListenerRequest.java | 37 + .../RemoveLocalCapabilityResponse.java | 36 + .../internal/SendMessageResponse.java | 34 + .../internal/StorageInfoResponse.java | 23 + .../gms/wearable/BaseWearableCallbacks.java | 201 + .../org/microg/gms/wearable/ChannelImpl.java | 107 + .../org/microg/gms/wearable/DataApiImpl.java | 75 + .../microg/gms/wearable/MessageApiImpl.java | 73 + .../org/microg/gms/wearable/NodeApiImpl.java | 44 + .../wearable/WearableApiClientBuilder.java | 37 + .../gms/wearable/WearableClientImpl.java | 55 + .../wearable/databundle/DataBundleUtil.java | 657 + .../src/main/proto/databundle.proto | 33 + play-services/build.gradle | 47 + play-services/src/main/AndroidManifest.xml | 21 + proguard.flags | 62 + safe-parcel-processor/build.gradle | 1 + .../src/main/AndroidManifest.xml | 6 + .../microg/safeparcel/SafeParcelProcessor.kt | 428 + .../gradle/incremental.annotation.processors | 6 + .../javax.annotation.processing.Processor | 6 + settings.gradle | 123 + vending-app/build.gradle | 162 + vending-app/proguard-rules.pro | 9 + vending-app/src/huawei/AndroidManifest.xml | 23 + vending-app/src/huaweilh/AndroidManifest.xml | 21 + vending-app/src/main/AndroidManifest.xml | 323 + ...teAlternativeBillingOnlyTokenCallback.aidl | 18 + ...ternalPaymentReportingDetailsCallback.aidl | 16 + ...InAppBillingDelegateToBackendCallback.aidl | 11 + ...nativeBillingOnlyDialogIntentCallback.aidl | 17 + ...IInAppBillingGetBillingConfigCallback.aidl | 16 + ...etExternalPaymentDialogIntentCallback.aidl | 17 + ...ternativeBillingOnlyAvailableCallback.aidl | 16 + ...ingIsExternalPaymentAvailableCallback.aidl | 16 + .../vending/billing/IInAppBillingService.aidl | 444 + .../billing/IInAppBillingServiceCallback.aidl | 15 + .../licensing/ILicenseResultListener.aidl | 11 + .../licensing/ILicenseV2ResultListener.aidl | 11 + .../vending/licensing/ILicensingService.aidl | 16 + .../engage/protocol/IAppEngageService.aidl | 45 + .../IAppEngageServiceAvailableCallback.aidl | 21 + ...ppEngageServiceDeleteClustersCallback.aidl | 20 + ...pEngageServicePublishClustersCallback.aidl | 20 + ...AppEngageServicePublishStatusCallback.aidl | 20 + .../IGetInstallReferrerService.aidl | 10 + .../finsky/services/IPlayGearheadService.aidl | 10 + .../gms/checkin/internal/ICheckinService.aidl | 7 + .../appupdate/protocol/IAppUpdateService.aidl | 14 + .../protocol/IAppUpdateServiceCallback.aidl | 11 + .../protocol/IAssetModuleService.aidl | 21 + .../protocol/IAssetModuleServiceCallback.aidl | 22 + .../protocol/IInAppReviewService.aidl | 12 + .../protocol/IInAppReviewServiceCallback.aidl | 12 + .../protocol/IExpressIntegrityService.aidl | 15 + .../IExpressIntegrityServiceCallback.aidl | 12 + .../integrity/protocol/IIntegrityService.aidl | 15 + .../protocol/IIntegrityServiceCallback.aidl | 10 + .../protocol/IRequestDialogCallback.aidl | 10 + .../protocol/ISplitInstallService.aidl | 22 + .../ISplitInstallServiceCallback.aidl | 19 + .../billingclient/api/BillingClient.java | 217 + .../android/billingclient/package-info.java | 9 + .../GrantFakeSignaturePermissionActivity.java | 33 + .../com/android/vending/VendingPreferences.kt | 83 + .../vending/billing/InAppBillingService.kt | 24 + .../vending/licensing/LicenseChecker.kt | 161 + .../licensing/LicenseServiceNotification.kt | 159 + .../vending/licensing/LicensingService.kt | 215 + .../GetInstallReferrerService.java | 37 + .../play/core/assetpacks/AssetLocation.java | 36 + .../core/assetpacks/AssetPackException.java | 40 + .../core/assetpacks/AssetPackLocation.java | 46 + .../core/assetpacks/AssetPackManager.java | 194 + .../assetpacks/AssetPackManagerFactory.java | 27 + .../core/assetpacks/AssetPackManagerImpl.java | 104 + .../assetpacks/AssetPackServiceClient.java | 366 + .../play/core/assetpacks/AssetPackState.java | 65 + .../core/assetpacks/AssetPackStateImpl.java | 130 + .../AssetPackStateUpdateListener.java | 14 + .../play/core/assetpacks/AssetPackStates.java | 23 + .../core/assetpacks/AssetPackStatesImpl.java | 65 + .../assetpacks/model/AssetPackErrorCode.java | 85 + .../assetpacks/model/AssetPackStatus.java | 71 + .../model/AssetPackStorageMethod.java | 34 + .../model/AssetPackUpdateAvailability.java | 22 + .../protocol/BroadcastConstants.java | 16 + .../core/assetpacks/protocol/BundleKeys.java | 448 + .../protocol/CompressionFormat.java | 24 + .../core/assetpacks/protocol/PatchFormat.java | 31 + .../core/listener/StateUpdateListener.java | 16 + .../microg/vending/MarketIntentRedirect.java | 84 + .../vending/WorkAccountChangedReceiver.kt | 43 + .../vending/billing/AcquireFreeAppLicense.kt | 83 + .../org/microg/vending/billing/AuthManager.kt | 38 + .../vending/billing/CheckinServiceClient.kt | 49 + .../org/microg/vending/billing/Constants.kt | 17 + .../microg/vending/billing/ContextProvider.kt | 19 + .../vending/billing/DeviceIdentifier.kt | 71 + .../org/microg/vending/billing/GServices.kt | 20 + .../billing/InAppBillingServiceImpl.kt | 710 + .../vending/billing/PurchaseActivity.java | 62 + .../microg/vending/billing/PurchaseManager.kt | 129 + .../microg/vending/billing/SettingsManager.kt | 31 + .../java/org/microg/vending/billing/Utils.kt | 341 + .../billing/core/AcknowledgePurchaseParams.kt | 7 + .../billing/core/AcknowledgePurchaseResult.kt | 36 + .../vending/billing/core/AcquireParams.kt | 9 + .../vending/billing/core/AcquireResult.kt | 29 + .../microg/vending/billing/core/AuthData.kt | 11 + .../vending/billing/core/BuyFlowParams.kt | 15 + .../microg/vending/billing/core/ClientInfo.kt | 7 + .../billing/core/ConsumePurchaseParams.kt | 7 + .../billing/core/ConsumePurchaseResult.kt | 30 + .../vending/billing/core/DeviceEnvInfo.kt | 68 + .../billing/core/GetPurchaseHistoryParams.kt | 8 + .../billing/core/GetPurchaseHistoryResult.kt | 53 + .../billing/core/GetSkuDetailsParams.kt | 10 + .../billing/core/GetSkuDetailsResult.kt | 45 + .../vending/billing/core/GooglePlayApi.kt | 21 + .../vending/billing/core/HeaderProvider.kt | 43 + .../microg/vending/billing/core/HttpClient.kt | 237 + .../vending/billing/core/IAPCacheManager.kt | 34 + .../microg/vending/billing/core/IAPCore.kt | 342 + .../microg/vending/billing/core/IAPResult.kt | 11 + .../vending/billing/core/PurchaseItem.kt | 25 + .../org/microg/vending/billing/core/Utils.kt | 309 + .../vending/billing/core/ui/UIComponents.kt | 301 + .../vending/billing/core/ui/UIParser.kt | 705 + .../microg/vending/billing/core/ui/UIType.kt | 30 + .../org/microg/vending/billing/ui/Extends.kt | 161 + .../org/microg/vending/billing/ui/HtmlText.kt | 278 + .../billing/ui/InAppBillingHostActivity.kt | 149 + .../vending/billing/ui/PlayWebViewActivity.kt | 105 + .../microg/vending/billing/ui/SheetUIPage.kt | 580 + .../org/microg/vending/billing/ui/Utils.kt | 120 + .../vending/billing/ui/WebViewHelper.kt | 195 + .../billing/ui/logic/InAppBillingViewModel.kt | 310 + .../microg/vending/billing/ui/logic/Models.kt | 38 + .../microg/vending/billing/ui/theme/Color.kt | 13 + .../microg/vending/billing/ui/theme/Theme.kt | 78 + .../microg/vending/billing/ui/theme/Type.kt | 34 + .../billing/ui/widgets/LoadingDialog.kt | 36 + .../billing/ui/widgets/PasswdInputDialog.kt | 182 + .../org/microg/vending/delivery/Delivery.kt | 124 + .../java/org/microg/vending/enterprise/App.kt | 26 + .../org/microg/vending/enterprise/AppState.kt | 33 + .../vending/enterprise/EnterpriseApp.kt | 18 + .../vending/enterprise/InstallProgress.kt | 20 + .../microg/vending/splitinstall/Constants.kt | 8 + .../vending/ui/InstallProgressNotification.kt | 213 + .../org/microg/vending/ui/MainActivity.java | 39 + .../org/microg/vending/ui/NetworkState.kt | 12 + .../org/microg/vending/ui/WorkAppsActivity.kt | 298 + .../microg/vending/ui/WorkVendingTopAppBar.kt | 55 + .../microg/vending/ui/components/AppRow.kt | 134 + .../vending/ui/components/EnterpriseList.kt | 149 + .../vending/ui/components/NetworkState.kt | 68 + .../kotlin/com/android/vending/extensions.kt | 150 + .../android/vending/installer/Constants.kt | 23 + .../com/android/vending/installer/Install.kt | 244 + .../vending/installer/InstallReceiver.kt | 36 + .../vending/installer/InstallService.kt | 244 + .../installer/SessionResultReceiver.kt | 127 + .../android/vending/installer/Uninstall.kt | 41 + .../google/android/finsky/DeviceSyncInfo.kt | 584 + .../google/android/finsky/DownloadManager.kt | 224 + .../android/finsky/IntegrityExtensions.kt | 627 + .../accounts/impl/AccountsChangedReceiver.kt | 55 + .../engage/AppEngageServiceV2.kt | 29 + .../engage/AppEngageServiceV2Impl.kt | 33 + .../AbstractAssetModuleServiceImpl.kt | 221 + .../assetmoduleservice/AssetModuleService.kt | 245 + .../finsky/assetmoduleservice/DownloadData.kt | 88 + .../DeviceIntegrity.kt | 14 + .../DeviceIntegrityAndExpiredKey.kt | 8 + .../DeviceIntegrityResponse.kt | 9 + .../ExpressIntegrityService.kt | 370 + .../ExpressIntegritySession.kt | 23 + .../IntermediateIntegrity.kt | 23 + .../IntermediateIntegrityResponse.kt | 10 + .../PackageInformation.kt | 7 + .../com/google/android/finsky/extensions.kt | 343 + .../inappreviewservice/InAppReviewService.kt | 44 + .../DevTriggeredUpdateService.kt | 57 + .../integrityservice/IntegrityService.kt | 234 + .../finsky/model/IntegrityErrorCode.kt | 172 + .../model/StandardIntegrityException.kt | 18 + .../finsky/services/PlayGearheadService.kt | 41 + .../splitinstallservice/DownloadStatus.kt | 12 + .../splitinstallservice/PackageComponent.kt | 16 + .../SplitInstallManager.kt | 185 + .../SplitInstallService.kt | 128 + .../vending/installer/AppInstallActivity.kt | 195 + .../vending/installer/AppInstallExtensions.kt | 148 + .../installer/AskInstallReminderActivity.kt | 88 + vending-app/src/main/proto/AssetModule.proto | 75 + vending-app/src/main/proto/BulkGrant.proto | 28 + .../src/main/proto/DeliveryResponse.proto | 62 + .../main/proto/EnterpriseClientPolicy.proto | 32 + .../src/main/proto/GetItemsRequest.proto | 32 + .../src/main/proto/GetItemsResponse.proto | 63 + .../src/main/proto/GooglePlayResponse.proto | 65 + vending-app/src/main/proto/Integrity.proto | 369 + .../src/main/proto/LicenseResult.proto | 24 + vending-app/src/main/proto/Locality.proto | 26 + vending-app/src/main/proto/Purchase.proto | 693 + .../src/main/proto/RequestHeader.proto | 81 + vending-app/src/main/proto/SyncRequest.proto | 192 + vending-app/src/main/proto/Timestamp.proto | 38 + .../proto/UploadDeviceConfigResponse.proto | 12 + .../main/res/drawable-v21/anim_check_mark.xml | 178 + .../src/main/res/drawable-v21/google_play.xml | 16 + .../res/drawable-v26/ic_app_foreground.xml | 48 + .../drawable-v26/ic_app_foreground_mono.xml | 57 + .../src/main/res/drawable/ic_cancel.xml | 17 + .../src/main/res/drawable/ic_download.xml | 9 + .../src/main/res/drawable/ic_notification.xml | 42 + .../src/main/res/drawable/ic_update.xml | 16 + vending-app/src/main/res/drawable/ic_work.xml | 9 + .../res/layout/activity_install_reminder.xml | 98 + .../res/layout/activiy_confirm_purchase.xml | 13 + .../src/main/res/mipmap-anydpi-v26/ic_app.xml | 11 + .../src/main/res/mipmap-hdpi/ic_app.png | Bin 0 -> 4348 bytes .../src/main/res/mipmap-mdpi/ic_app.png | Bin 0 -> 2725 bytes .../src/main/res/mipmap-xhdpi/ic_app.png | Bin 0 -> 6098 bytes .../src/main/res/mipmap-xxhdpi/ic_app.png | Bin 0 -> 9667 bytes .../src/main/res/mipmap-xxxhdpi/ic_app.png | Bin 0 -> 13787 bytes .../src/main/res/values-ar/strings.xml | 47 + .../src/main/res/values-ast/strings.xml | 18 + .../src/main/res/values-az/strings.xml | 22 + .../src/main/res/values-be/strings.xml | 22 + .../src/main/res/values-cs/strings.xml | 50 + .../src/main/res/values-de/strings.xml | 50 + .../src/main/res/values-eo/strings.xml | 2 + .../src/main/res/values-es/strings.xml | 50 + .../src/main/res/values-fa/strings.xml | 50 + .../src/main/res/values-fi/strings.xml | 16 + .../src/main/res/values-fil/strings.xml | 50 + .../src/main/res/values-fr/strings.xml | 50 + .../src/main/res/values-ga/strings.xml | 50 + .../src/main/res/values-in/strings.xml | 50 + .../src/main/res/values-is/strings.xml | 50 + .../src/main/res/values-it/strings.xml | 50 + .../src/main/res/values-ja/strings.xml | 22 + .../src/main/res/values-ko/strings.xml | 34 + .../src/main/res/values-lv/strings.xml | 2 + .../src/main/res/values-lzh/strings.xml | 5 + .../src/main/res/values-ml/strings.xml | 16 + .../src/main/res/values-nb-rNO/strings.xml | 50 + .../src/main/res/values-nl/strings.xml | 2 + .../src/main/res/values-pl/strings.xml | 50 + .../src/main/res/values-pt-rBR/strings.xml | 50 + .../src/main/res/values-pt/strings.xml | 50 + .../src/main/res/values-ro/strings.xml | 50 + .../src/main/res/values-ru/strings.xml | 50 + .../src/main/res/values-sl/strings.xml | 3 + .../src/main/res/values-sr/strings.xml | 50 + .../src/main/res/values-sv/strings.xml | 50 + .../src/main/res/values-ta/strings.xml | 50 + .../src/main/res/values-th/strings.xml | 50 + .../src/main/res/values-tr/strings.xml | 48 + .../src/main/res/values-ug/strings.xml | 50 + .../src/main/res/values-uk/strings.xml | 50 + .../src/main/res/values-v11/styles.xml | 13 + .../main/res/values-v26/ic_app_background.xml | 9 + .../src/main/res/values-vi/strings.xml | 50 + .../src/main/res/values-zh-rCN/strings.xml | 56 + .../src/main/res/values-zh-rTW/strings.xml | 49 + vending-app/src/main/res/values/colors.xml | 5 + vending-app/src/main/res/values/strings.xml | 70 + vending-app/src/main/res/values/styles.xml | 33 + 4784 files changed, 329907 insertions(+), 2 deletions(-) create mode 100644 Android.mk create mode 100644 LICENSE create mode 100644 LICENSES/Apache-2.0.txt create mode 100644 LICENSES/CC-BY-4.0.txt create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 TRANSLATION.md create mode 100644 artwork/ic_gamepad.svg create mode 100644 artwork/ic_microg_settings.svg create mode 100644 artwork/ic_recaptcha.svg create mode 100644 artwork/styles/README.md create mode 100644 artwork/styles/fonts/OpenSans Regular.ttf create mode 100644 artwork/styles/fonts/Roboto Bold.ttf create mode 100644 artwork/styles/fonts/Roboto Medium.ttf create mode 100644 artwork/styles/fonts/Roboto Regular.ttf create mode 100644 artwork/styles/fonts/combinations.json create mode 100644 artwork/styles/sprite_sources/capital.svg create mode 100644 artwork/styles/sprite_sources/city.svg create mode 100644 artwork/styles/sprite_sources/poi_generic.svg create mode 100644 artwork/styles/sprite_sources/poi_generic_blue.svg create mode 100644 artwork/styles/sprite_sources/poi_generic_green.svg create mode 100644 artwork/styles/sprite_sources/poi_generic_orange.svg create mode 100644 artwork/styles/sprite_sources/poi_generic_purple.svg create mode 100644 artwork/styles/sprite_sources/poi_generic_red.svg create mode 100644 artwork/styles/sprite_sources/poi_generic_teal.svg create mode 100644 artwork/styles/sprite_sources/poi_grocery.svg create mode 100644 artwork/styles/sprite_sources/poi_lodging.svg create mode 100644 artwork/styles/sprite_sources/poi_museum.svg create mode 100644 artwork/styles/sprite_sources/poi_res.svg create mode 100644 artwork/styles/sprite_sources/poi_restaurant.svg create mode 100644 artwork/styles/sprite_sources/poi_theatre.svg create mode 100644 artwork/styles/sprite_sources/shield_de-motorway_2.svg create mode 100644 artwork/styles/sprite_sources/shield_de-motorway_3.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-blue_2.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-blue_3.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-blue_4.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-blue_5.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-blue_6.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-green_2.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-green_3.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-green_4.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-red_2.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-red_3.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-white_2.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-white_3.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-white_4.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-white_5.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-white_6.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-yellow_2.svg create mode 100644 artwork/styles/sprite_sources/shield_rectangle-yellow_3.svg create mode 100644 artwork/styles/sprite_sources/shield_us-interstate_2.svg create mode 100644 artwork/styles/sprite_sources/shield_us-interstate_3.svg create mode 100644 artwork/styles/sprite_sources/shield_us-interstate_4.svg create mode 100644 artwork/styles/style-mapbox-outdoors-v12.json create mode 100644 artwork/styles/style-microg-normal-mapbox.json create mode 100644 artwork/styles/style-microg-normal-openmaptiles.json create mode 100644 artwork/styles/style-microg-normal-stadia.json create mode 100644 artwork/styles/style-microg-satellite-mapbox.json create mode 100644 artwork/styles/style-microg-satellite-stadia.json create mode 100644 artwork/styles/style-stadia-outdoors.json create mode 100644 build.gradle create mode 100644 fake-signature/build.gradle create mode 100644 fake-signature/src/huawei/AndroidManifest.xml create mode 100644 fake-signature/src/huawei/aidl/com/huawei/signature/diff/ISignatureService.aidl create mode 100644 fake-signature/src/huawei/java/com/huawei/signature/diff/AppListDatabaseOpenHelper.java create mode 100644 fake-signature/src/huawei/java/com/huawei/signature/diff/InitProvider.java create mode 100644 fake-signature/src/huawei/java/com/huawei/signature/diff/InitReceiver.java create mode 100644 fake-signature/src/huawei/java/com/huawei/signature/diff/SignatureService.java create mode 100644 fake-signature/src/main/AndroidManifest.xml create mode 100644 fake-signature/src/main/res/values/arrays.xml create mode 100644 fake-signature/src/main/res/values/signature.xml create mode 100644 firebase-auth/build.gradle create mode 100644 firebase-auth/core/build.gradle create mode 100644 firebase-auth/core/src/main/AndroidManifest.xml create mode 100644 firebase-auth/core/src/main/assets/recaptcha.html create mode 100644 firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt create mode 100644 firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt create mode 100644 firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaActivity.kt create mode 100644 firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaOverlayService.kt create mode 100644 firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/extensions.kt create mode 100644 firebase-auth/core/src/main/res/layout/activity_recaptcha.xml create mode 100644 firebase-auth/src/main/AndroidManifest.xml create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/ActionCodeSettings.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/EmailAuthCredential.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/PhoneAuthCredential.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/UserProfileChangeRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateAuthUriResponse.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/DeleteAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccountInfoUser.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetTokenResponse.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthService.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ReloadAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ResetPasswordResponse.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StringList.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyAssertionRequest.aidl create mode 100644 firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.aidl create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/ActionCodeSettings.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/AuthCredential.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/DefaultOAuthCredential.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/EmailAuthCredential.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/OAuthCredential.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/PhoneAuthCredential.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/UserProfileChangeRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateAuthUriResponse.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/DeleteAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccountInfoUser.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetTokenResponse.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/MfaInfo.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfo.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfoList.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ReloadAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ResetPasswordResponse.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StringList.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java create mode 100644 firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.java create mode 100644 firebase-auth/src/main/java/org/microg/gms/firebase/auth/Constants.java create mode 100644 firebase-dynamic-links/build.gradle create mode 100644 firebase-dynamic-links/src/main/AndroidManifest.xml create mode 100644 firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl create mode 100644 firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl create mode 100644 firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl create mode 100644 firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl create mode 100644 firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl create mode 100644 firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java create mode 100644 firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java create mode 100644 firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java create mode 100644 firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java create mode 100644 gradle.properties create mode 100644 gradle/publish-android.gradle create mode 100644 gradle/publish-java.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 play-services-ads-base/build.gradle create mode 100644 play-services-ads-base/src/main/AndroidManifest.xml create mode 100644 play-services-ads-identifier/build.gradle create mode 100644 play-services-ads-identifier/core/build.gradle create mode 100644 play-services-ads-identifier/core/src/main/AndroidManifest.xml create mode 100644 play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt create mode 100644 play-services-ads-identifier/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-az/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-be/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-de/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-es/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-in/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-is/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-it/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-th/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-ads-identifier/core/src/main/res/values/strings.xml create mode 100644 play-services-ads-identifier/src/main/AndroidManifest.xml create mode 100644 play-services-ads-identifier/src/main/aidl/com/google/android/gms/ads/identifier/internal/IAdvertisingIdService.aidl create mode 100644 play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java create mode 100644 play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/package-info.java create mode 100644 play-services-ads-lite/build.gradle create mode 100644 play-services-ads-lite/core/build.gradle create mode 100644 play-services-ads-lite/core/src/main/AndroidManifest.xml create mode 100644 play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt create mode 100644 play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt create mode 100644 play-services-ads-lite/src/main/AndroidManifest.xml create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl create mode 100644 play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/admanager/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/h5/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/initialization/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/interstitial/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/nativead/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewarded/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java create mode 100644 play-services-ads-lite/src/main/java/com/google/android/gms/ads/search/package-info.java create mode 100644 play-services-ads/build.gradle create mode 100644 play-services-ads/core/build.gradle create mode 100644 play-services-ads/core/src/main/AndroidManifest.xml create mode 100644 play-services-ads/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/ads/dynamite/ModuleDescriptor.java create mode 100644 play-services-ads/core/src/main/kotlin/org/microg/gms/ads/AdRequestService.kt create mode 100644 play-services-ads/src/main/AndroidManifest.xml create mode 100644 play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/ExceptionParcel.aidl create mode 100644 play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/NonagonRequestParcel.aidl create mode 100644 play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/IAdRequestService.aidl create mode 100644 play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/INonagonStreamingResponseListener.aidl create mode 100644 play-services-ads/src/main/java/com/google/android/gms/ads/internal/ExceptionParcel.java create mode 100644 play-services-ads/src/main/java/com/google/android/gms/ads/internal/NonagonRequestParcel.java create mode 100644 play-services-api/build.gradle create mode 100644 play-services-api/src/main/AndroidManifest.xml create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/ads/omid/IOmid.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/CorpusStatus.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdate.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdateResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/RequestIndexingSpecification.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestSpecification.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestionResults.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/UsageInfo.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/IAppDataSearch.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearch.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearchCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/audit/LogAuditRecordsRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/audit/internal/IAuditService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/IPendingIntentCallback.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/ISettingsCallback.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/credential/manager/firstparty/internal/ICredentialManagerService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/FacsCacheCallOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/FeedbackOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassRequestParcel.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassResponseParcel.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/gass/internal/IGassService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/googlehelp/GoogleHelp.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/googlehelp/InProductHelp.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/googlehelp/SupportRequestHelp.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/http/IGoogleHttpService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/ClientLanguageSettings.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluency.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluencyParams.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreference.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreferenceParams.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/IneligibilityRationale.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationReportingStatus.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationShare.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingIssuesCallback.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingStatusCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationSharingReporterService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationUploadCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/maps/auth/IApiTokenService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/AppMetadata.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/EventParcel.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/UserAttributeParcel.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/Configurations.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/DogfoodsToken.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/ExperimentTokens.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/Flag.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/FlagOverrides.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/RegistrationInfo.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/plus/internal/IPlusOneButtonCreator.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/potokens/PoToken.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/IPoTokensService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/ITokenCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/PseudonymousIdToken.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/AccountState.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/CreateReminderOptionsInternal.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/LoadRemindersOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/ReindexDueDatesOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/UpdateRecurrenceOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersListener.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskEntity.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskIdEntity.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/administration/internal/ISearchAdministrationService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/ClearCorpusRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusInfoRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/PlaceCandidate.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FieldMask.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentPlace.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentTrip.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/InferredPlace.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LookupParameters.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/Persona.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/RequestCredentials.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/UserLocationProfile.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenResponse.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/wallet/IsReadyToPayRequest.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IOwService.aidl create mode 100644 play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IWalletServiceCallbacks.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/CompoundHashParcelable.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/ConnectionConfig.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IConnectionAuthTokenProvider.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IGetTokenCallback.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IListenHashProvider.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnection.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnectionDelegate.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IRequestResultCallback.aidl create mode 100644 play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/RangeParcelable.aidl create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdate.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/RequestIndexingSpecification.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/appdatasearch/UsageInfo.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/audit/LogAuditRecordsRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/FACLConfig.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/PACLConfig.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/proximity/data/Permit.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CallerInfo.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerAccount.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/facs/cache/FacsCacheCallOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/family/model/MemberDataModel.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/family/v2/model/BulletPoint.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/family/v2/model/HelpData.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/family/v2/model/PageData.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/feedback/ThemeSettings.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/gass/internal/GassRequestParcel.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/gass/internal/GassResponseParcel.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/FRDProductSpecificDataEntry.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/GoogleHelp.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/InProductHelp.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/ND4CSettings.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/OfflineSuggestion.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/SupportRequestHelp.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/OverflowMenuItem.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/TogglingData.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/identity/accounts/api/AccountData.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/identity/intents/model/CountrySpecification.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/identity/intents/model/UserAddress.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/languageprofile/ClientLanguageSettings.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluency.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluencyParams.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreference.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreferenceParams.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/IneligibilityRationale.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationCollectionReason.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationReportingStatus.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationShare.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/phenotype/Configurations.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/phenotype/DogfoodsToken.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/phenotype/FlagOverrides.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/phenotype/RegistrationInfo.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusCommonExtras.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusSession.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Comment.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Post.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Settings.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/potokens/PoToken.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/pseudonymous/PseudonymousIdToken.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/AccountState.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/CreateReminderOptionsInternal.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/LoadRemindersOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/ReindexDueDatesOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/UpdateRecurrenceOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskEntity.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskIdEntity.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/corpora/ClearCorpusRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusInfoRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/queries/QueryRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocation/PlaceCandidate.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FieldMask.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentPlace.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentTrip.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/InferredPlace.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LookupParameters.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/Persona.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/RequestCredentials.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/UserLocationProfile.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayRequest.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayResponse.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/wallet/WalletConstants.java create mode 100644 play-services-api/src/main/java/com/google/firebase/database/connection/idl/CompoundHashParcelable.java create mode 100644 play-services-api/src/main/java/com/google/firebase/database/connection/idl/ConnectionConfig.java create mode 100644 play-services-api/src/main/java/com/google/firebase/database/connection/idl/RangeParcelable.java create mode 100644 play-services-appinvite/build.gradle create mode 100644 play-services-appinvite/core/build.gradle create mode 100644 play-services-appinvite/core/src/main/AndroidManifest.xml create mode 100644 play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt create mode 100644 play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteService.kt create mode 100644 play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/utils/DynamicLinkUtils.kt create mode 100644 play-services-appinvite/core/src/main/proto/datamixer.proto create mode 100644 play-services-appinvite/src/main/AndroidManifest.xml create mode 100644 play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteCallbacks.aidl create mode 100644 play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteService.aidl create mode 100644 play-services-appset/build.gradle create mode 100644 play-services-appset/core/build.gradle create mode 100644 play-services-appset/core/src/main/AndroidManifest.xml create mode 100644 play-services-appset/core/src/main/kotlin/org/microg/gms/appset/AppSetService.kt create mode 100644 play-services-appset/src/main/AndroidManifest.xml create mode 100644 play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetIdRequestParams.aidl create mode 100644 play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetInfoParcel.aidl create mode 100644 play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetIdCallback.aidl create mode 100644 play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetService.aidl create mode 100644 play-services-appset/src/main/java/com/google/android/gms/appset/AppSet.java create mode 100644 play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdClient.java create mode 100644 play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdInfo.java create mode 100644 play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdRequestParams.java create mode 100644 play-services-appset/src/main/java/com/google/android/gms/appset/AppSetInfoParcel.java create mode 100644 play-services-appset/src/main/java/com/google/android/gms/appset/package-info.java create mode 100644 play-services-auth-api-phone/build.gradle create mode 100644 play-services-auth-api-phone/core/build.gradle create mode 100644 play-services-auth-api-phone/core/src/main/AndroidManifest.xml create mode 100644 play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/AskPermissionActivity.kt create mode 100644 play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt create mode 100644 play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverRequest.kt create mode 100644 play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverService.kt create mode 100644 play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/UserConsentPromptActivity.kt create mode 100644 play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/constants.kt create mode 100644 play-services-auth-api-phone/core/src/main/res/layout/dialog_sms_user_consent.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-az/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-be/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-de/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-es/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-in/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-is/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-it/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-th/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-auth-api-phone/core/src/main/res/values/strings.xml create mode 100644 play-services-auth-api-phone/src/main/AndroidManifest.xml create mode 100644 play-services-auth-api-phone/src/main/aidl/com/google/android/gms/auth/api/phone/internal/IAutofillPermissionStateCallback.aidl create mode 100644 play-services-auth-api-phone/src/main/aidl/com/google/android/gms/auth/api/phone/internal/IOngoingSmsRequestCallback.aidl create mode 100644 play-services-auth-api-phone/src/main/aidl/com/google/android/gms/auth/api/phone/internal/ISmsRetrieverApiService.aidl create mode 100644 play-services-auth-api-phone/src/main/aidl/com/google/android/gms/auth/api/phone/internal/ISmsRetrieverResultCallback.aidl create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsCodeAutofillClient.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsCodeBrowserClient.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsCodeRetriever.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetriever.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetrieverApi.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetrieverClient.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetrieverStatusCodes.java create mode 100644 play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/package-info.java create mode 100644 play-services-auth-api-phone/src/main/java/org/microg/gms/auth/api/phone/SmsCodeAutofillClientImpl.java create mode 100644 play-services-auth-api-phone/src/main/java/org/microg/gms/auth/api/phone/SmsCodeBrowserClientImpl.java create mode 100644 play-services-auth-api-phone/src/main/java/org/microg/gms/auth/api/phone/SmsRetrieverApiClient.java create mode 100644 play-services-auth-api-phone/src/main/java/org/microg/gms/auth/api/phone/SmsRetrieverClientImpl.java create mode 100644 play-services-auth-api-phone/src/main/java/org/microg/gms/auth/api/phone/SmsRetrieverResultCallbackImpl.java create mode 100644 play-services-auth-api-phone/src/main/java/org/microg/gms/auth/api/phone/StatusCallbackImpl.java create mode 100644 play-services-auth-base/build.gradle create mode 100644 play-services-auth-base/src/main/AndroidManifest.xml create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/auth/IAuthManagerService.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/AccountChangeEventsRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/AccountChangeEventsResponse.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/GetAccountsRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/GetHubTokenInternalResponse.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/GetHubTokenRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/HasCapabilitiesRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IBundleCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IGetAccountChangeEventsCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IGetAccountsCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IGetHubTokenCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IGetTokenWithDetailsCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IGoogleAuthService.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/account/data/IHasCapabilitiesCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthCallbacks.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthService.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyResponse.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/firstparty/dataservice/ClearTokenRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/firstparty/dataservice/DeviceManagementInfoResponse.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/RecoveryRequest.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/RecoveryResult.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/SharedKey.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IBooleanCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IByteArrayCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IByteArrayListCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IKeyRetrievalCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IKeyRetrievalConsentCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IKeyRetrievalService.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IKeyRetrievalSyncStatusCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IRecoveryResultCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/ISecurityDomainMembersCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/ISharedKeyCallback.aidl create mode 100644 play-services-auth-base/src/main/aidl/com/google/android/gms/auth/folsom/internal/IStringListCallback.aidl create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/AccountChangeEvent.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/AccountChangeEventsRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/AccountChangeEventsResponse.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/GetAccountsRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/GetHubTokenInternalResponse.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/GetHubTokenRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/HasCapabilitiesRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/TokenData.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/api/proxy/ProxyRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/api/proxy/ProxyResponse.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ClearTokenRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/firstparty/dataservice/DeviceManagementInfoResponse.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/folsom/RecoveryRequest.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/folsom/RecoveryResult.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/folsom/SharedKey.java create mode 100644 play-services-auth-base/src/main/java/com/google/android/gms/auth/package-info.java create mode 100644 play-services-auth-blockstore/build.gradle create mode 100644 play-services-auth-blockstore/core/build.gradle create mode 100644 play-services-auth-blockstore/core/src/main/AndroidManifest.xml create mode 100644 play-services-auth-blockstore/core/src/main/kotlin/org/microg/gms/auth/blockstore/BlockStoreImpl.kt create mode 100644 play-services-auth-blockstore/core/src/main/kotlin/org/microg/gms/auth/blockstore/BlockstoreApiService.kt create mode 100644 play-services-auth-blockstore/src/main/AndroidManifest.xml create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/AppRestoreInfo.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/DeleteBytesRequest.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/RetrieveBytesRequest.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/RetrieveBytesResponse.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/StoreBytesData.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IBlockstoreService.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IDeleteBytesCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IGetAccessForPackageCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IGetBlockstoreDataCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IIsEndToEndEncryptionAvailableCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IRetrieveBytesCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/ISetBlockstoreDataCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/aidl/com/google/android/gms/auth/blockstore/internal/IStoreBytesCallback.aidl create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/AppRestoreInfo.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/Blockstore.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/BlockstoreClient.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/BlockstoreStatusCodes.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/DeleteBytesRequest.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/RetrieveBytesRequest.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/RetrieveBytesResponse.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/StoreBytesData.java create mode 100644 play-services-auth-blockstore/src/main/java/com/google/android/gms/auth/blockstore/package-info.java create mode 100644 play-services-auth-workaccount/build.gradle create mode 100644 play-services-auth-workaccount/core/build.gradle create mode 100644 play-services-auth-workaccount/core/src/main/AndroidManifest.xml create mode 100644 play-services-auth-workaccount/core/src/main/kotlin/com/google/android/gms/auth/account/authenticator/WorkAccountAuthenticator.kt create mode 100644 play-services-auth-workaccount/core/src/main/kotlin/com/google/android/gms/auth/account/authenticator/WorkAccountAuthenticatorService.kt create mode 100644 play-services-auth-workaccount/core/src/main/kotlin/org/microg/gms/auth/workaccount/WorkAccountService.kt create mode 100644 play-services-auth-workaccount/core/src/main/kotlin/org/microg/gms/auth/workaccount/WorkProfileSettings.kt create mode 100644 play-services-auth-workaccount/core/src/main/res/drawable/ic_briefcase.xml create mode 100644 play-services-auth-workaccount/core/src/main/res/values/strings.xml create mode 100644 play-services-auth-workaccount/core/src/main/res/xml/auth_work_authenticator.xml create mode 100644 play-services-auth-workaccount/src/main/AndroidManifest.xml create mode 100644 play-services-auth-workaccount/src/main/aidl/com/google/android/gms/auth/account/IWorkAccountCallback.aidl create mode 100644 play-services-auth-workaccount/src/main/aidl/com/google/android/gms/auth/account/IWorkAccountService.aidl create mode 100644 play-services-auth/build.gradle create mode 100644 play-services-auth/src/main/AndroidManifest.xml create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/account/data/IAccountDataService.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/account/data/IDeviceManagementInfoCallback.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/Credential.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/CredentialRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/internal/DeleteRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/internal/GeneratePasswordRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/internal/ICredentialsCallbacks.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/internal/ICredentialsService.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/credentials/internal/SaveRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/AuthorizationRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/AuthorizationResult.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/BeginSignInRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/BeginSignInResult.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/GetPhoneNumberHintIntentRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/GetSignInIntentRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/SignInCredential.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/VerifyWithGoogleRequest.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/VerifyWithGoogleResult.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/IAuthorizationCallback.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/IAuthorizationService.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/IBeginSignInCallback.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/IGetPhoneNumberHintIntentCallback.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/IGetSignInIntentCallback.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/ISignInService.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/identity/internal/IVerifyWithGoogleCallback.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/signin/internal/ISignInCallbacks.aidl create mode 100644 play-services-auth/src/main/aidl/com/google/android/gms/auth/api/signin/internal/ISignInService.aidl create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/Auth.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/Credential.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/CredentialRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/HintRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/IdToken.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/IdentityProviders.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/internal/DeleteRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/internal/GeneratePasswordRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/internal/SaveRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/credentials/package-info.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/AuthorizationClient.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/AuthorizationOptions.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/AuthorizationRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/AuthorizationResult.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/BeginSignInRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/BeginSignInResult.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/ClearTokenRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/CredentialSavingClient.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/CredentialSavingOptions.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/GetPhoneNumberHintIntentRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/GetSignInIntentRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/Identity.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/RevokeAccessRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SaveAccountLinkingTokenRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SaveAccountLinkingTokenResult.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SavePasswordRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SavePasswordResult.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SignInClient.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SignInCredential.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SignInOptions.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/SignInPassword.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/VerifyWithGoogleRequest.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/VerifyWithGoogleResult.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/identity/package-info.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignIn.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInApi.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInClient.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInResult.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/SignInAccount.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/api/signin/internal/SignInConfiguration.java create mode 100644 play-services-auth/src/main/java/com/google/android/gms/auth/package-info.java create mode 100644 play-services-auth/src/main/java/org/microg/gms/auth/api/signin/GoogleSignInApiImpl.java create mode 100644 play-services-auth/src/main/java/org/microg/gms/auth/api/signin/GoogleSignInCommon.java create mode 100644 play-services-auth/src/main/java/org/microg/gms/auth/api/signin/GoogleSignInGmsClientImpl.java create mode 100644 play-services-base/build.gradle create mode 100644 play-services-base/core/build.gradle create mode 100644 play-services-base/core/package/build.gradle create mode 100644 play-services-base/core/package/src/main/AndroidManifest.xml create mode 100644 play-services-base/core/package/src/main/kotlin/org/microg/gms/moduleinstall/ModuleInstallService.kt create mode 100644 play-services-base/core/package/src/main/kotlin/org/microg/gms/profile/ProfileProvider.kt create mode 100644 play-services-base/core/src/main/AndroidManifest.xml create mode 100644 play-services-base/core/src/main/java/org/microg/gms/AbstractGmsServiceBroker.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/BaseService.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/DummyService.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/auth/AuthRequest.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/auth/AuthResponse.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/DeviceConfiguration.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/DeviceIdentifier.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/ForegroundServiceInfo.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/HttpFormClient.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/MultiListenerProxy.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/NonCancelToken.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/NotOkayException.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/PackageUtils.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/PhoneInfo.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/RemoteListenerProxy.java create mode 100644 play-services-base/core/src/main/java/org/microg/gms/common/Utils.java create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/auth/AuthPrefs.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/common/DeviceConfigProto.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/common/KnownGooglePackages.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/crossprofile/CrossProfileRequestActivity.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/crossprofile/CrossProfileSendActivity.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/crossprofile/UserInitReceiver.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/profile/Build.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/profile/ProfileManager.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/settings/MetaDataPreferences.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/AppHeadingPreference.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/AppIconPreference.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/AppPreference.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/Constants.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/FooterPreference.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/SwitchBarPreference.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/TextPreference.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/Utils.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/ui/settings/SettingsProvider.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/BitmapUtils.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/ExtendedPackageInfo.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/FileXmlResourceParser.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/IntentCacheManager.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/PackageManagerUtils.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/PackageManagerWrapper.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/utils/SingleInstanceUtil.kt create mode 100644 play-services-base/core/src/main/kotlin/org/microg/gms/vending/InstallerData.kt create mode 100644 play-services-base/core/src/main/res/drawable/ic_background_notify.xml create mode 100644 play-services-base/core/src/main/res/drawable/ic_expand_apps.xml create mode 100644 play-services-base/core/src/main/res/drawable/ic_info_outline.xml create mode 100644 play-services-base/core/src/main/res/drawable/ic_open.xml create mode 100644 play-services-base/core/src/main/res/drawable/ic_radio.xml create mode 100644 play-services-base/core/src/main/res/drawable/ic_radio_checked.xml create mode 100644 play-services-base/core/src/main/res/drawable/ic_radio_unchecked.xml create mode 100644 play-services-base/core/src/main/res/layout/list_no_item.xml create mode 100644 play-services-base/core/src/main/res/layout/preference_app_heading.xml create mode 100644 play-services-base/core/src/main/res/layout/preference_category_no_label.xml create mode 100644 play-services-base/core/src/main/res/layout/preference_footer.xml create mode 100644 play-services-base/core/src/main/res/layout/preference_progress_bar.xml create mode 100644 play-services-base/core/src/main/res/layout/preference_switch_bar.xml create mode 100644 play-services-base/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-base/core/src/main/res/values-az/strings.xml create mode 100644 play-services-base/core/src/main/res/values-be/strings.xml create mode 100644 play-services-base/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-base/core/src/main/res/values-de/strings.xml create mode 100644 play-services-base/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-base/core/src/main/res/values-es/strings.xml create mode 100644 play-services-base/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-base/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-base/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-base/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-base/core/src/main/res/values-in/strings.xml create mode 100644 play-services-base/core/src/main/res/values-is/strings.xml create mode 100644 play-services-base/core/src/main/res/values-it/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-base/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-base/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-base/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-base/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-base/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-base/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-base/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-base/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-base/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-base/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-base/core/src/main/res/values-th/strings.xml create mode 100644 play-services-base/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-base/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-base/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-base/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-base/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-base/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-base/core/src/main/res/values/strings.xml create mode 100644 play-services-base/core/src/main/res/values/themes.xml create mode 100644 play-services-base/src/main/AndroidManifest.xml create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/auth/api/signin/GoogleSignInAccount.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/auth/api/signin/GoogleSignInOptions.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/api/internal/IStatusCallback.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/data/BitmapTeleporter.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/data/DataHolder.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/images/WebImage.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/AuthAccountRequest.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/IResolveAccountCallbacks.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/ISignInButtonCreator.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/MethodInvocation.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/ResolveAccountRequest.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/TelemetryData.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/IClientTelemetryService.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/ModuleAvailabilityResponse.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/ModuleInstallIntentResponse.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/ModuleInstallResponse.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/ModuleInstallStatusUpdate.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/internal/ApiFeatureRequest.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/internal/IModuleInstallCallbacks.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/internal/IModuleInstallService.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/moduleinstall/internal/IModuleInstallStatusListener.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/common/server/FavaDiagnosticsEntity.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/AuthAccountResult.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/CheckServerAuthResult.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/ISignInCallbacks.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/ISignInService.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/RecordConsentByConsentResultRequest.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/RecordConsentByConsentResultResponse.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/RecordConsentRequest.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/SignInRequest.aidl create mode 100644 play-services-base/src/main/aidl/com/google/android/gms/signin/internal/SignInResponse.aidl create mode 100644 play-services-base/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInAccount.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInOptions.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/auth/api/signin/GoogleSignInOptionsExtension.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/auth/api/signin/internal/GoogleSignInOptionsExtensionParcelable.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/auth/api/signin/internal/HashAccumulator.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/auth/api/signin/internal/Storage.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/GoogleApiAvailability.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/GooglePlayServicesClient.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/GooglePlayServicesUtil.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/AccountInfo.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/Api.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApi.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApiActivity.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApiClient.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/HasApiKey.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/OptionalModuleApi.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/OptionalPendingResult.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/PendingResult.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/internal/ApiExceptionMapper.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/internal/ApiKey.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/internal/ConnectionCallbacks.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/internal/ListenerHolder.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/internal/OnConnectionFailedListener.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/api/internal/SignInConnectionListener.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/AbstractDataBuffer.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/BitmapTeleporter.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/DataBuffer.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/DataBufferIterator.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/DataBufferRef.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/DataHolder.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/Freezable.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/SingleRefDataBufferIterator.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/data/package-info.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/images/ImageManager.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/images/Size.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/images/WebImage.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/images/package-info.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/ApiExceptionUtil.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/AuthAccountRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/ClientIdentity.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/ClientSettings.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/MethodInvocation.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/PendingResultUtil.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/ResolveAccountRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/ResolveAccountResponse.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/ResultTransform.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/TelemetryData.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/internal/TransformedResult.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/InstallStatusListener.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleAvailabilityResponse.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstall.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstallClient.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstallIntentResponse.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstallRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstallResponse.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstallStatusCodes.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/ModuleInstallStatusUpdate.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/moduleinstall/internal/ApiFeatureRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/package-info.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/server/FavaDiagnosticsEntity.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/common/util/IOUtils.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/dynamic/DeferredLifecycleHelper.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/SignIn.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/SignInClient.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/SignInOptions.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/AuthAccountResult.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/CheckServerAuthResult.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/RecordConsentByConsentResultRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/RecordConsentByConsentResultResponse.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/RecordConsentRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/SignInRequest.java create mode 100644 play-services-base/src/main/java/com/google/android/gms/signin/internal/SignInResponse.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/DummyApiClient.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/ForwardConnectionCallbacks.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/ForwardConnectionFailedListener.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/GmsClient.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/GmsConnector.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/AbstractPlayServicesClient.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/ApiClientBuilder.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/BasePendingResult.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/GoogleApiClientImpl.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/GoogleApiManager.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/InstantPendingResult.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/PendingGoogleApiCall.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/ResultCallbackHandler.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/ReturningGoogleApiCall.java create mode 100644 play-services-base/src/main/java/org/microg/gms/common/api/VoidReturningGoogleApiCall.java create mode 100644 play-services-base/src/main/java/org/microg/gms/signin/SignInClientImpl.java create mode 100644 play-services-basement/build.gradle create mode 100644 play-services-basement/consumer-rules.pro create mode 100644 play-services-basement/ktx/build.gradle create mode 100644 play-services-basement/ktx/src/main/AndroidManifest.xml create mode 100644 play-services-basement/ktx/src/main/kotlin/com/google/android/gms/dynamic/ObjectWrapper.kt create mode 100644 play-services-basement/src/main/AndroidManifest.xml create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/ConnectionResult.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/GoogleCertificatesLookupQuery.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/GoogleCertificatesLookupResponse.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/GoogleCertificatesQuery.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/api/ApiMetadata.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/api/ComplianceOptions.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/api/Scope.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/api/Status.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ConnectionInfo.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/GetServiceRequest.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IAccountAccessor.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ICancelToken.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ICertData.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGmsCallbacks.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGmsServiceBroker.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGoogleCertificatesApi.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ValidateAccountRequest.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/dynamic/IObjectWrapper.aidl create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/dynamite/IDynamiteLoader.aidl create mode 100644 play-services-basement/src/main/java/com/google/android/gms/actions/package-info.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/ConnectionResult.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/Feature.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/GoogleCertificatesLookupQuery.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/GoogleCertificatesLookupResponse.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/GoogleCertificatesQuery.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/GooglePlayServicesNotAvailableException.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/GooglePlayServicesRepairableException.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/Scopes.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/UserRecoverableException.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/ApiException.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/ApiMetadata.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/CommonStatusCodes.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/ComplianceOptions.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/Releasable.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/ResolvableApiException.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/Response.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/Result.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/ResultCallback.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/ResultCallbacks.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/Scope.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/Status.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/api/internal/StatusExceptionMapper.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/BaseGmsClient.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/BinderWrapper.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/CertData.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/ConnectionInfo.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/GetServiceRequest.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/ValidateAccountRequest.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelReader.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelWriter.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelable.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelableCreatorAndWriter.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelableSerializer.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/package-info.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/dynamic/LifecycleDelegate.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/dynamic/ObjectWrapper.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/dynamic/OnDelegateCreatedListener.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/dynamite/DynamiteModule.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/security/ProviderInstaller.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/stats/GCoreWakefulBroadcastReceiver.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/auth/AuthConstants.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/common/Constants.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/common/GmsService.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/common/Hide.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/common/PublicApi.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/utils/ToStringHelper.java create mode 100644 play-services-basement/src/main/java/org/microg/gms/utils/WorkSourceUtil.java create mode 100644 play-services-basement/src/main/java/org/microg/safeparcel/AutoSafeParcelable.java create mode 100644 play-services-basement/src/main/java/org/microg/safeparcel/ReflectedSafeParcelableCreatorAndWriter.java create mode 100644 play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java create mode 100644 play-services-basement/src/main/java/org/microg/safeparcel/SafeParceled.java create mode 100644 play-services-basement/src/main/res/values/version.xml create mode 100644 play-services-cast-framework/build.gradle create mode 100644 play-services-cast-framework/core/build.gradle create mode 100644 play-services-cast-framework/core/src/main/AndroidManifest.xml create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/CastContextImpl.java create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/CastDynamiteModuleImpl.java create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/CastSessionImpl.java create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/DiscoveryManagerImpl.java create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/MediaRouterCallbackImpl.java create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/SessionImpl.java create mode 100644 play-services-cast-framework/core/src/main/java/com/google/android/gms/cast/framework/internal/SessionManagerImpl.java create mode 100644 play-services-cast-framework/src/main/AndroidManifest.xml create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/CastOptions.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/IAppVisibilityListener.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ICastConnectionController.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ICastContext.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ICastSession.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ICastStateListener.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/IDiscoveryManager.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/IDiscoveryManagerListener.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/IReconnectionService.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ISession.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ISessionManager.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ISessionManagerListener.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ISessionProvider.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/ISessionProxy.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/internal/ICastDynamiteModule.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/internal/IMediaRouter.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/internal/IMediaRouterCallback.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/CastMediaOptions.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/IImagePicker.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/IMediaNotificationService.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/INotificationActionsProvider.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/NotificationOptions.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/internal/IFetchBitmapTask.aidl create mode 100644 play-services-cast-framework/src/main/aidl/com/google/android/gms/cast/framework/media/internal/IFetchBitmapTaskProgressPublisher.aidl create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/CastButtonFactory.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/CastContext.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/CastOptions.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/CastSession.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/CastState.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/DiscoveryManager.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/ModuleUnavailableException.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/OptionsProvider.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/ReconnectionService.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/Session.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/SessionManager.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/SessionProvider.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/media/CastMediaOptions.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/media/MediaIntentReceiver.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/media/MediaNotificationService.java create mode 100644 play-services-cast-framework/src/main/java/com/google/android/gms/cast/framework/media/NotificationOptions.java create mode 100644 play-services-cast-framework/src/main/java/org/microg/gms/cast/CastDynamiteModule.java create mode 100644 play-services-cast-framework/src/main/java/org/microg/gms/cast/CastSessionProvider.java create mode 100644 play-services-cast-framework/src/main/java/org/microg/gms/cast/ISessionProviderImpl.java create mode 100644 play-services-cast/build.gradle create mode 100644 play-services-cast/core/build.gradle create mode 100644 play-services-cast/core/src/main/AndroidManifest.xml create mode 100644 play-services-cast/core/src/main/java/com/google/android/gms/cast/media/CastMediaRouteProviderService.java create mode 100644 play-services-cast/core/src/main/java/org/microg/gms/cast/CastDeviceControllerImpl.java create mode 100644 play-services-cast/core/src/main/java/org/microg/gms/cast/CastDeviceControllerService.java create mode 100644 play-services-cast/core/src/main/java/org/microg/gms/cast/CastMediaRouteController.java create mode 100644 play-services-cast/core/src/main/java/org/microg/gms/cast/CastMediaRouteProvider.java create mode 100644 play-services-cast/src/main/AndroidManifest.xml create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/ApplicationMetadata.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/ApplicationStatus.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/CastDeviceStatus.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/JoinOptions.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/LaunchOptions.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/RequestItem.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/internal/IBundleCallback.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceControllerListener.aidl create mode 100644 play-services-cast/src/main/aidl/com/google/android/gms/cast/internal/ICastService.aidl create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/ApplicationMetadata.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/ApplicationStatus.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/Cast.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastDevice.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastDeviceStatus.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastMediaControlIntent.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastPresentation.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplay.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplayApi.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplayLocalService.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CastStatusCodes.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/CredentialsData.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/JoinOptions.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/LaunchOptions.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/RequestItem.java create mode 100644 play-services-cast/src/main/java/com/google/android/gms/cast/package-info.java create mode 100644 play-services-cast/src/main/java/org/microg/gms/cast/CastApiClientBuilder.java create mode 100644 play-services-cast/src/main/java/org/microg/gms/cast/CastApiImpl.java create mode 100644 play-services-cast/src/main/java/org/microg/gms/cast/CastClientImpl.java create mode 100644 play-services-cast/src/main/java/org/microg/gms/cast/CastRemoteDisplayApiClientBuilder.java create mode 100644 play-services-cast/src/main/java/org/microg/gms/cast/CastRemoteDisplayApiImpl.java create mode 100644 play-services-chimera-core/build.gradle create mode 100644 play-services-chimera-core/src/main/AndroidManifest.xml create mode 100644 play-services-chimera-core/src/main/java/com/google/android/chimera/InstanceProvider.java create mode 100644 play-services-chimera-core/src/main/java/com/google/android/chimera/IntentService.java create mode 100644 play-services-chimera-core/src/main/java/com/google/android/chimera/Service.java create mode 100644 play-services-chimera-core/src/main/kotlin/org/microg/gms/chimera/ServiceLoader.kt create mode 100644 play-services-chimera-core/src/main/kotlin/org/microg/gms/chimera/ServiceProxy.kt create mode 100644 play-services-chimera-core/src/main/kotlin/org/microg/gms/chimera/StaticServiceLoader.kt create mode 100644 play-services-clearcut/build.gradle create mode 100644 play-services-clearcut/src/main/AndroidManifest.xml create mode 100644 play-services-clearcut/src/main/aidl/com/google/android/gms/clearcut/LogEventParcelable.aidl create mode 100644 play-services-clearcut/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl create mode 100644 play-services-clearcut/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerService.aidl create mode 100644 play-services-clearcut/src/main/aidl/com/google/android/gms/clearcut/internal/PlayLoggerContext.aidl create mode 100644 play-services-clearcut/src/main/aidl/com/google/android/gms/playlog/internal/IPlayLogService.aidl create mode 100644 play-services-clearcut/src/main/aidl/com/google/android/gms/playlog/internal/LogEvent.aidl create mode 100644 play-services-clearcut/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java create mode 100644 play-services-clearcut/src/main/java/com/google/android/gms/clearcut/internal/LogVerifierResultParcelable.java create mode 100644 play-services-clearcut/src/main/java/com/google/android/gms/clearcut/internal/PlayLoggerContext.java create mode 100644 play-services-clearcut/src/main/java/com/google/android/gms/playlog/internal/LogEvent.java create mode 100644 play-services-conscrypt-provider-core/build.gradle create mode 100644 play-services-conscrypt-provider-core/src/main/AndroidManifest.xml create mode 100644 play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/common/security/ProviderInstallerImpl.java create mode 100644 play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/providerinstaller/dynamite/ModuleDescriptor.java create mode 100644 play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/providerinstaller/ProviderInstallerImpl.java create mode 100644 play-services-core-proto/build.gradle create mode 100644 play-services-core-proto/src/main/proto/apitoken.proto create mode 100644 play-services-core-proto/src/main/proto/appcert.proto create mode 100644 play-services-core-proto/src/main/proto/auth.proto create mode 100644 play-services-core-proto/src/main/proto/checkin.proto create mode 100644 play-services-core-proto/src/main/proto/controlsettings.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/LICENSE create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_better_together_device_metadata.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_better_together_feature_metadata.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_client_app_metadata.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_common.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_devicesync.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_directive.proto create mode 100644 play-services-core-proto/src/main/proto/cryptauth/cryptauth_enrollment.proto create mode 100644 play-services-core-proto/src/main/proto/deviceconfig.proto create mode 100644 play-services-core-proto/src/main/proto/familymanagement.proto create mode 100644 play-services-core-proto/src/main/proto/games.proto create mode 100644 play-services-core-proto/src/main/proto/gnots.proto create mode 100644 play-services-core-proto/src/main/proto/help.proto create mode 100644 play-services-core-proto/src/main/proto/locationsharingreporter/reporting.proto create mode 100644 play-services-core-proto/src/main/proto/locationsharingreporter/user_location_frontend_service.proto create mode 100644 play-services-core-proto/src/main/proto/mcs.proto create mode 100644 play-services-core-proto/src/main/proto/potoken.proto create mode 100644 play-services-core-proto/src/main/proto/registration.proto create mode 100644 play-services-core-proto/src/main/proto/snapshot.proto create mode 100644 play-services-core-proto/src/main/proto/uploaddeviceconfig.proto create mode 100644 play-services-core/build.gradle create mode 100644 play-services-core/microg-ui-tools/build.gradle create mode 100644 play-services-core/microg-ui-tools/src/main/AndroidManifest.xml create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/selfcheck/PermissionCheckGroup.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/selfcheck/SelfCheckGroup.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/AbstractAboutFragment.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/AbstractDashboardActivity.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/AbstractSelfCheckFragment.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/AbstractSettingsActivity.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/AbstractSettingsFragment.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/Condition.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/DialogPreference.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/LongTextPreference.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/RadioButtonPreference.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/ResourceSettingsFragment.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/SwitchBar.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/SwitchBarResourceSettingsFragment.java create mode 100644 play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/ToggleSwitch.java create mode 100644 play-services-core/microg-ui-tools/src/main/res/drawable-v21/switchbar_background.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/drawable/empty.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/drawable/ic_expand_less.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/drawable/ic_expand_more.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/drawable/switchbar_background.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout-v14/preference_category_dashboard.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout-v21/preference_material.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/about_root.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/app_bar.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/condition_card.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/dashboard_activity.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/preference_widget_radiobutton.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/self_check.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/self_check_entry.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/self_check_group.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/settings_activity.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/switch_bar.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/layout/toolbar.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-be/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-cs/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-de/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-eo/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-es/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-fil/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-fr/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-it/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-ja/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-pl/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-ro/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-ru/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-sr/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-tr/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-uk/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-vi/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values/colors.xml create mode 100644 play-services-core/microg-ui-tools/src/main/res/values/strings.xml create mode 100644 play-services-core/multidex-keep.pro create mode 120000 play-services-core/proguard-rules.pro create mode 100644 play-services-core/src/huawei/AndroidManifest.xml create mode 100644 play-services-core/src/huaweilh/AndroidManifest.xml create mode 100644 play-services-core/src/main/AndroidManifest.xml create mode 100644 play-services-core/src/main/java/com/google/android/gms/analytics/service/AnalyticsService.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/auth/GetToken.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/auth/TokenActivity.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/chimera/DynamiteContextFactory.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/chimera/DynamiteModuleInitializer.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteLoaderImpl.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteModuleInfo.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/chimera/container/FilteredClassLoader.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/common/ui/SignInButtonCreatorImpl.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/firebase_database/ModuleDescriptor.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/googlecertificates/ModuleDescriptor.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/measurement/dynamite/ModuleDescriptor.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/gcm/http/GoogleHttpService.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/plus/plusone/PlusOneButtonCreatorImpl.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/recovery/RecoveryService.java create mode 100644 play-services-core/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationService.kt create mode 100644 play-services-core/src/main/java/com/google/android/gms/wallet/dynamite/WalletDynamiteCreatorImpl.java create mode 100644 play-services-core/src/main/java/com/google/firebase/database/connection/idl/IPersistentConnectionImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ads/GService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/AskPermissionActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/AuthManagerServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/login/AssistantActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java create mode 100644 play-services-core/src/main/java/org/microg/gms/auth/loginservice/GoogleLoginService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/car/CarService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/checkin/CheckinClient.java create mode 100644 play-services-core/src/main/java/org/microg/gms/checkin/CheckinManager.java create mode 100644 play-services-core/src/main/java/org/microg/gms/checkin/CheckinService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/checkin/TriggerReceiver.java create mode 100644 play-services-core/src/main/java/org/microg/gms/drive/api/DriveApiService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/drive/api/DriveServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/feeds/SubscribedFeedsProvider.java create mode 100644 play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/games/UpgradeActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/GcmDatabase.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/GcmLegacyData.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/McsConstants.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/McsService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/PushRegisterManager.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/RegisterRequest.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/RegisterResponse.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/SendReceiver.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gcm/UnregisterReceiver.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gservices/DatabaseHelper.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gservices/GServices.java create mode 100644 play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/AppDataSearchImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/GlobalSearchAdminImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/IndexService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/LightweightAppDataSearchImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/LightweightIndexService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/SearchCorporaImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/icing/SearchQueriesImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/location/LocationConstants.java create mode 100644 play-services-core/src/main/java/org/microg/gms/mdm/NetworkQualityService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/people/ContactSyncService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/people/DatabaseHelper.java create mode 100644 play-services-core/src/main/java/org/microg/gms/people/PeopleManager.java create mode 100644 play-services-core/src/main/java/org/microg/gms/people/PeopleService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/people/PeopleServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/phenotype/ConfigurationProvider.java create mode 100644 play-services-core/src/main/java/org/microg/gms/places/GeoDataService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/places/PlacesServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/plus/PlusOneButtonImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/reminders/RemindersService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/reminders/RemindersServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/settings/GmsFileProvider.kt create mode 100644 play-services-core/src/main/java/org/microg/gms/settings/GoogleSettingsProvider.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/AboutFragment.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/AskPushPermission.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/Conditions.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/GoogleMoreFragment.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/MainSettingsActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/PlacePickerActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/SafetyNetAdvancedFragment.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/SelfCheckFragment.java create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/SettingsDashboardActivity.java create mode 100644 play-services-core/src/main/java/org/microg/gms/wallet/OwServiceImpl.java create mode 100644 play-services-core/src/main/java/org/microg/gms/wallet/PaymentService.java create mode 100644 play-services-core/src/main/java/org/microg/tools/AccountPickerActivity.java create mode 100644 play-services-core/src/main/java/org/microg/tools/selfcheck/InstalledPackagesChecks.java create mode 100644 play-services-core/src/main/java/org/microg/tools/selfcheck/RomSpoofSignatureChecks.java create mode 100644 play-services-core/src/main/java/org/microg/tools/selfcheck/SystemChecks.java create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/ads/AdActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/ads/omid/AdSession.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/ads/omid/DynamiteOmid.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/common/GoogleCertificatesImpl.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/credential/manager/PasswordManagerActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/DeleteMemberActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/FamilyApiClient.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/FamilyExtensions.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/FamilyManagementActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/fragment/FamilyDeleteFragment.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/fragment/FamilyManagementFragment.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/fragment/MemberDetailFragment.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/model/FamilyViewModel.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/ui/DeleteUI.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/ui/FamilyUI.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/ui/ManagementUI.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/feedback/FeedbackActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/LocationShareIssue.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/LocationSharingReporterApiService.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/LocationSharingReporterExtensions.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/LocationSharingUpdate.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/RefreshPolicy.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/ReportingRequestStoreFile.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/settings/LocationShareConfirmActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/locationsharingreporter/service/settings/LocationSharingSettingsActivity.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/maps/auth/ApiTokenService.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/measurement/internal/AppMeasurementDynamiteService.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/semanticlocationhistory/SemanticLocationHistoryService.kt create mode 100644 play-services-core/src/main/kotlin/com/google/android/gms/wearable/consent/TermsOfServiceActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountaction/AccountActionActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountaction/AccountNotification.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountaction/ErrorResolver.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountaction/Resolution.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountaction/UserInterventionComponents.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/LoaderActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/PicturePickerUtils.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/WebViewHelper.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcAdvertisingIdBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcAndroidIdBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcAppBarBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcAppPermissionsBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcClientInfoBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcConsistencyBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcContactsBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcFido2Bridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcFidoU2fBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcFilePickerBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcFolsomBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcPermissionsBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcPlayProtectBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcTelephonyBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcTrustAgentBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcUdcBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/bridge/OcUiBridge.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/extensions.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/audit/AuditService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/AskPackageOverrideActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/account/data/AccountDataService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/account/data/GoogleAuthService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertManager.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/consent/ConsentSignInActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialPickerActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/AuthorizationService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/IdentityFidoProxyActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/IdentitySignInService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/folsom/KeyRetrievalService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/folsom/ui/GenericActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/login/FidoHandler.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/proxy/AuthProxyService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AuthSignInActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AuthSignInService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/signin/SignInConfigurationService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/auth/signin/extensions.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/backup/BackupSettingsActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPreferences.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/common/ClientTelemetryService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/credential/CredentialManagerService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/cryptauth/CryptAuthFlow.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/cryptauth/CryptAuthRequests.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/feedback/FeedbackService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/firebase/dynamiclinks/DynamicLinksService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/fonts/FontsProvider.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/FirstPartyGamesService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/GameProfileSettings.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/GamesConfigurationService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/GamesConnectService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/GamesSignInActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/achievements/AchievementResponseKt.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/achievements/AchievementsAdapter.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/achievements/AchievementsApiClient.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/extensions.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/leaderboards/LeaderboardResponseKt.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/leaderboards/LeaderboardScoresAdapter.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/leaderboards/LeaderboardsAdapter.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/leaderboards/LeaderboardsApiClient.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/snapshot/SnapshotResponseKt.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/snapshot/SnapshotsAdapter.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/snapshot/SnapshotsApiClient.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/snapshot/SnapshotsDataClient.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/GameAccountChangeAdapter.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/GameChangeAccountFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/GameDataDeleteAdapter.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/GameDeletePlayAccountFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/GamePlayDataActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/GamesUiFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/ui/InGameUiActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/games/utils/AccountPromptManager.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gass/GassService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmInGmsService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/ServiceInfo.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/extensions.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/registeration/ChimeGmsAccount.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/gcm/registeration/ChimeGmsRegistrationHelper.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/googlehelp/GoogleHelpService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/googlehelp/ui/GoogleHelpRedirectActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/languageprofile/LanguageProfileService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/measurement/MeasurementService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/mlkit/BarcodeScanningActivity.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/phenotype/extensions.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/potokens/PoTokenHelper.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/potokens/PoTokenStore.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/potokens/PoTokensService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/potokens/extensions.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/provision/ProvisionService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/pseudonymous/PseudonymousIdService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/signin/SignInService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/udc/ActivityControlSettings.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/udc/FacsCacheService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/AccountsFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/GameProfileFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAllAppsFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetAdvancedFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetAllAppsFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetAppFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetRecentAttestationPreferencesFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetRecentDialogFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetRecentRecaptchaEnterprisePreferencesFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetRecentRecaptchaPreferencesFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SafetyNetUtils.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/SettingsFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/VendingFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/VendingInstallSettingsFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/ui/WorkProfileFragment.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/usagereporting/UsageReportingService.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/vending/VendingPreferences.kt create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/workprofile/WorkProfilePreferences.kt create mode 100644 play-services-core/src/main/res/color/material_switch_bar_text_color.xml create mode 100644 play-services-core/src/main/res/color/preference_material_switch_color.xml create mode 100644 play-services-core/src/main/res/drawable-anydpi-v21/microg_light_color_24.xml create mode 100644 play-services-core/src/main/res/drawable-hdpi/ic_gamepad.png create mode 100644 play-services-core/src/main/res/drawable-hdpi/ic_generic_man.png create mode 100644 play-services-core/src/main/res/drawable-hdpi/ic_magnify.png create mode 100644 play-services-core/src/main/res/drawable-mdpi/ic_gamepad.png create mode 100644 play-services-core/src/main/res/drawable-mdpi/ic_generic_man.png create mode 100644 play-services-core/src/main/res/drawable-mdpi/ic_magnify.png create mode 100644 play-services-core/src/main/res/drawable-v21/ic_app_foreground.xml create mode 100644 play-services-core/src/main/res/drawable-v21/ic_app_foreground_mono.xml create mode 100644 play-services-core/src/main/res/drawable-v21/ic_app_settings_foreground.xml create mode 100644 play-services-core/src/main/res/drawable-v21/ic_app_settings_foreground_mono.xml create mode 100644 play-services-core/src/main/res/drawable-v21/ic_app_settings_system.xml create mode 100644 play-services-core/src/main/res/drawable-v23/material_switch_bar_background.xml create mode 100644 play-services-core/src/main/res/drawable-v23/material_switch_bar_background_disabled.xml create mode 100644 play-services-core/src/main/res/drawable-xhdpi/ic_gamepad.png create mode 100644 play-services-core/src/main/res/drawable-xhdpi/ic_generic_man.png create mode 100644 play-services-core/src/main/res/drawable-xhdpi/ic_magnify.png create mode 100644 play-services-core/src/main/res/drawable-xhdpi/proprietary_auth_gls_ic_google_minitab_selected.png create mode 100644 play-services-core/src/main/res/drawable-xhdpi/proprietary_auth_gls_ic_google_selected.png create mode 100644 play-services-core/src/main/res/drawable-xhdpi/proprietary_auth_ic_scope_icon_default.png create mode 100644 play-services-core/src/main/res/drawable-xxhdpi/ic_gamepad.png create mode 100644 play-services-core/src/main/res/drawable-xxhdpi/ic_generic_man.png create mode 100644 play-services-core/src/main/res/drawable-xxhdpi/ic_magnify.png create mode 100644 play-services-core/src/main/res/drawable-xxxhdpi/ic_magnify.png create mode 100644 play-services-core/src/main/res/drawable/circle_shape_background.xml create mode 100644 play-services-core/src/main/res/drawable/dots_horizontal.xml create mode 100644 play-services-core/src/main/res/drawable/ic_achievement_locked.xml create mode 100644 play-services-core/src/main/res/drawable/ic_achievement_logo.xml create mode 100644 play-services-core/src/main/res/drawable/ic_achievement_unlocked.xml create mode 100644 play-services-core/src/main/res/drawable/ic_add.xml create mode 100644 play-services-core/src/main/res/drawable/ic_add_account.xml create mode 100644 play-services-core/src/main/res/drawable/ic_add_account_alt.xml create mode 100644 play-services-core/src/main/res/drawable/ic_arrow_back.xml create mode 100644 play-services-core/src/main/res/drawable/ic_arrow_close.xml create mode 100644 play-services-core/src/main/res/drawable/ic_arrow_right.xml create mode 100644 play-services-core/src/main/res/drawable/ic_bg_circle_gray.xml create mode 100644 play-services-core/src/main/res/drawable/ic_bg_prompt.xml create mode 100644 play-services-core/src/main/res/drawable/ic_certificate.xml create mode 100644 play-services-core/src/main/res/drawable/ic_check_list.xml create mode 100644 play-services-core/src/main/res/drawable/ic_choose_rounded_background.xml create mode 100644 play-services-core/src/main/res/drawable/ic_circle_check.xml create mode 100644 play-services-core/src/main/res/drawable/ic_circle_error.xml create mode 100644 play-services-core/src/main/res/drawable/ic_circle_pending.xml create mode 100644 play-services-core/src/main/res/drawable/ic_circle_warn.xml create mode 100644 play-services-core/src/main/res/drawable/ic_close_btn.xml create mode 100644 play-services-core/src/main/res/drawable/ic_cloud_bell.xml create mode 100644 play-services-core/src/main/res/drawable/ic_device_login.xml create mode 100644 play-services-core/src/main/res/drawable/ic_google_logo.xml create mode 100644 play-services-core/src/main/res/drawable/ic_leaderboard_placeholder.xml create mode 100644 play-services-core/src/main/res/drawable/ic_link.xml create mode 100644 play-services-core/src/main/res/drawable/ic_manage_accounts.xml create mode 100644 play-services-core/src/main/res/drawable/ic_map_marker.xml create mode 100644 play-services-core/src/main/res/drawable/ic_more_vert.xml create mode 100644 play-services-core/src/main/res/drawable/ic_plusone_medium.xml create mode 100644 play-services-core/src/main/res/drawable/ic_plusone_small.xml create mode 100644 play-services-core/src/main/res/drawable/ic_plusone_standard.xml create mode 100644 play-services-core/src/main/res/drawable/ic_plusone_tall.xml create mode 100644 play-services-core/src/main/res/drawable/ic_refresh.xml create mode 100644 play-services-core/src/main/res/drawable/ic_shop.xml create mode 100644 play-services-core/src/main/res/drawable/ic_snapshot_choose_fill.xml create mode 100644 play-services-core/src/main/res/drawable/ic_snapshot_choose_stroke.xml create mode 100644 play-services-core/src/main/res/drawable/ic_snapshot_load_error_image.xml create mode 100644 play-services-core/src/main/res/drawable/ic_work.xml create mode 100644 play-services-core/src/main/res/layout-v21/activity_barcode_scanning.xml create mode 100644 play-services-core/src/main/res/layout-w600dp/signin_picker.xml create mode 100644 play-services-core/src/main/res/layout/activity_consent_sign_in.xml create mode 100644 play-services-core/src/main/res/layout/activity_location_sharing_settings.xml create mode 100644 play-services-core/src/main/res/layout/ask_gcm.xml create mode 100644 play-services-core/src/main/res/layout/ask_permission.xml create mode 100644 play-services-core/src/main/res/layout/ask_permission_list_entry.xml create mode 100644 play-services-core/src/main/res/layout/assisted_signin_back_consent_layout.xml create mode 100644 play-services-core/src/main/res/layout/assisted_signin_choose_layout.xml create mode 100644 play-services-core/src/main/res/layout/assisted_signin_google_dialog.xml create mode 100644 play-services-core/src/main/res/layout/assisted_signin_hint_login.xml create mode 100644 play-services-core/src/main/res/layout/assisted_signin_loading_layout.xml create mode 100644 play-services-core/src/main/res/layout/assisted_signin_multi_layout.xml create mode 100644 play-services-core/src/main/res/layout/dialog_game_account_change_confirmation.xml create mode 100644 play-services-core/src/main/res/layout/dialog_game_account_delete_confirmation.xml create mode 100644 play-services-core/src/main/res/layout/fragment_game_change_account.xml create mode 100644 play-services-core/src/main/res/layout/fragment_game_delete_data.xml create mode 100644 play-services-core/src/main/res/layout/fragment_games_ui_layout.xml create mode 100644 play-services-core/src/main/res/layout/games_info.xml create mode 100644 play-services-core/src/main/res/layout/item_achievement_data_layout.xml create mode 100644 play-services-core/src/main/res/layout/item_achievement_header_layout.xml create mode 100644 play-services-core/src/main/res/layout/item_achievements_counter.xml create mode 100644 play-services-core/src/main/res/layout/item_game_account_data.xml create mode 100644 play-services-core/src/main/res/layout/item_game_account_radio_root.xml create mode 100644 play-services-core/src/main/res/layout/item_leaderboard_data_layout.xml create mode 100644 play-services-core/src/main/res/layout/item_leaderboard_score_data_layout.xml create mode 100644 play-services-core/src/main/res/layout/item_leaderboard_score_header_layout.xml create mode 100644 play-services-core/src/main/res/layout/item_snapshot_data_layout.xml create mode 100644 play-services-core/src/main/res/layout/item_view_game_account_prompt.xml create mode 100644 play-services-core/src/main/res/layout/login_assistant.xml create mode 100644 play-services-core/src/main/res/layout/login_assistant_loading.xml create mode 100644 play-services-core/src/main/res/layout/pick_place.xml create mode 100644 play-services-core/src/main/res/layout/preference_material_switch.xml create mode 100644 play-services-core/src/main/res/layout/preference_material_switch_bar.xml create mode 100644 play-services-core/src/main/res/layout/safety_net_advanced_fragment.xml create mode 100644 play-services-core/src/main/res/layout/safety_net_recent_card.xml create mode 100644 play-services-core/src/main/res/layout/safety_net_recent_fragment.xml create mode 100644 play-services-core/src/main/res/layout/safety_net_recents_list_fragment.xml create mode 100644 play-services-core/src/main/res/layout/settings_root_activity.xml create mode 100644 play-services-core/src/main/res/layout/signin_account_row.xml create mode 100644 play-services-core/src/main/res/layout/signin_confirm.xml create mode 100644 play-services-core/src/main/res/layout/signin_picker.xml create mode 100644 play-services-core/src/main/res/menu/pick_place.xml create mode 100644 play-services-core/src/main/res/mipmap-anydpi-v26/ic_app.xml create mode 100644 play-services-core/src/main/res/mipmap-anydpi-v26/ic_app_settings.xml create mode 100644 play-services-core/src/main/res/mipmap-hdpi/ic_app.png create mode 100644 play-services-core/src/main/res/mipmap-hdpi/ic_app_settings.png create mode 100644 play-services-core/src/main/res/mipmap-mdpi/ic_app.png create mode 100644 play-services-core/src/main/res/mipmap-mdpi/ic_app_settings.png create mode 100644 play-services-core/src/main/res/mipmap-xhdpi/ic_app.png create mode 100644 play-services-core/src/main/res/mipmap-xhdpi/ic_app_settings.png create mode 100644 play-services-core/src/main/res/mipmap-xxhdpi/ic_app.png create mode 100644 play-services-core/src/main/res/mipmap-xxhdpi/ic_app_settings.png create mode 100644 play-services-core/src/main/res/mipmap-xxxhdpi/ic_app.png create mode 100644 play-services-core/src/main/res/mipmap-xxxhdpi/ic_app_settings.png create mode 100644 play-services-core/src/main/res/navigation/nav_settings.xml create mode 100644 play-services-core/src/main/res/values-ar/permissions.xml create mode 100644 play-services-core/src/main/res/values-ar/plurals.xml create mode 100644 play-services-core/src/main/res/values-ar/strings.xml create mode 100644 play-services-core/src/main/res/values-ast/permissions.xml create mode 100644 play-services-core/src/main/res/values-ast/plurals.xml create mode 100644 play-services-core/src/main/res/values-ast/strings.xml create mode 100644 play-services-core/src/main/res/values-az/permissions.xml create mode 100644 play-services-core/src/main/res/values-az/plurals.xml create mode 100644 play-services-core/src/main/res/values-az/strings.xml create mode 100644 play-services-core/src/main/res/values-be/permissions.xml create mode 100644 play-services-core/src/main/res/values-be/plurals.xml create mode 100644 play-services-core/src/main/res/values-be/strings.xml create mode 100644 play-services-core/src/main/res/values-cs/permissions.xml create mode 100644 play-services-core/src/main/res/values-cs/plurals.xml create mode 100644 play-services-core/src/main/res/values-cs/strings.xml create mode 100644 play-services-core/src/main/res/values-de/permissions.xml create mode 100644 play-services-core/src/main/res/values-de/plurals.xml create mode 100644 play-services-core/src/main/res/values-de/strings.xml create mode 100644 play-services-core/src/main/res/values-eo/permissions.xml create mode 100644 play-services-core/src/main/res/values-eo/plurals.xml create mode 100644 play-services-core/src/main/res/values-eo/strings.xml create mode 100644 play-services-core/src/main/res/values-es/permissions.xml create mode 100644 play-services-core/src/main/res/values-es/plurals.xml create mode 100644 play-services-core/src/main/res/values-es/strings.xml create mode 100644 play-services-core/src/main/res/values-fa/permissions.xml create mode 100644 play-services-core/src/main/res/values-fa/plurals.xml create mode 100644 play-services-core/src/main/res/values-fa/strings.xml create mode 100644 play-services-core/src/main/res/values-fi/permissions.xml create mode 100644 play-services-core/src/main/res/values-fi/plurals.xml create mode 100644 play-services-core/src/main/res/values-fi/strings.xml create mode 100644 play-services-core/src/main/res/values-fil/permissions.xml create mode 100644 play-services-core/src/main/res/values-fil/plurals.xml create mode 100644 play-services-core/src/main/res/values-fil/strings.xml create mode 100644 play-services-core/src/main/res/values-fr/permissions.xml create mode 100644 play-services-core/src/main/res/values-fr/plurals.xml create mode 100644 play-services-core/src/main/res/values-fr/strings.xml create mode 100644 play-services-core/src/main/res/values-ga/permissions.xml create mode 100644 play-services-core/src/main/res/values-ga/plurals.xml create mode 100644 play-services-core/src/main/res/values-ga/strings.xml create mode 100644 play-services-core/src/main/res/values-in/permissions.xml create mode 100644 play-services-core/src/main/res/values-in/plurals.xml create mode 100644 play-services-core/src/main/res/values-in/strings.xml create mode 100644 play-services-core/src/main/res/values-is/permissions.xml create mode 100644 play-services-core/src/main/res/values-is/plurals.xml create mode 100644 play-services-core/src/main/res/values-is/strings.xml create mode 100644 play-services-core/src/main/res/values-it/permissions.xml create mode 100644 play-services-core/src/main/res/values-it/plurals.xml create mode 100644 play-services-core/src/main/res/values-it/strings.xml create mode 100644 play-services-core/src/main/res/values-ja/permissions.xml create mode 100644 play-services-core/src/main/res/values-ja/plurals.xml create mode 100644 play-services-core/src/main/res/values-ja/strings.xml create mode 100644 play-services-core/src/main/res/values-ko/permissions.xml create mode 100644 play-services-core/src/main/res/values-ko/plurals.xml create mode 100644 play-services-core/src/main/res/values-ko/strings.xml create mode 100644 play-services-core/src/main/res/values-lv/permissions.xml create mode 100644 play-services-core/src/main/res/values-lv/plurals.xml create mode 100644 play-services-core/src/main/res/values-lv/strings.xml create mode 100644 play-services-core/src/main/res/values-lzh/permissions.xml create mode 100644 play-services-core/src/main/res/values-lzh/plurals.xml create mode 100644 play-services-core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-core/src/main/res/values-ml/permissions.xml create mode 100644 play-services-core/src/main/res/values-ml/plurals.xml create mode 100644 play-services-core/src/main/res/values-ml/strings.xml create mode 100644 play-services-core/src/main/res/values-nb-rNO/permissions.xml create mode 100644 play-services-core/src/main/res/values-nb-rNO/plurals.xml create mode 100644 play-services-core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-core/src/main/res/values-night-v31/themes.xml create mode 100644 play-services-core/src/main/res/values-night-v8/themes.xml create mode 100644 play-services-core/src/main/res/values-nl/permissions.xml create mode 100644 play-services-core/src/main/res/values-nl/plurals.xml create mode 100644 play-services-core/src/main/res/values-nl/strings.xml create mode 100644 play-services-core/src/main/res/values-pl/permissions.xml create mode 100644 play-services-core/src/main/res/values-pl/plurals.xml create mode 100644 play-services-core/src/main/res/values-pl/strings.xml create mode 100644 play-services-core/src/main/res/values-pt-rBR/permissions.xml create mode 100644 play-services-core/src/main/res/values-pt-rBR/plurals.xml create mode 100644 play-services-core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-core/src/main/res/values-pt/permissions.xml create mode 100644 play-services-core/src/main/res/values-pt/plurals.xml create mode 100644 play-services-core/src/main/res/values-pt/strings.xml create mode 100644 play-services-core/src/main/res/values-ro/permissions.xml create mode 100644 play-services-core/src/main/res/values-ro/plurals.xml create mode 100644 play-services-core/src/main/res/values-ro/strings.xml create mode 100644 play-services-core/src/main/res/values-ru/permissions.xml create mode 100644 play-services-core/src/main/res/values-ru/plurals.xml create mode 100644 play-services-core/src/main/res/values-ru/strings.xml create mode 100644 play-services-core/src/main/res/values-sl/permissions.xml create mode 100644 play-services-core/src/main/res/values-sl/plurals.xml create mode 100644 play-services-core/src/main/res/values-sl/strings.xml create mode 100644 play-services-core/src/main/res/values-sr/permissions.xml create mode 100644 play-services-core/src/main/res/values-sr/plurals.xml create mode 100644 play-services-core/src/main/res/values-sr/strings.xml create mode 100644 play-services-core/src/main/res/values-sv/permissions.xml create mode 100644 play-services-core/src/main/res/values-sv/plurals.xml create mode 100644 play-services-core/src/main/res/values-sv/strings.xml create mode 100644 play-services-core/src/main/res/values-ta/permissions.xml create mode 100644 play-services-core/src/main/res/values-ta/plurals.xml create mode 100644 play-services-core/src/main/res/values-ta/strings.xml create mode 100644 play-services-core/src/main/res/values-th/permissions.xml create mode 100644 play-services-core/src/main/res/values-th/plurals.xml create mode 100644 play-services-core/src/main/res/values-th/strings.xml create mode 100644 play-services-core/src/main/res/values-tr/permissions.xml create mode 100644 play-services-core/src/main/res/values-tr/plurals.xml create mode 100644 play-services-core/src/main/res/values-tr/strings.xml create mode 100644 play-services-core/src/main/res/values-ug/permissions.xml create mode 100644 play-services-core/src/main/res/values-ug/plurals.xml create mode 100644 play-services-core/src/main/res/values-ug/strings.xml create mode 100644 play-services-core/src/main/res/values-uk/permissions.xml create mode 100644 play-services-core/src/main/res/values-uk/plurals.xml create mode 100644 play-services-core/src/main/res/values-uk/strings.xml create mode 100644 play-services-core/src/main/res/values-v23/themes.xml create mode 100644 play-services-core/src/main/res/values-v26/ic_app_background.xml create mode 100644 play-services-core/src/main/res/values-v27/themes.xml create mode 100644 play-services-core/src/main/res/values-v31/themes.xml create mode 100644 play-services-core/src/main/res/values-vi/permissions.xml create mode 100644 play-services-core/src/main/res/values-vi/plurals.xml create mode 100644 play-services-core/src/main/res/values-vi/strings.xml create mode 100644 play-services-core/src/main/res/values-zh-rCN/permissions.xml create mode 100644 play-services-core/src/main/res/values-zh-rCN/plurals.xml create mode 100644 play-services-core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-core/src/main/res/values-zh-rTW/permissions.xml create mode 100644 play-services-core/src/main/res/values-zh-rTW/plurals.xml create mode 100644 play-services-core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-core/src/main/res/values/arrays.xml create mode 100644 play-services-core/src/main/res/values/bools.xml create mode 100644 play-services-core/src/main/res/values/colors.xml create mode 100644 play-services-core/src/main/res/values/dimens.xml create mode 100644 play-services-core/src/main/res/values/permissions.xml create mode 100644 play-services-core/src/main/res/values/plurals.xml create mode 100644 play-services-core/src/main/res/values/strings.xml create mode 100644 play-services-core/src/main/res/values/themes.xml create mode 100644 play-services-core/src/main/res/xml/authenticator.xml create mode 100644 play-services-core/src/main/res/xml/contact_syncadapter.xml create mode 100644 play-services-core/src/main/res/xml/file_provider_paths.xml create mode 100644 play-services-core/src/main/res/xml/network_security_config.xml create mode 100644 play-services-core/src/main/res/xml/preferences_accounts.xml create mode 100644 play-services-core/src/main/res/xml/preferences_auth.xml create mode 100644 play-services-core/src/main/res/xml/preferences_device_registration.xml create mode 100644 play-services-core/src/main/res/xml/preferences_game_profile.xml create mode 100644 play-services-core/src/main/res/xml/preferences_gcm_advanced.xml create mode 100644 play-services-core/src/main/res/xml/preferences_google_more.xml create mode 100644 play-services-core/src/main/res/xml/preferences_push_notifications.xml create mode 100644 play-services-core/src/main/res/xml/preferences_push_notifications_all_apps.xml create mode 100644 play-services-core/src/main/res/xml/preferences_push_notifications_app.xml create mode 100644 play-services-core/src/main/res/xml/preferences_safetynet.xml create mode 100644 play-services-core/src/main/res/xml/preferences_safetynet_advanced.xml create mode 100644 play-services-core/src/main/res/xml/preferences_safetynet_all_apps.xml create mode 100644 play-services-core/src/main/res/xml/preferences_safetynet_app.xml create mode 100644 play-services-core/src/main/res/xml/preferences_snet_recent_attestation.xml create mode 100644 play-services-core/src/main/res/xml/preferences_snet_recent_recaptcha.xml create mode 100644 play-services-core/src/main/res/xml/preferences_start.xml create mode 100644 play-services-core/src/main/res/xml/preferences_vending.xml create mode 100644 play-services-core/src/main/res/xml/preferences_vending_installer_settings.xml create mode 100644 play-services-core/src/main/res/xml/preferences_work_profile.xml create mode 100644 play-services-core/src/main/res/xml/profile_bullhead_27.xml create mode 100644 play-services-core/src/main/res/xml/profile_lineage_falcon_25.xml create mode 100644 play-services-core/src/main/res/xml/profile_sdk_gphone64_arm64_33.xml create mode 100644 play-services-core/src/main/res/xml/profile_sdk_gphone64_x86_64_33.xml create mode 100644 play-services-cronet/core/build.gradle create mode 100644 play-services-cronet/core/src/main/AndroidManifest.xml create mode 100644 play-services-cronet/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/cronet_dynamite/ModuleDescriptor.java create mode 100644 play-services-drive/build.gradle create mode 100644 play-services-drive/src/main/AndroidManifest.xml create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/Contents.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/DriveId.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/AddEventListenerRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/AddPermissionRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/AuthorizeAccessRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CancelPendingActionsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ChangeResourceParentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ChangeSequenceNumber.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ChangesResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CheckResourceIdsExistRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CloseContentsAndUpdateMetadataRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CloseContentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ContentsResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ControlProgressRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CreateContentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CreateFileIntentSenderRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CreateFileRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/CreateFolderRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DeleteResourceRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DeviceUsagePreferenceResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DisconnectRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DownloadProgressResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DriveIdResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DrivePreferencesResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/DriveServiceResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/EventResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/FetchThumbnailRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/FetchThumbnailResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/GetChangesRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/GetDriveIdFromUniqueIdRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/GetMetadataRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/GetPermissionsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/GetPermissionsResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/IDriveService.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/IDriveServiceCallbacks.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/IEventCallback.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/IRealtimeService.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ListEntriesResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ListParentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ListParentsResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/LoadRealtimeRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/LoadRealtimeResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/MetadataResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/OpenContentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/OpenFileIntentSenderRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/RealtimeDocumentSyncRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/RemoveEventListenerRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/RemovePermissionRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/ResourceIdSetResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/SetDrivePreferencesRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/SetFileUploadPreferencesRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/SetResourceParentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/StartStreamSession.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/StreamContentsRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/StringListResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/SyncMoreResponse.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/TrashResourceRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/UnsubscribeResourceRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/UntrashResourceRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/UpdateMetadataRequest.aidl create mode 100644 play-services-drive/src/main/aidl/com/google/android/gms/drive/internal/UpdatePermissionRequest.aidl create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/Contents.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/DriveId.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/AddEventListenerRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/AddPermissionRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/AuthorizeAccessRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CancelPendingActionsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ChangeResourceParentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ChangeSequenceNumber.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ChangesResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CheckResourceIdsExistRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CloseContentsAndUpdateMetadataRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CloseContentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ContentsResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ControlProgressRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CreateContentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CreateFileIntentSenderRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CreateFileRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/CreateFolderRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DeleteResourceRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DeviceUsagePreferenceResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DisconnectRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DownloadProgressResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DriveIdResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DrivePreferencesResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/DriveServiceResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/EventResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/FetchThumbnailRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/FetchThumbnailResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/GetChangesRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/GetDriveIdFromUniqueIdRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/GetMetadataRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/GetPermissionsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/GetPermissionsResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ListEntriesResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ListParentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ListParentsResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/LoadRealtimeRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/LoadRealtimeResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/MetadataResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/OpenContentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/OpenFileIntentSenderRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/RealtimeDocumentSyncRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/RemoveEventListenerRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/RemovePermissionRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/ResourceIdSetResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/SetDrivePreferencesRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/SetFileUploadPreferencesRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/SetResourceParentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/StartStreamSession.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/StreamContentsRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/StringListResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/SyncMoreResponse.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/TrashResourceRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/UnsubscribeResourceRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/UntrashResourceRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/UpdateMetadataRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/internal/UpdatePermissionRequest.java create mode 100644 play-services-drive/src/main/java/com/google/android/gms/drive/metadata/internal/MetadataBundle.java create mode 100644 play-services-droidguard/build.gradle create mode 100644 play-services-droidguard/core/build.gradle create mode 100644 play-services-droidguard/core/src/main/AndroidManifest.xml create mode 100644 play-services-droidguard/core/src/main/java/com/google/android/gms/droidguard/DroidGuardChimeraService.java create mode 100644 play-services-droidguard/core/src/main/java/com/google/android/gms/framework/tracing/wrapper/TracingIntentService.java create mode 100644 play-services-droidguard/core/src/main/java/org/microg/gms/droidguard/GuardCallback.java create mode 100644 play-services-droidguard/core/src/main/java/org/microg/gms/droidguard/MediaDrmLock.java create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DgDatabaseHelper.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DgpDatabaseHelper.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DroidGuardHandleImpl.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DroidGuardPreferences.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DroidGuardService.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DroidGuardServiceBroker.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/DroidGuardServiceImpl.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/FallbackCreator.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/HardwareAttestationBlockingProvider.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/NetworkHandleProxyFactory.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/RemoteHandleImpl.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/SignatureVerifier.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/VersionUtil.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/ui/ContainedEditTextPreference.kt create mode 100644 play-services-droidguard/core/src/main/kotlin/org/microg/gms/droidguard/core/ui/DroidGuardPreferencesFragment.kt create mode 100644 play-services-droidguard/core/src/main/proto/droidguard.proto create mode 100644 play-services-droidguard/core/src/main/res/layout/preference_edit_widget.xml create mode 100644 play-services-droidguard/core/src/main/res/layout/preference_material_with_widget_below.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-az/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-be/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-de/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-es/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-in/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-is/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-it/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-th/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/values/strings.xml create mode 100644 play-services-droidguard/core/src/main/res/xml/preferences_droidguard.xml create mode 100644 play-services-droidguard/src/main/AndroidManifest.xml create mode 100644 play-services-droidguard/src/main/aidl/com/google/android/gms/droidguard/internal/DroidGuardInitReply.aidl create mode 100644 play-services-droidguard/src/main/aidl/com/google/android/gms/droidguard/internal/DroidGuardResultsRequest.aidl create mode 100644 play-services-droidguard/src/main/aidl/com/google/android/gms/droidguard/internal/IDroidGuardCallbacks.aidl create mode 100644 play-services-droidguard/src/main/aidl/com/google/android/gms/droidguard/internal/IDroidGuardHandle.aidl create mode 100644 play-services-droidguard/src/main/aidl/com/google/android/gms/droidguard/internal/IDroidGuardService.aidl create mode 100644 play-services-droidguard/src/main/java/com/google/android/gms/droidguard/DroidGuard.java create mode 100644 play-services-droidguard/src/main/java/com/google/android/gms/droidguard/DroidGuardClient.java create mode 100644 play-services-droidguard/src/main/java/com/google/android/gms/droidguard/DroidGuardHandle.java create mode 100644 play-services-droidguard/src/main/java/com/google/android/gms/droidguard/internal/DroidGuardInitReply.java create mode 100644 play-services-droidguard/src/main/java/com/google/android/gms/droidguard/internal/DroidGuardResultsRequest.java create mode 100644 play-services-droidguard/src/main/java/org/microg/gms/droidguard/DroidGuardApiClient.java create mode 100644 play-services-droidguard/src/main/java/org/microg/gms/droidguard/DroidGuardClientImpl.java create mode 100644 play-services-droidguard/src/main/java/org/microg/gms/droidguard/DroidGuardHandleImpl.java create mode 100644 play-services-droidguard/src/main/java/org/microg/gms/droidguard/Utils.java create mode 100644 play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/BytesException.kt create mode 100644 play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/HandleProxy.kt create mode 100644 play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/HandleProxyFactory.kt create mode 100644 play-services-fido/build.gradle create mode 100644 play-services-fido/core/build.gradle create mode 100644 play-services-fido/core/src/main/AndroidManifest.xml create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/Database.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/RequestHandling.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/features.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/privileged/Fido2PrivilegedService.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/AndroidKeyAttestationObject.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/AndroidSafetyNetAttestationObject.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/AttestationObject.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/AttestedCredentialData.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/AuthenticatorData.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/Cbor.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/CoseKey.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/CredentialId.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/FidoU2fAttestationObject.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/NoneAttestationObject.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/Apdu.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/AuthenticatorClientPIN.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/AuthenticatorGetAssertion.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/AuthenticatorGetInfo.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/AuthenticatorMakeCredential.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/Ctap1Command.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/Ctap2Command.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/U2fAuthentication.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/protocol/msgs/U2fRegistration.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/regular/Fido2AppService.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapConnection.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/Transport.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/TransportHandler.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/bluetooth/BluetoothTransportHandler.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/nfc/CtapNfcConnection.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/nfc/NfcTransportHandler.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/screenlock/ScreenLockCredentialStore.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/screenlock/ScreenLockTransportHandler.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/UsbDevicePermissionManager.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/UsbTransportHandler.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/ctaphid/CtapHidConnection.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/ctaphid/CtapHidMessage.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/ctaphid/CtapHidPacket.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/ctaphid/CtapHidRequest.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/ctaphid/CtapHidResponse.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/usb/extensions.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/AuthenticatorActivity.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/AuthenticatorActivityFragment.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/AuthenticatorActivityFragmentData.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/NfcTransportFragment.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/PinFragment.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/SignInSelectionFragment.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/TransportSelectionFragment.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/UsbTransportFragment.kt create mode 100644 play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/ui/WelcomeFragment.kt create mode 100644 play-services-fido/core/src/main/res/drawable-anydpi-v23/fido_nfc_wait_connect.xml create mode 100644 play-services-fido/core/src/main/res/drawable-anydpi-v23/fido_usb_wait_confirm.xml create mode 100644 play-services-fido/core/src/main/res/drawable-anydpi-v23/fido_usb_wait_connect.xml create mode 100644 play-services-fido/core/src/main/res/drawable/fido_nfc_wait_connect.xml create mode 100644 play-services-fido/core/src/main/res/drawable/fido_usb_wait_confirm.xml create mode 100644 play-services-fido/core/src/main/res/drawable/fido_usb_wait_connect.xml create mode 100644 play-services-fido/core/src/main/res/drawable/ic_fido_bluetooth.xml create mode 100644 play-services-fido/core/src/main/res/drawable/ic_fido_close_btn.xml create mode 100644 play-services-fido/core/src/main/res/drawable/ic_fido_fingerprint.xml create mode 100644 play-services-fido/core/src/main/res/drawable/ic_fido_key.xml create mode 100644 play-services-fido/core/src/main/res/drawable/ic_fido_nfc.xml create mode 100644 play-services-fido/core/src/main/res/drawable/ic_fido_usb.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_authenticator_activity.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_nfc_transport_fragment.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_pin_fragment.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_sign_in_item_layout.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_sign_in_selection_fragment.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_transport_selection_fragment.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_usb_transport_fragment.xml create mode 100644 play-services-fido/core/src/main/res/layout/fido_welcome_fragment.xml create mode 100644 play-services-fido/core/src/main/res/navigation/nav_fido_authenticator.xml create mode 100644 play-services-fido/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-az/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-be/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-de/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-es/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-in/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-is/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-it/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-th/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-fido/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-fido/core/src/main/res/values/strings.xml create mode 100644 play-services-fido/src/main/AndroidManifest.xml create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/IBooleanCallback.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/ICredentialListCallback.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/common/BrowserPublicKeyCredentialCreationOptions.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/common/BrowserPublicKeyCredentialRequestOptions.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/common/FidoCredentialDetails.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialCreationOptions.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialRequestOptions.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/internal/privileged/IFido2PrivilegedCallbacks.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/internal/privileged/IFido2PrivilegedService.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/internal/regular/IFido2AppCallbacks.aidl create mode 100644 play-services-fido/src/main/aidl/com/google/android/gms/fido/fido2/internal/regular/IFido2AppService.aidl create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/Fido.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/common/Transport.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/Fido2ApiClient.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/Fido2PendingIntent.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/Fido2PrivilegedApiClient.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/Algorithm.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/Attachment.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AttestationConveyancePreference.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticationExtensions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticationExtensionsClientOutputs.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticationExtensionsCredPropsOutputs.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticationExtensionsDevicePublicKeyOutputs.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticationExtensionsPrfOutputs.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticatorAssertionResponse.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticatorAttestationResponse.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticatorErrorResponse.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticatorResponse.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/AuthenticatorSelectionCriteria.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/BrowserPublicKeyCredentialCreationOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/BrowserPublicKeyCredentialRequestOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/BrowserRequestOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/COSEAlgorithmIdentifier.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/CableAuthenticationData.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/CableAuthenticationExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/CredentialPropertiesOutput.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/DevicePublicKeyExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/DevicePublicKeyStringDef.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/EC2Algorithm.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/ErrorCode.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/FidoAppIdExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/FidoCredentialDetails.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/GoogleMultiAssertionExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/GoogleSessionIdExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/GoogleSilentVerificationExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/GoogleThirdPartyPaymentExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/GoogleTunnelServerIdExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/HmacSecretExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/KeyProtectionTypes.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/MatcherProtectionTypes.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PaymentExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PrfExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredential.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialCreationOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialDescriptor.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialParameters.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialRequestOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialRpEntity.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialType.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/PublicKeyCredentialUserEntity.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/RSAAlgorithm.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/RequestOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/ResidentKeyRequirement.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/SimpleTransactionAuthorizationExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/TokenBinding.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UserVerificationMethodExtension.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UserVerificationMethods.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UserVerificationRequirement.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UvmEntries.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UvmEntry.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/sourcedevice/SourceDirectTransferClient.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/sourcedevice/SourceDirectTransferResult.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/sourcedevice/SourceStartDirectTransferOptions.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/u2f/U2fApiClient.java create mode 100644 play-services-fido/src/main/java/com/google/android/gms/fido/u2f/U2fPendingIntent.java create mode 100644 play-services-fido/src/main/java/org/microg/gms/fido/fido2/Fido2GmsClient.java create mode 100644 play-services-fido/src/main/java/org/microg/gms/fido/fido2/Fido2PendingIntentImpl.java create mode 100644 play-services-fido/src/main/java/org/microg/gms/fido/fido2/Fido2PrivilegedGmsClient.java create mode 100644 play-services-fitness/.gitignore create mode 100644 play-services-fitness/build.gradle create mode 100644 play-services-fitness/core/build.gradle create mode 100644 play-services-fitness/core/src/main/AndroidManifest.xml create mode 100644 play-services-fitness/core/src/main/kotlin/com/google/android/gms/fitness/service/config/FitConfigBroker.kt create mode 100644 play-services-fitness/core/src/main/kotlin/com/google/android/gms/fitness/service/extensions.kt create mode 100644 play-services-fitness/core/src/main/kotlin/com/google/android/gms/fitness/service/history/FitHistoryBroker.kt create mode 100644 play-services-fitness/core/src/main/kotlin/com/google/android/gms/fitness/service/recording/FitRecordingBroker.kt create mode 100644 play-services-fitness/core/src/main/kotlin/com/google/android/gms/fitness/service/sessions/FitSessionsBroker.kt create mode 100644 play-services-fitness/src/main/AndroidManifest.xml create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IDailyTotalCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IDataPointChangesCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IDataReadCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IDataTypeCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IDebugInfoCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IFileUriCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IGoogleFitConfigApi.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IGoogleFitHistoryApi.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IGoogleFitRecordingApi.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IGoogleFitSessionsApi.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IListSubscriptionsCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IReadRawCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IReadStatsCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/ISessionChangesCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/ISessionReadCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/ISessionStopCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/IStatusCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/internal/ISyncInfoCallback.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DailyTotalRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataDeleteRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataInsertRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataPointChangesRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataReadRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataReadResult.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataSourceQueryParams.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataTypeCreateRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataUpdateListenerRegistrationRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataUpdateListenerUnregistrationRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DataUpdateRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DebugInfoRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/DisableFitRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/GetFileUriRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/GetSyncInfoRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/ListSubscriptionsRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/ReadDataTypeRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/ReadRawRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/ReadStatsRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionChangesRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionInsertRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionReadRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionRegistrationRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionStartRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionStopRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SessionUnregistrationRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/SubscribeRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/request/UnsubscribeRequest.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/result/DataSourceStatsResult.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/result/DataStatsResult.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/result/DataTypeResult.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/result/ListSubscriptionsResult.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/result/SessionReadResult.aidl create mode 100644 play-services-fitness/src/main/aidl/com/google/android/gms/fitness/result/SessionStopResult.aidl create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Application.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Bucket.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/DataPoint.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/DataSet.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/DataSource.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/DataType.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Device.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Field.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/MapValue.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Session.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/SessionDataSet.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Subscription.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/Value.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/data/package-info.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/package-info.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DailyTotalRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataDeleteRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataInsertRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataPointChangesRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataReadRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataReadResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataSourceQueryParams.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataTypeCreateRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataUpdateListenerRegistrationRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataUpdateListenerUnregistrationRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DataUpdateRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DebugInfoRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/DisableFitRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/GetFileUriRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/GetSyncInfoRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/ListSubscriptionsRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/ReadDataTypeRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/ReadRawRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/ReadStatsRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionChangesRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionInsertRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionReadRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionRegistrationRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionStartRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionStopRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SessionUnregistrationRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/SubscribeRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/UnsubscribeRequest.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/request/package-info.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/DataSourceStatsResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/DataStatsResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/DataTypeResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/ListSubscriptionsResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/SessionReadResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/SessionStopResult.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/result/package-info.java create mode 100644 play-services-fitness/src/main/java/com/google/android/gms/fitness/service/package-info.java create mode 100644 play-services-games/build.gradle create mode 100644 play-services-games/src/main/AndroidManifest.xml create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/PlayerEntity.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/client/IPlayGamesCallbacks.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/client/IPlayGamesService.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/client/PlayGamesConsistencyTokens.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/IGamesCallbacks.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/IGamesClient.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/IGamesService.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/connect/GamesSignInRequest.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/connect/GamesSignInResponse.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/connect/IGamesConnectCallbacks.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/internal/connect/IGamesConnectService.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/multiplayer/realtime/RealTimeMessage.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/snapshot/SnapshotMetadataChangeEntity.aidl create mode 100644 play-services-games/src/main/aidl/com/google/android/gms/games/snapshot/SnapshotMetadataEntity.aidl create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/AnnotatedData.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/CurrentPlayerInfo.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/CurrentPlayerInfoEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/Game.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/GameColumns.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/GameEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/GamesStatusCodes.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/Player.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerBuffer.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerColumns.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerLevel.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerLevelInfo.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerRef.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerRelationshipInfo.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayerRelationshipInfoEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/Players.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/PlayersClient.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/achievement/package-info.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/client/PlayGamesConsistencyTokens.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/internal/connect/GamesSignInRequest.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/internal/connect/GamesSignInResponse.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/internal/connect/SignInResolutionResult.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/internal/player/MostRecentGameInfo.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/internal/player/MostRecentGameInfoEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/leaderboard/package-info.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/multiplayer/realtime/RealTimeMessage.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/package-info.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/snapshot/SnapshotColumns.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/snapshot/SnapshotMetadata.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/snapshot/SnapshotMetadataChange.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/snapshot/SnapshotMetadataChangeEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/snapshot/SnapshotMetadataEntity.java create mode 100644 play-services-games/src/main/java/com/google/android/gms/games/snapshot/package-info.java create mode 100644 play-services-gcm/build.gradle create mode 100644 play-services-gcm/src/main/AndroidManifest.xml create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmListenerService.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmNetworkManager.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmPubSub.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmTaskService.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/GoogleCloudMessaging.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/OneoffTask.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/PendingCallback.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/PeriodicTask.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/Task.java create mode 100644 play-services-gcm/src/main/java/com/google/android/gms/gcm/TaskParams.java create mode 100644 play-services-gcm/src/main/java/org/microg/gms/gcm/CloudMessagingRpc.java create mode 100644 play-services-gmscompliance/build.gradle create mode 100644 play-services-gmscompliance/core/build.gradle create mode 100644 play-services-gmscompliance/core/src/main/AndroidManifest.xml create mode 100644 play-services-gmscompliance/core/src/main/kotlin/org/microg/gms/gmscompliance/GmsDeviceComplianceService.kt create mode 100644 play-services-gmscompliance/src/main/AndroidManifest.xml create mode 100644 play-services-gmscompliance/src/main/aidl/com/google/android/gms/gmscompliance/GmsDeviceComplianceResponse.aidl create mode 100644 play-services-gmscompliance/src/main/aidl/com/google/android/gms/gmscompliance/IGmsDeviceComplianceService.aidl create mode 100644 play-services-gmscompliance/src/main/aidl/com/google/android/gms/gmscompliance/IGmsDeviceComplianceServiceCallback.aidl create mode 100644 play-services-gmscompliance/src/main/java/com/google/android/gms/gmscompliance/GmsDeviceComplianceResponse.java create mode 100644 play-services-iid/build.gradle create mode 100644 play-services-iid/src/main/AndroidManifest.xml create mode 100644 play-services-iid/src/main/aidl/com/google/android/gms/iid/IMessengerCompat.aidl create mode 100644 play-services-iid/src/main/java/com/google/android/gms/iid/InstanceID.java create mode 100644 play-services-iid/src/main/java/com/google/android/gms/iid/InstanceIDListenerService.java create mode 100644 play-services-iid/src/main/java/com/google/android/gms/iid/MessengerCompat.java create mode 100644 play-services-iid/src/main/java/org/microg/gms/iid/InstanceIdRpc.java create mode 100644 play-services-iid/src/main/java/org/microg/gms/iid/InstanceIdStore.java create mode 100644 play-services-location/build.gradle create mode 100644 play-services-location/core/base/build.gradle create mode 100644 play-services-location/core/base/src/main/AndroidManifest.xml create mode 100644 play-services-location/core/base/src/main/kotlin/org/microg/gms/location/LocationSettings.kt create mode 100644 play-services-location/core/base/src/main/kotlin/org/microg/gms/location/extensions.kt create mode 100644 play-services-location/core/base/src/main/kotlin/org/microg/gms/location/network/OnlineSource.kt create mode 100644 play-services-location/core/build.gradle create mode 100644 play-services-location/core/provider/build.gradle create mode 100644 play-services-location/core/provider/src/main/AndroidManifest.xml create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/DatabaseExportFileProvider.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/LocationDatabase.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/NetworkDetails.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/NetworkLocationRequest.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/NetworkLocationService.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/cell/CellDetails.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/cell/CellDetailsCallback.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/cell/CellDetailsSource.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/cell/extensions.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/extensions.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/BluetoothBeacon.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/CellTower.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/Fallback.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/GeolocateRequest.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/GeolocateResponse.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/GeosubmitItem.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/GeosubmitPosition.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/GeosubmitRequest.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/GeosubmitSource.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/IchnaeaServiceClient.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/RadioType.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/RawGeolocateEntry.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/ResponseError.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/ResponseLocation.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/ServiceException.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/WifiAccessPoint.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/ichnaea/extensions.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/MovingWifiHelper.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/WifiDetails.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/WifiDetailsCallback.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/WifiDetailsSource.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/WifiManagerSource.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/WifiScannerSource.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/network/wifi/extensions.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/AbstractLocationProviderPreTiramisu.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/FusedLocationProviderService.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/GenericLocationProvider.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/GeocodeProviderService.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/IntentLocationProviderPreTiramisu.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/IntentLocationProviderService.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/NetworkLocationProviderService.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/OpenStreetMapNominatimGeocodeProvider.kt create mode 100644 play-services-location/core/provider/src/main/kotlin/org/microg/gms/location/provider/extensions.kt create mode 100644 play-services-location/core/provider/src/main/res/xml/location_exported_files.xml create mode 100644 play-services-location/core/src/huawei/AndroidManifest.xml create mode 100644 play-services-location/core/src/huawei/kotlin/org/microg/gms/location/manager/AskPermissionNotificationActivity.kt create mode 100644 play-services-location/core/src/huawei/res/drawable-zh/permission_step_1.jpg create mode 100644 play-services-location/core/src/huawei/res/drawable-zh/permission_step_2.jpg create mode 100644 play-services-location/core/src/huawei/res/drawable/arrow.png create mode 100644 play-services-location/core/src/huawei/res/drawable/ic_app.png create mode 100644 play-services-location/core/src/huawei/res/drawable/ic_permission_notification.xml create mode 100644 play-services-location/core/src/huawei/res/drawable/permission_step_1.jpg create mode 100644 play-services-location/core/src/huawei/res/drawable/permission_step_2.jpg create mode 100644 play-services-location/core/src/huawei/res/layout/extended_permission_request.xml create mode 100644 play-services-location/core/src/huawei/res/values-zh-rCN/strings.xml create mode 100644 play-services-location/core/src/huawei/res/values/strings.xml create mode 100644 play-services-location/core/src/main/AndroidManifest.xml create mode 100644 play-services-location/core/src/main/kotlin/com/google/android/location/settings/LocationHistorySettingsActivity.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/AbstractLocationManagerInstance.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/AskPermissionActivity.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/DeviceOrientationManager.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LastLocationCapsule.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LocationAppsDatabase.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LocationManager.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LocationManagerInstance.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LocationManagerService.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LocationPostProcessor.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/LocationRequestManager.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/manager/extensions.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/reporting/ReportingAndroidService.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/reporting/ReportingServiceInstance.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/reporting/extensions.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/settings/DetailedLocationSettingsStates.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/settings/GoogleLocationSettingsActivity.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/settings/LocationSettingsCheckerActivity.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/ui/ConfigurationRequiredReceiver.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/ui/LocationAllAppsFragment.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/ui/LocationAppFragment.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/ui/LocationMapPreference.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/ui/LocationPreferencesFragment.kt create mode 100644 play-services-location/core/src/main/kotlin/org/microg/gms/location/ui/extensions.kt create mode 100644 play-services-location/core/src/main/res/drawable/ic_gps.xml create mode 100644 play-services-location/core/src/main/res/drawable/ic_location.xml create mode 100644 play-services-location/core/src/main/res/layout/location_settings_dialog.xml create mode 100644 play-services-location/core/src/main/res/layout/location_settings_dialog_item.xml create mode 100644 play-services-location/core/src/main/res/layout/preference_full_container.xml create mode 100644 play-services-location/core/src/main/res/layout/preference_location_custom_url.xml create mode 100644 play-services-location/core/src/main/res/layout/preference_location_online_source.xml create mode 100644 play-services-location/core/src/main/res/navigation/nav_location.xml create mode 100644 play-services-location/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-location/core/src/main/res/values-az/strings.xml create mode 100644 play-services-location/core/src/main/res/values-be/strings.xml create mode 100644 play-services-location/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-location/core/src/main/res/values-de/strings.xml create mode 100644 play-services-location/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-location/core/src/main/res/values-es/strings.xml create mode 100644 play-services-location/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-location/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-location/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-location/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-location/core/src/main/res/values-in/strings.xml create mode 100644 play-services-location/core/src/main/res/values-is/strings.xml create mode 100644 play-services-location/core/src/main/res/values-it/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-location/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-location/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-location/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-location/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-location/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-location/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-location/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-location/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-location/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-location/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-location/core/src/main/res/values-th/strings.xml create mode 100644 play-services-location/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-location/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-location/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-location/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-location/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-location/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-location/core/src/main/res/values/strings.xml create mode 100644 play-services-location/core/src/main/res/xml/preferences_location.xml create mode 100644 play-services-location/core/src/main/res/xml/preferences_location_all_apps.xml create mode 100644 play-services-location/core/src/main/res/xml/preferences_location_app_details.xml create mode 100644 play-services-location/core/system-api/build.gradle create mode 100644 play-services-location/core/system-api/src/main/AndroidManifest.xml create mode 100644 play-services-location/core/system-api/src/main/java/android/location/GeocoderParams.java create mode 100644 play-services-location/core/system-api/src/main/java/android/location/Geofence.java create mode 100644 play-services-location/core/system-api/src/main/java/android/location/Location.java create mode 100644 play-services-location/core/system-api/src/main/java/android/location/LocationManager.java create mode 100644 play-services-location/core/system-api/src/main/java/android/location/LocationRequest.java create mode 100644 play-services-location/core/system-api/src/main/java/android/net/wifi/WifiScanner.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/internal/location/ProviderProperties.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/internal/location/ProviderRequest.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/location/provider/GeocodeProvider.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/location/provider/LocationProvider.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/location/provider/LocationProviderBase.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/location/provider/LocationRequestUnbundled.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/location/provider/ProviderPropertiesUnbundled.java create mode 100644 play-services-location/core/system-api/src/main/java/com/android/location/provider/ProviderRequestUnbundled.java create mode 100644 play-services-location/src/main/AndroidManifest.xml create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/ActivityRecognitionRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/ActivityRecognitionResult.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/ActivityTransitionRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/CurrentLocationRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/DeviceOrientation.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/GeofencingRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/GestureRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/IDeviceOrientationListener.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/ILocationCallback.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/ILocationListener.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LastLocationRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationAvailability.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationAvailabilityRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationResult.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationSettingsRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationSettingsResult.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/LocationStatus.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/SleepSegmentRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/FusedLocationProviderResult.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/IBooleanStatusCallback.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/IGeofencerCallbacks.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/IGoogleLocationManagerService.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/ILocationAvailabilityStatusCallback.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/ILocationStatusCallback.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/ISettingsCallbacks.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/LocationReceiver.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/LocationRequestInternal.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/LocationRequestUpdateData.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/ParcelableGeofence.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/RemoveGeofencingRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/internal/SetGoogleLocationAccuracyRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/OptInRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/ReportingState.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/SendDataRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/UlrPrivateModeRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/UploadRequest.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/UploadRequestResult.aidl create mode 100644 play-services-location/src/main/aidl/com/google/android/gms/location/reporting/internal/IReportingService.aidl create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityRecognition.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityRecognitionApi.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityRecognitionClient.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityRecognitionRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityRecognitionResult.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityTransition.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityTransitionEvent.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityTransitionRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ActivityTransitionResult.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/CurrentLocationRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/DetectedActivity.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/DeviceOrientation.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/DeviceOrientationRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/FusedLocationProviderApi.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/FusedLocationProviderClient.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/Geofence.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/GeofenceStatusCodes.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/GeofencingApi.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/GeofencingClient.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/GeofencingEvent.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/GeofencingRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/GestureRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/Granularity.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LastLocationRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationAvailability.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationAvailabilityRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationCallback.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationClient.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationListener.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationResult.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationServices.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationSettingsConfiguration.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationSettingsRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationSettingsResponse.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationSettingsResult.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationSettingsStates.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationSettingsStatusCodes.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationStatus.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/LocationStatusCodes.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/NetworkLocationStatus.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/Priority.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/SettingsApi.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/SettingsClient.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/SleepClassifyEvent.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/SleepSegmentEvent.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/SleepSegmentRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/ThrottleBehavior.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/ClientIdentity.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestInternal.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/FusedLocationProviderResult.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/LocationReceiver.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/LocationRequestInternal.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/ParcelableGeofence.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/RemoveGeofencingRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/internal/SetGoogleLocationAccuracyRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/reporting/OptInRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/reporting/ReportingState.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/reporting/SendDataRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/reporting/UlrPrivateModeRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/reporting/UploadRequest.java create mode 100644 play-services-location/src/main/java/com/google/android/gms/location/reporting/UploadRequestResult.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiClientBuilder.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionClientImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/FusedLocationProviderApiImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/FusedLocationProviderClientImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/GeofencingApiImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/GeofencingClientImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/GoogleLocationManagerClient.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/GranularityUtil.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/LocationClientImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/LocationServicesApiClientBuilder.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/PriorityUtil.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/SettingsApiImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/SettingsClientImpl.java create mode 100644 play-services-location/src/main/java/org/microg/gms/location/ThrottleBehaviorUtil.java create mode 100644 play-services-maps/build.gradle create mode 100644 play-services-maps/core/hms/build.gradle create mode 100644 play-services-maps/core/hms/proguard-rules.pro create mode 100644 play-services-maps/core/hms/src/main/AndroidManifest.xml create mode 100644 play-services-maps/core/hms/src/main/assets/.gitignore create mode 100644 play-services-maps/core/hms/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/maps_dynamite/ModuleDescriptor.java create mode 100644 play-services-maps/core/hms/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/CameraUpdateFactory.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/GoogleMap.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/MapFragment.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/MapView.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/Projection.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/StreetViewPanoramaFragment.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/StreetViewPanoramaView.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/UiSettings.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/BitmapDescriptorFactory.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/Circle.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/GroundOverlay.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/Marker.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/Polygon.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/Polyline.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/model/TileOverlay.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/utils/MapContext.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/utils/MapUiController.kt create mode 100644 play-services-maps/core/hms/src/main/kotlin/org/microg/gms/maps/hms/utils/typeConverter.kt create mode 100644 play-services-maps/core/hms/src/main/res/drawable-hdpi/maps_default_marker.png create mode 100644 play-services-maps/core/hms/src/main/res/drawable-ldpi/maps_default_marker.png create mode 100644 play-services-maps/core/hms/src/main/res/drawable-mdpi/maps_default_marker.png create mode 100644 play-services-maps/core/hms/src/main/res/drawable-xhdpi/maps_default_marker.png create mode 100644 play-services-maps/core/hms/src/main/res/drawable-xxhdpi/maps_default_marker.png create mode 100644 play-services-maps/core/hms/src/main/res/drawable-xxxhdpi/maps_default_marker.png create mode 100644 play-services-maps/core/hms/src/main/res/raw/mapstyle_grayscale_hms.json create mode 100644 play-services-maps/core/hms/src/main/res/raw/mapstyle_night_hms.json create mode 100644 play-services-maps/core/hms/src/main/res/values/strings.xml create mode 100644 play-services-maps/core/mapbox/build.gradle create mode 100644 play-services-maps/core/mapbox/src/main/AndroidManifest.xml create mode 120000 play-services-maps/core/mapbox/src/main/assets/Open Sans Regular,Arial Unicode MS Regular create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/0-255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/1024-1279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/10240-10495.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/10496-10751.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/10752-11007.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/11008-11263.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/11264-11519.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/11520-11775.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/11776-12031.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/12032-12287.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/12288-12543.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/12544-12799.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/1280-1535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/12800-13055.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/13056-13311.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/13312-13567.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/13568-13823.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/13824-14079.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/14080-14335.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/14336-14591.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/14592-14847.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/14848-15103.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/15104-15359.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/1536-1791.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/15360-15615.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/15616-15871.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/15872-16127.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/16128-16383.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/16384-16639.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/16640-16895.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/16896-17151.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/17152-17407.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/17408-17663.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/17664-17919.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/1792-2047.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/17920-18175.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/18176-18431.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/18432-18687.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/18688-18943.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/18944-19199.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/19200-19455.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/19456-19711.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/19712-19967.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/19968-20223.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/20224-20479.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/2048-2303.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/20480-20735.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/20736-20991.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/20992-21247.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/21248-21503.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/21504-21759.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/21760-22015.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/22016-22271.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/22272-22527.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/22528-22783.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/22784-23039.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/2304-2559.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/23040-23295.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/23296-23551.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/23552-23807.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/23808-24063.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/24064-24319.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/24320-24575.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/24576-24831.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/24832-25087.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/25088-25343.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/25344-25599.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/256-511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/2560-2815.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/25600-25855.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/25856-26111.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/26112-26367.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/26368-26623.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/26624-26879.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/26880-27135.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/27136-27391.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/27392-27647.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/27648-27903.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/27904-28159.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/2816-3071.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/28160-28415.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/28416-28671.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/28672-28927.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/28928-29183.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/29184-29439.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/29440-29695.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/29696-29951.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/29952-30207.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/30208-30463.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/30464-30719.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/3072-3327.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/30720-30975.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/30976-31231.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/31232-31487.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/31488-31743.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/31744-31999.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/32000-32255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/32256-32511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/32512-32767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/32768-33023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/33024-33279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/3328-3583.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/33280-33535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/33536-33791.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/33792-34047.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/34048-34303.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/34304-34559.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/34560-34815.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/34816-35071.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/35072-35327.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/35328-35583.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/35584-35839.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/3584-3839.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/35840-36095.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/36096-36351.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/36352-36607.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/36608-36863.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/36864-37119.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/37120-37375.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/37376-37631.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/37632-37887.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/37888-38143.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/38144-38399.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/3840-4095.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/38400-38655.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/38656-38911.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/38912-39167.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/39168-39423.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/39424-39679.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/39680-39935.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/39936-40191.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/40192-40447.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/40448-40703.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/40704-40959.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/4096-4351.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/40960-41215.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/41216-41471.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/41472-41727.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/41728-41983.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/41984-42239.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/42240-42495.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/42496-42751.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/42752-43007.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/43008-43263.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/43264-43519.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/4352-4607.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/43520-43775.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/43776-44031.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/44032-44287.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/44288-44543.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/44544-44799.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/44800-45055.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/45056-45311.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/45312-45567.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/45568-45823.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/45824-46079.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/4608-4863.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/46080-46335.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/46336-46591.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/46592-46847.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/46848-47103.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/47104-47359.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/47360-47615.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/47616-47871.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/47872-48127.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/48128-48383.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/48384-48639.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/4864-5119.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/48640-48895.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/48896-49151.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/49152-49407.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/49408-49663.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/49664-49919.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/49920-50175.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/50176-50431.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/50432-50687.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/50688-50943.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/50944-51199.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/512-767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/5120-5375.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/51200-51455.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/51456-51711.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/51712-51967.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/51968-52223.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/52224-52479.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/52480-52735.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/52736-52991.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/52992-53247.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/53248-53503.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/53504-53759.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/5376-5631.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/53760-54015.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/54016-54271.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/54272-54527.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/54528-54783.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/54784-55039.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/55040-55295.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/55296-55551.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/55552-55807.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/55808-56063.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/56064-56319.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/5632-5887.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/56320-56575.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/56576-56831.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/56832-57087.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/57088-57343.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/57344-57599.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/57600-57855.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/57856-58111.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/58112-58367.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/58368-58623.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/58624-58879.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/5888-6143.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/58880-59135.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/59136-59391.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/59392-59647.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/59648-59903.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/59904-60159.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/60160-60415.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/60416-60671.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/60672-60927.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/60928-61183.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/61184-61439.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/6144-6399.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/61440-61695.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/61696-61951.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/61952-62207.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/62208-62463.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/62464-62719.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/62720-62975.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/62976-63231.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/63232-63487.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/63488-63743.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/63744-63999.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/6400-6655.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/64000-64255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/64256-64511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/64512-64767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/64768-65023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/65024-65279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/65280-65535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/6656-6911.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/6912-7167.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/7168-7423.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/7424-7679.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/768-1023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/7680-7935.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/7936-8191.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/8192-8447.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/8448-8703.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/8704-8959.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/8960-9215.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/9216-9471.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/9472-9727.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/9728-9983.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Bold/9984-10239.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/0-255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/1024-1279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/10240-10495.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/10496-10751.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/10752-11007.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/11008-11263.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/11264-11519.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/11520-11775.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/11776-12031.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/12032-12287.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/12288-12543.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/12544-12799.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/1280-1535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/12800-13055.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/13056-13311.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/13312-13567.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/13568-13823.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/13824-14079.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/14080-14335.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/14336-14591.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/14592-14847.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/14848-15103.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/15104-15359.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/1536-1791.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/15360-15615.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/15616-15871.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/15872-16127.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/16128-16383.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/16384-16639.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/16640-16895.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/16896-17151.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/17152-17407.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/17408-17663.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/17664-17919.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/1792-2047.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/17920-18175.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/18176-18431.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/18432-18687.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/18688-18943.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/18944-19199.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/19200-19455.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/19456-19711.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/19712-19967.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/19968-20223.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/20224-20479.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/2048-2303.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/20480-20735.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/20736-20991.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/20992-21247.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/21248-21503.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/21504-21759.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/21760-22015.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/22016-22271.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/22272-22527.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/22528-22783.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/22784-23039.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/2304-2559.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/23040-23295.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/23296-23551.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/23552-23807.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/23808-24063.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/24064-24319.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/24320-24575.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/24576-24831.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/24832-25087.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/25088-25343.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/25344-25599.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/256-511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/2560-2815.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/25600-25855.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/25856-26111.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/26112-26367.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/26368-26623.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/26624-26879.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/26880-27135.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/27136-27391.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/27392-27647.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/27648-27903.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/27904-28159.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/2816-3071.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/28160-28415.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/28416-28671.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/28672-28927.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/28928-29183.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/29184-29439.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/29440-29695.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/29696-29951.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/29952-30207.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/30208-30463.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/30464-30719.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/3072-3327.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/30720-30975.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/30976-31231.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/31232-31487.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/31488-31743.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/31744-31999.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/32000-32255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/32256-32511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/32512-32767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/32768-33023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/33024-33279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/3328-3583.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/33280-33535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/33536-33791.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/33792-34047.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/34048-34303.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/34304-34559.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/34560-34815.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/34816-35071.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/35072-35327.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/35328-35583.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/35584-35839.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/3584-3839.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/35840-36095.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/36096-36351.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/36352-36607.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/36608-36863.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/36864-37119.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/37120-37375.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/37376-37631.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/37632-37887.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/37888-38143.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/38144-38399.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/3840-4095.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/38400-38655.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/38656-38911.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/38912-39167.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/39168-39423.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/39424-39679.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/39680-39935.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/39936-40191.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/40192-40447.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/40448-40703.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/40704-40959.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/4096-4351.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/40960-41215.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/41216-41471.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/41472-41727.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/41728-41983.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/41984-42239.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/42240-42495.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/42496-42751.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/42752-43007.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/43008-43263.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/43264-43519.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/4352-4607.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/43520-43775.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/43776-44031.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/44032-44287.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/44288-44543.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/44544-44799.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/44800-45055.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/45056-45311.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/45312-45567.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/45568-45823.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/45824-46079.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/4608-4863.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/46080-46335.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/46336-46591.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/46592-46847.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/46848-47103.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/47104-47359.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/47360-47615.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/47616-47871.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/47872-48127.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/48128-48383.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/48384-48639.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/4864-5119.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/48640-48895.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/48896-49151.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/49152-49407.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/49408-49663.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/49664-49919.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/49920-50175.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/50176-50431.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/50432-50687.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/50688-50943.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/50944-51199.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/512-767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/5120-5375.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/51200-51455.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/51456-51711.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/51712-51967.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/51968-52223.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/52224-52479.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/52480-52735.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/52736-52991.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/52992-53247.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/53248-53503.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/53504-53759.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/5376-5631.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/53760-54015.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/54016-54271.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/54272-54527.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/54528-54783.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/54784-55039.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/55040-55295.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/55296-55551.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/55552-55807.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/55808-56063.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/56064-56319.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/5632-5887.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/56320-56575.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/56576-56831.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/56832-57087.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/57088-57343.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/57344-57599.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/57600-57855.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/57856-58111.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/58112-58367.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/58368-58623.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/58624-58879.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/5888-6143.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/58880-59135.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/59136-59391.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/59392-59647.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/59648-59903.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/59904-60159.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/60160-60415.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/60416-60671.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/60672-60927.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/60928-61183.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/61184-61439.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/6144-6399.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/61440-61695.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/61696-61951.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/61952-62207.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/62208-62463.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/62464-62719.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/62720-62975.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/62976-63231.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/63232-63487.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/63488-63743.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/63744-63999.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/6400-6655.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/64000-64255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/64256-64511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/64512-64767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/64768-65023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/65024-65279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/65280-65535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/6656-6911.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/6912-7167.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/7168-7423.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/7424-7679.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/768-1023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/7680-7935.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/7936-8191.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/8192-8447.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/8448-8703.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/8704-8959.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/8960-9215.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/9216-9471.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/9472-9727.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/9728-9983.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Medium/9984-10239.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/0-255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/1024-1279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/10240-10495.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/10496-10751.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/10752-11007.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/11008-11263.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/11264-11519.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/11520-11775.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/11776-12031.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/12032-12287.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/12288-12543.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/12544-12799.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/1280-1535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/12800-13055.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/13056-13311.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/13312-13567.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/13568-13823.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/13824-14079.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/14080-14335.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/14336-14591.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/14592-14847.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/14848-15103.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/15104-15359.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/1536-1791.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/15360-15615.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/15616-15871.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/15872-16127.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/16128-16383.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/16384-16639.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/16640-16895.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/16896-17151.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/17152-17407.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/17408-17663.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/17664-17919.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/1792-2047.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/17920-18175.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/18176-18431.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/18432-18687.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/18688-18943.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/18944-19199.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/19200-19455.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/19456-19711.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/19712-19967.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/19968-20223.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/20224-20479.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/2048-2303.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/20480-20735.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/20736-20991.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/20992-21247.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/21248-21503.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/21504-21759.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/21760-22015.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/22016-22271.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/22272-22527.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/22528-22783.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/22784-23039.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/2304-2559.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/23040-23295.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/23296-23551.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/23552-23807.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/23808-24063.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/24064-24319.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/24320-24575.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/24576-24831.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/24832-25087.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/25088-25343.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/25344-25599.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/256-511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/2560-2815.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/25600-25855.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/25856-26111.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/26112-26367.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/26368-26623.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/26624-26879.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/26880-27135.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/27136-27391.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/27392-27647.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/27648-27903.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/27904-28159.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/2816-3071.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/28160-28415.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/28416-28671.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/28672-28927.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/28928-29183.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/29184-29439.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/29440-29695.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/29696-29951.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/29952-30207.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/30208-30463.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/30464-30719.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/3072-3327.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/30720-30975.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/30976-31231.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/31232-31487.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/31488-31743.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/31744-31999.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/32000-32255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/32256-32511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/32512-32767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/32768-33023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/33024-33279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/3328-3583.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/33280-33535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/33536-33791.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/33792-34047.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/34048-34303.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/34304-34559.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/34560-34815.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/34816-35071.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/35072-35327.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/35328-35583.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/35584-35839.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/3584-3839.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/35840-36095.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/36096-36351.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/36352-36607.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/36608-36863.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/36864-37119.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/37120-37375.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/37376-37631.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/37632-37887.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/37888-38143.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/38144-38399.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/3840-4095.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/38400-38655.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/38656-38911.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/38912-39167.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/39168-39423.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/39424-39679.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/39680-39935.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/39936-40191.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/40192-40447.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/40448-40703.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/40704-40959.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/4096-4351.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/40960-41215.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/41216-41471.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/41472-41727.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/41728-41983.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/41984-42239.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/42240-42495.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/42496-42751.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/42752-43007.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/43008-43263.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/43264-43519.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/4352-4607.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/43520-43775.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/43776-44031.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/44032-44287.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/44288-44543.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/44544-44799.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/44800-45055.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/45056-45311.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/45312-45567.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/45568-45823.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/45824-46079.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/4608-4863.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/46080-46335.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/46336-46591.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/46592-46847.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/46848-47103.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/47104-47359.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/47360-47615.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/47616-47871.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/47872-48127.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/48128-48383.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/48384-48639.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/4864-5119.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/48640-48895.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/48896-49151.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/49152-49407.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/49408-49663.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/49664-49919.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/49920-50175.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/50176-50431.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/50432-50687.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/50688-50943.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/50944-51199.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/512-767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/5120-5375.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/51200-51455.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/51456-51711.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/51712-51967.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/51968-52223.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/52224-52479.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/52480-52735.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/52736-52991.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/52992-53247.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/53248-53503.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/53504-53759.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/5376-5631.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/53760-54015.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/54016-54271.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/54272-54527.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/54528-54783.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/54784-55039.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/55040-55295.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/55296-55551.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/55552-55807.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/55808-56063.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/56064-56319.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/5632-5887.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/56320-56575.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/56576-56831.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/56832-57087.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/57088-57343.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/57344-57599.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/57600-57855.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/57856-58111.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/58112-58367.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/58368-58623.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/58624-58879.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/5888-6143.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/58880-59135.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/59136-59391.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/59392-59647.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/59648-59903.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/59904-60159.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/60160-60415.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/60416-60671.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/60672-60927.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/60928-61183.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/61184-61439.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/6144-6399.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/61440-61695.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/61696-61951.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/61952-62207.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/62208-62463.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/62464-62719.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/62720-62975.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/62976-63231.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/63232-63487.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/63488-63743.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/63744-63999.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/6400-6655.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/64000-64255.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/64256-64511.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/64512-64767.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/64768-65023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/65024-65279.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/65280-65535.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/6656-6911.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/6912-7167.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/7168-7423.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/7424-7679.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/768-1023.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/7680-7935.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/7936-8191.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/8192-8447.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/8448-8703.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/8704-8959.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/8960-9215.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/9216-9471.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/9472-9727.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/9728-9983.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/Roboto Regular/9984-10239.pbf create mode 100644 play-services-maps/core/mapbox/src/main/assets/sprites.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/sprites.png create mode 100644 play-services-maps/core/mapbox/src/main/assets/sprites@2x.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/sprites@2x.png create mode 100644 play-services-maps/core/mapbox/src/main/assets/style-mapbox-outdoors-v12.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/style-microg-normal-mapbox.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/style-microg-normal-stadia.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/style-microg-satellite-mapbox.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/style-microg-satellite-stadia.json create mode 100644 play-services-maps/core/mapbox/src/main/assets/style-stadia-outdoors.json create mode 100644 play-services-maps/core/mapbox/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/maps_dynamite/ModuleDescriptor.java create mode 100644 play-services-maps/core/mapbox/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java create mode 100644 play-services-maps/core/mapbox/src/main/java/com/mapbox/android/accounts/v1/MapboxAccounts.java create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/AbstractGoogleMap.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/CameraBoundsWithSizeUpdate.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/CameraUpdateFactory.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleLocationEngine.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/LiteGoogleMap.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/MapFragment.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/MapView.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/Pattern.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/Projection.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/SourceLocationEngine.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/StreetViewPanoramaFragment.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/StreetViewPanoramaView.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/Styles.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/UiSettings.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/BitmapDescriptor.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/BitmapDescriptorFactory.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Circle.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/GroundOverlay.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/InfoWindow.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Marker.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Markup.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/TileOverlay.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MultiArchLoader.kt create mode 100644 play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/typeConverter.kt create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable-hdpi/maps_default_marker.png create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable-ldpi/maps_default_marker.png create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable-mdpi/maps_default_marker.png create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable-xhdpi/maps_default_marker.png create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable-xxhdpi/maps_default_marker.png create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable-xxxhdpi/maps_default_marker.png create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable/location_dot.xml create mode 100644 play-services-maps/core/mapbox/src/main/res/drawable/maps_default_bubble.xml create mode 100644 play-services-maps/core/mapbox/src/main/res/layout/maps_default_bubble_layout.xml create mode 100644 play-services-maps/core/vtm/build.gradle create mode 100644 play-services-maps/core/vtm/microg-theme/build.gradle create mode 100644 play-services-maps/core/vtm/microg-theme/resources/assets/styles/microg.xml create mode 100644 play-services-maps/core/vtm/microg-theme/resources/assets/symbols/dot_white.svg create mode 100644 play-services-maps/core/vtm/microg-theme/resources/assets/symbols/transit/train_station.svg create mode 100644 play-services-maps/core/vtm/microg-theme/resources/assets/symbols/transit/train_station_small.svg create mode 100644 play-services-maps/core/vtm/microg-theme/src/org/oscim/theme/MicrogThemes.java create mode 100644 play-services-maps/core/vtm/src/main/AndroidManifest.xml create mode 100644 play-services-maps/core/vtm/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/ApplicationContextWrapper.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/BackendMap.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/BackendMapView.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/ContainerLayout.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/GmsMapsTypeHelper.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/GoogleMapImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/MapFragmentImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/MapViewImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/ProjectionImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/ResourcesContainer.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/StreetViewPanoramaFragmentImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/StreetViewPanoramaViewImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/UiSettingsImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/AbstractBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/AssetBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/BitmapBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/BitmapDescriptorFactoryImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/BitmapDescriptorImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/DefaultBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/FileBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/PathBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/bitmap/ResourceBitmapDescriptor.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/camera/CameraUpdate.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/camera/CameraUpdateFactoryImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/camera/MapPositionCameraUpdate.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/camera/NoCameraUpdate.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/data/SharedTileCache.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/data/SharedTileProvider.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/CircleImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/ClearableVectorLayer.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/DrawableMarkup.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/GroundOverlayImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/InfoWindow.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/MarkerImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/MarkerItemMarkup.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/Markup.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolygonImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolylineImpl.java create mode 100644 play-services-maps/core/vtm/src/main/java/org/microg/gms/maps/vtm/markup/TileOverlayImpl.java create mode 100644 play-services-maps/core/vtm/src/main/res/drawable/maps_default_marker.png create mode 100644 play-services-maps/core/vtm/src/main/res/drawable/maps_default_window.9.png create mode 100644 play-services-maps/core/vtm/src/main/res/drawable/nop.png create mode 100644 play-services-maps/src/main/AndroidManifest.xml create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/GoogleMapOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/StreetViewPanoramaOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/ICameraUpdateFactoryDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/ICancelableCallback.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/ICreator.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IGoogleMapDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IInfoWindowAdapter.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/ILocationSourceDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IMapFragmentDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IMapViewDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnCameraChangeListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnCameraIdleListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnCameraMoveCanceledListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnCameraMoveListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnCameraMoveStartedListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnCircleClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnGroundOverlayClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnIndoorStateChangeListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnInfoWindowClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnInfoWindowCloseListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnInfoWindowLongClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnLocationChangeListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMapClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMapLoadedCallback.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMapLongClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMapReadyCallback.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMarkerClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMarkerDragListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMyLocationButtonClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMyLocationChangeListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnMyLocationClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnPolygonClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnPolylineClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnStreetViewPanoramaCameraChangeListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnStreetViewPanoramaChangeListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnStreetViewPanoramaClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnStreetViewPanoramaLongClickListener.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IOnStreetViewPanoramaReadyCallback.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IProjectionDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/ISnapshotReadyCallback.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IStreetViewPanoramaDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IStreetViewPanoramaFragmentDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IStreetViewPanoramaViewDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/internal/IUiSettingsDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/CameraPosition.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/Cap.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/CircleOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/Dash.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/Dot.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/Gap.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/GroundOverlayOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/LatLng.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/LatLngBounds.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/MapStyleOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/MarkerOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/PatternItem.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/PolygonOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/PolylineOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/StreetViewPanoramaCamera.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/StreetViewPanoramaLocation.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/StreetViewPanoramaOrientation.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/StreetViewSource.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/StyleSpan.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/Tile.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/TileOverlayOptions.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/VisibleRegion.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IBitmapDescriptorFactoryDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/ICircleDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IGroundOverlayDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorBuildingDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorLevelDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IMarkerDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IPolygonDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/IPolylineDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/ITileOverlayDelegate.aidl create mode 100644 play-services-maps/src/main/aidl/com/google/android/gms/maps/model/internal/ITileProviderDelegate.aidl create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/CameraUpdate.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/CameraUpdateFactory.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/GoogleMap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/GoogleMapOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/MapFragment.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/MapView.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/MapsInitializer.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/OnMapReadyCallback.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/OnMapsSdkInitializedCallback.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/OnStreetViewPanoramaReadyCallback.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/StreetViewPanorama.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/StreetViewPanoramaFragment.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/StreetViewPanoramaOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/StreetViewPanoramaView.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/BitmapDescriptor.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/BitmapDescriptorFactory.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/ButtCap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/CameraPosition.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/Cap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/Circle.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/CircleOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/CustomCap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/Dash.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/Dot.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/Gap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/GroundOverlayOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/JointType.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/LatLng.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/LatLngBounds.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/MapStyleOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/MarkerOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/PatternItem.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/PolygonOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/PolylineOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/RoundCap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/RuntimeRemoteException.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/SquareCap.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StampStyle.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StreetViewPanoramaCamera.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StreetViewPanoramaLink.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StreetViewPanoramaLocation.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StreetViewPanoramaOrientation.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StreetViewSource.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StrokeStyle.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/StyleSpan.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/Tile.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/TileOverlayOptions.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/TileProvider.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/VisibleRegion.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/model/package-info.java create mode 100644 play-services-maps/src/main/java/com/google/android/gms/maps/package-info.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/MapLifecycleDelegate.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/MapViewDelegate.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/MapViewLifecycleHelper.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/MapsBundleHelper.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/MapsContextLoader.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/StreetViewLifecycleDelegate.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/StreetViewPanoramaViewDelegate.java create mode 100644 play-services-maps/src/main/java/org/microg/gms/maps/StreetViewPanoramaViewLifecycleHelper.java create mode 100644 play-services-maps/src/main/res/values/maps_attrs.xml create mode 100644 play-services-measurement-base/build.gradle create mode 100644 play-services-measurement-base/src/main/AndroidManifest.xml create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/IAppMeasurementDynamiteService.aidl create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/IBundleReceiver.aidl create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/IDynamiteUploadBatchesCallback.aidl create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/IEventHandlerProxy.aidl create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/IStringProvider.aidl create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/InitializationParams.aidl create mode 100644 play-services-measurement-base/src/main/aidl/com/google/android/gms/measurement/api/internal/ScionActivityInfo.aidl create mode 100644 play-services-measurement-base/src/main/java/com/google/android/gms/measurement/api/internal/InitializationParams.java create mode 100644 play-services-measurement-base/src/main/java/com/google/android/gms/measurement/api/internal/ScionActivityInfo.java create mode 100644 play-services-mlkit/barcode-scanning/build.gradle create mode 100644 play-services-mlkit/barcode-scanning/src/main/AndroidManifest.xml create mode 100644 play-services-mlkit/barcode-scanning/src/main/aidl/com/google/mlkit/vision/barcode/aidls/IBarcodeScanner.aidl create mode 100644 play-services-mlkit/barcode-scanning/src/main/aidl/com/google/mlkit/vision/barcode/aidls/IBarcodeScannerCreator.aidl create mode 100644 play-services-mlkit/barcode-scanning/src/main/aidl/com/google/mlkit/vision/barcode/internal/Barcode.aidl create mode 100644 play-services-mlkit/barcode-scanning/src/main/aidl/com/google/mlkit/vision/barcode/internal/BarcodeScannerOptions.aidl create mode 100644 play-services-mlkit/barcode-scanning/src/main/aidl/com/google/mlkit/vision/barcode/internal/ImageMetadata.aidl create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/Address.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/Barcode.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/BarcodeScannerOptions.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/CalendarDateTime.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/CalendarEvent.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/ContactInfo.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/DriverLicense.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/Email.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/GeoPoint.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/ImageMetadata.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/PersonName.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/Phone.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/Sms.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/UrlBookmark.java create mode 100644 play-services-mlkit/barcode-scanning/src/main/java/com/google/mlkit/vision/barcode/internal/WiFi.java create mode 100644 play-services-mlkit/face-detection/build.gradle create mode 100644 play-services-mlkit/face-detection/src/main/AndroidManifest.xml create mode 100644 play-services-mlkit/face-detection/src/main/aidl/com/google/mlkit/vision/face/FaceDetectionOptions.aidl create mode 100644 play-services-mlkit/face-detection/src/main/aidl/com/google/mlkit/vision/face/FrameMetadataParcel.aidl create mode 100644 play-services-mlkit/face-detection/src/main/aidl/com/google/mlkit/vision/face/aidls/FaceParcel.aidl create mode 100644 play-services-mlkit/face-detection/src/main/aidl/com/google/mlkit/vision/face/aidls/IFaceDetector.aidl create mode 100644 play-services-mlkit/face-detection/src/main/aidl/com/google/mlkit/vision/face/aidls/IFaceDetectorCreator.aidl create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/Face.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/FaceContour.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/FaceDetectionOptions.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/FaceLandmark.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/FrameMetadataParcel.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/aidls/ContourParcel.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/aidls/FaceParcel.java create mode 100644 play-services-mlkit/face-detection/src/main/java/com/google/mlkit/vision/face/aidls/LandmarkParcel.java create mode 100644 play-services-nearby/build.gradle create mode 100644 play-services-nearby/core/build.gradle create mode 100644 play-services-nearby/core/package/build.gradle create mode 100644 play-services-nearby/core/package/src/main/AndroidManifest.xml create mode 100644 play-services-nearby/core/package/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsSettingsProvider.kt create mode 100644 play-services-nearby/core/src/main/AndroidManifest.xml create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/AdvertiserService.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/CleanupService.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Constants.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Crypto.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/DeviceInfo.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureDatabase.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureFileProvider.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationService.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Extensions.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/MeasuredExposure.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/NotifyService.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ScannerService.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ServiceInfo.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ServiceTrigger.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/DotChartPreference.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/DotChartView.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsAppFragment.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsAppPreferencesFragment.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsConfirmActivity.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsFragment.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsRpisFragment.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/ExposureNotificationsSettingsActivity.kt create mode 100644 play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ui/Utils.kt create mode 100644 play-services-nearby/core/src/main/proto/TemporaryExposureKeyFile.proto create mode 100644 play-services-nearby/core/src/main/res/drawable/ic_alert.xml create mode 100644 play-services-nearby/core/src/main/res/drawable/ic_bluetooth_off.xml create mode 100644 play-services-nearby/core/src/main/res/drawable/ic_location_off.xml create mode 100644 play-services-nearby/core/src/main/res/drawable/ic_outline_location_on.xml create mode 100644 play-services-nearby/core/src/main/res/drawable/ic_virus_outline.xml create mode 100644 play-services-nearby/core/src/main/res/layout/exposure_notifications_app_fragment.xml create mode 100644 play-services-nearby/core/src/main/res/layout/exposure_notifications_confirm_activity.xml create mode 100644 play-services-nearby/core/src/main/res/layout/exposure_notifications_confirm_delete.xml create mode 100644 play-services-nearby/core/src/main/res/layout/exposure_notifications_settings_activity.xml create mode 100644 play-services-nearby/core/src/main/res/layout/preference_dot_chart.xml create mode 100644 play-services-nearby/core/src/main/res/navigation/nav_nearby.xml create mode 100644 play-services-nearby/core/src/main/res/values-ar/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ast/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-az/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-be/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-cs/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-de/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-eo/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-es/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-fa/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-fi/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-fil/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-fr/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ga/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-in/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-is/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-it/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ja/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ko/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-lv/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-lzh/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ml/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-nl/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-pl/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-pt/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ro/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ru/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-sl/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-sr/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-sv/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ta/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-th/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-tr/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-ug/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-uk/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-vi/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-nearby/core/src/main/res/values/strings.xml create mode 100644 play-services-nearby/core/src/main/res/xml/preferences_exposure_notifications.xml create mode 100644 play-services-nearby/core/src/main/res/xml/preferences_exposure_notifications_app.xml create mode 100644 play-services-nearby/core/src/main/res/xml/preferences_exposure_notifications_exportedfiles.xml create mode 100644 play-services-nearby/core/src/main/res/xml/preferences_exposure_notifications_rpis.xml create mode 100644 play-services-nearby/core/src/test/java/org/microg/gms/nearby/exposurenotification/CryptoTest.java create mode 100644 play-services-nearby/core/src/test/java/org/microg/gms/nearby/exposurenotification/TestVectors.java create mode 100644 play-services-nearby/src/main/AndroidManifest.xml create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/DailySummary.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/DiagnosisKeysDataMapping.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/ExposureInformation.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/ExposureSummary.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/ExposureWindow.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/PackageConfiguration.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/TemporaryExposureKey.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetCalibrationConfidenceParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetDailySummariesParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetDiagnosisKeysDataMappingParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetExposureInformationParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetExposureSummaryParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetExposureWindowsParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetPackageConfigurationParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetStatusParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetTemporaryExposureKeyHistoryParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/GetVersionParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IBooleanCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IDailySummaryListCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IDiagnosisKeyFileSupplier.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IDiagnosisKeysDataMappingCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IExposureInformationListCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IExposureSummaryCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IExposureWindowListCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IIntCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/ILongCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/INearbyExposureNotificationService.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IPackageConfigurationCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/ITemporaryExposureKeyListCallback.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IsEnabledParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/ProvideDiagnosisKeysParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/RequestPreAuthorizedTemporaryExposureKeyHistoryParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/RequestPreAuthorizedTemporaryExposureKeyReleaseParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/SetDiagnosisKeysDataMappingParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/StartParams.aidl create mode 100644 play-services-nearby/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/StopParams.aidl create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/Nearby.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/CalibrationConfidence.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/DailySummariesConfig.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/DailySummary.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/DiagnosisKeyFileProvider.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/DiagnosisKeysDataMapping.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureConfiguration.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureInformation.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationClient.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationStatus.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationStatusCodes.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureSummary.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureWindow.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/Infectiousness.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/PackageConfiguration.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ReportType.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/RiskLevel.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ScanInstance.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/TemporaryExposureKey.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/WakeUpService.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetCalibrationConfidenceParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetDailySummariesParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetDiagnosisKeysDataMappingParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetExposureInformationParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetExposureSummaryParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetExposureWindowsParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetPackageConfigurationParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetStatusParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetTemporaryExposureKeyHistoryParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/GetVersionParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/IsEnabledParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/ProvideDiagnosisKeysParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/RequestPreAuthorizedTemporaryExposureKeyHistoryParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/RequestPreAuthorizedTemporaryExposureKeyReleaseParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/SetDiagnosisKeysDataMappingParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/StartParams.java create mode 100644 play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/internal/StopParams.java create mode 100644 play-services-nearby/src/main/java/org/microg/gms/nearby/ExposureNotificationApiClient.java create mode 100644 play-services-nearby/src/main/java/org/microg/gms/nearby/ExposureNotificationClientImpl.java create mode 100644 play-services-oss-licenses/build.gradle create mode 100644 play-services-oss-licenses/core/build.gradle create mode 100644 play-services-oss-licenses/core/src/main/AndroidManifest.xml create mode 100644 play-services-oss-licenses/core/src/main/kotlin/org/microg/gms/oss/licenses/core/OssLicensesService.kt create mode 100644 play-services-oss-licenses/src/main/AndroidManifest.xml create mode 100644 play-services-oss-licenses/src/main/aidl/com/google/android/gms/oss/licenses/IOSSLicenseService.aidl create mode 100644 play-services-oss-licenses/src/main/aidl/com/google/android/gms/oss/licenses/License.aidl create mode 100644 play-services-oss-licenses/src/main/java/com/google/android/gms/oss/licenses/License.java create mode 100644 play-services-oss-licenses/src/main/java/com/google/android/gms/oss/licenses/OssLicensesActivity.java create mode 100644 play-services-oss-licenses/src/main/java/com/google/android/gms/oss/licenses/OssLicensesMenuActivity.java create mode 100644 play-services-oss-licenses/src/main/java/com/google/android/gms/oss/licenses/OssLicensesServiceImpl.java create mode 100644 play-services-oss-licenses/src/main/java/org/microg/gms/oss/licenses/LicenseUtil.java create mode 100644 play-services-oss-licenses/src/main/java/org/microg/gms/oss/licenses/OssLicenseServiceApiClient.java create mode 100644 play-services-oss-licenses/src/main/res/layout/libraries_social_licenses_license.xml create mode 100644 play-services-oss-licenses/src/main/res/layout/libraries_social_licenses_license_activity.xml create mode 100644 play-services-oss-licenses/src/main/res/layout/libraries_social_licenses_license_menu_activity.xml create mode 100644 play-services-oss-licenses/src/main/res/layout/license_menu_activity_no_licenses.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ar/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ast/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-az/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-be/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-cs/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-de/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-eo/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-es/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-fa/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-fi/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-fil/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-fr/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ga/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-in/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-is/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-it/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ja/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ko/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-lv/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-lzh/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ml/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-nb-rNO/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-nl/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-pl/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-pt-rBR/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-pt/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ro/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ru/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-sl/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-sr/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-sv/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ta/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-th/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-tr/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-ug/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-uk/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-vi/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-zh-rCN/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values-zh-rTW/strings.xml create mode 100644 play-services-oss-licenses/src/main/res/values/strings.xml create mode 100644 play-services-panorama/build.gradle create mode 100644 play-services-panorama/core/build.gradle create mode 100644 play-services-panorama/core/src/main/AndroidManifest.xml create mode 100644 play-services-panorama/core/src/main/kotlin/org/microg/gms/panorama/PanoramaService.kt create mode 100644 play-services-panorama/src/AndroidManifest.xml create mode 100644 play-services-panorama/src/main/aidl/com/google/android/gms/panorama/Panorama.java create mode 100644 play-services-panorama/src/main/aidl/com/google/android/gms/panorama/PanoramaApi.java create mode 100644 play-services-panorama/src/main/aidl/com/google/android/gms/panorama/internal/IPanoramaCallbacks.aidl create mode 100644 play-services-panorama/src/main/aidl/com/google/android/gms/panorama/internal/IPanoramaService.aidl create mode 100644 play-services-pay/build.gradle create mode 100644 play-services-pay/core/build.gradle create mode 100644 play-services-pay/core/src/main/AndroidManifest.xml create mode 100644 play-services-pay/core/src/main/kotlin/org/microg/gms/pay/PayActivity.kt create mode 100644 play-services-pay/core/src/main/kotlin/org/microg/gms/pay/PayService.kt create mode 100644 play-services-pay/core/src/main/kotlin/org/microg/gms/pay/ThirdPartyPayService.kt create mode 100644 play-services-pay/src/main/AndroidManifest.xml create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/EmoneyReadiness.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/GetMdocCredentialRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/GetWalletStatusResponse.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyCardTapEventRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/PayApiError.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/PushEmoneyCardRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/SavePassesRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/SyncBundleRequest.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IPayService.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IPayServiceCallbacks.aidl create mode 100644 play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IThirdPartyPayService.aidl create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadiness.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadinessStatus.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/GetMdocCredentialRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/GetWalletStatusResponse.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/NotifyCardTapEventRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/Pay.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/PayApiAvailabilityStatus.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/PayApiError.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/PayClient.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/PushEmoneyCardRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/SavePassesRequest.java create mode 100644 play-services-pay/src/main/java/com/google/android/gms/pay/SyncBundleRequest.java create mode 100644 play-services-pay/src/main/java/org/microg/gms/pay/PayApiClient.java create mode 100644 play-services-pay/src/main/java/org/microg/gms/pay/PayClientImpl.java create mode 100644 play-services-pay/src/main/java/org/microg/gms/pay/PayServiceCallbacks.java create mode 100644 play-services-pay/src/main/java/org/microg/gms/pay/ThirdPartyPayApiClient.java create mode 100644 play-services-phenotype/build.gradle create mode 100644 play-services-phenotype/src/main/AndroidManifest.xml create mode 100644 play-services-phenotype/src/main/java/com/google/android/gms/phenotype/Configuration.java create mode 100644 play-services-phenotype/src/main/java/com/google/android/gms/phenotype/ExperimentTokens.java create mode 100644 play-services-phenotype/src/main/java/com/google/android/gms/phenotype/Flag.java create mode 100644 play-services-phenotype/src/main/java/com/google/android/gms/phenotype/GenericDimension.java create mode 100644 play-services-places-placereport/build.gradle create mode 100644 play-services-places-placereport/src/main/AndroidManifest.xml create mode 100644 play-services-places-placereport/src/main/java/com/google/android/gms/location/places/PlaceReport.java create mode 100644 play-services-places/build.gradle create mode 100644 play-services-places/src/main/AndroidManifest.xml create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/AutocompleteFilter.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/NearbyAlertRequest.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/PlaceFilter.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/PlaceReport.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/PlaceRequest.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/UserAddedPlace.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/UserDataType.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/internal/IGooglePlaceDetectionService.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/internal/IGooglePlacesService.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/internal/IPlacesCallbacks.aidl create mode 100644 play-services-places/src/main/aidl/com/google/android/gms/location/places/internal/PlacesParams.aidl create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/AutocompleteFilter.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/NearbyAlertRequest.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/Place.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/PlaceFilter.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/PlaceRequest.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/UserAddedPlace.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/UserDataType.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/internal/PlaceImpl.java create mode 100644 play-services-places/src/main/java/com/google/android/gms/location/places/internal/PlacesParams.java create mode 100644 play-services-recaptcha/build.gradle create mode 100644 play-services-recaptcha/core/build.gradle create mode 100644 play-services-recaptcha/core/src/main/AndroidManifest.xml create mode 100644 play-services-recaptcha/core/src/main/kotlin/org/microg/gms/recaptcha/RecaptchaGuardImpl.kt create mode 100644 play-services-recaptcha/core/src/main/kotlin/org/microg/gms/recaptcha/RecaptchaImpl.kt create mode 100644 play-services-recaptcha/core/src/main/kotlin/org/microg/gms/recaptcha/RecaptchaService.kt create mode 100644 play-services-recaptcha/core/src/main/kotlin/org/microg/gms/recaptcha/RecaptchaWebImpl.kt create mode 100644 play-services-recaptcha/core/src/main/proto/recaptcha.proto create mode 100644 play-services-recaptcha/src/main/AndroidManifest.xml create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/RecaptchaAction.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/RecaptchaHandle.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/RecaptchaResultData.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/ExecuteParams.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/ExecuteResults.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/ICloseCallback.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/IExecuteCallback.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/IInitCallback.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/IRecaptchaService.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/InitParams.aidl create mode 100644 play-services-recaptcha/src/main/aidl/com/google/android/gms/recaptcha/internal/InitResults.aidl create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/HttpStatusException.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/Recaptcha.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaAction.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaActionType.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaClient.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaHandle.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaNetworkException.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaOptionalObject.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaResultData.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/RecaptchaStatusCodes.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/VerificationHandle.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/VerificationResult.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/internal/ExecuteParams.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/internal/ExecuteResults.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/internal/InitParams.java create mode 100644 play-services-recaptcha/src/main/java/com/google/android/gms/recaptcha/internal/InitResults.java create mode 100644 play-services-recaptcha/src/main/java/org/microg/gms/recaptcha/RecaptchaClientImpl.java create mode 100644 play-services-recaptcha/src/main/java/org/microg/gms/recaptcha/RecaptchaGmsClient.java create mode 100644 play-services-safetynet/build.gradle create mode 100644 play-services-safetynet/core/build.gradle create mode 100644 play-services-safetynet/core/src/main/AndroidManifest.xml create mode 100644 play-services-safetynet/core/src/main/java/org/microg/gms/safetynet/Attestation.java create mode 100644 play-services-safetynet/core/src/main/kotlin/org/microg/gms/safetynet/ReCaptchaActivity.kt create mode 100644 play-services-safetynet/core/src/main/kotlin/org/microg/gms/safetynet/SafetyNetClientService.kt create mode 100644 play-services-safetynet/core/src/main/kotlin/org/microg/gms/safetynet/SafetyNetDatabase.kt create mode 100644 play-services-safetynet/core/src/main/kotlin/org/microg/gms/safetynet/SafetyNetPreferences.kt create mode 100644 play-services-safetynet/core/src/main/kotlin/org/microg/gms/safetynet/SafetyNetRequestType.kt create mode 100644 play-services-safetynet/core/src/main/kotlin/org/microg/gms/safetynet/SafetyNetSummary.kt create mode 100644 play-services-safetynet/core/src/main/proto/safetynet.proto create mode 100644 play-services-safetynet/core/src/main/res/drawable/ic_recaptcha.xml create mode 100644 play-services-safetynet/core/src/main/res/layout/recaptcha_window.xml create mode 100644 play-services-safetynet/src/main/AndroidManifest.xml create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/AttestationData.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/HarmfulAppsData.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/HarmfulAppsInfo.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/RecaptchaResultData.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/RemoveHarmfulAppData.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/SafeBrowsingData.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/internal/ISafetyNetCallbacks.aidl create mode 100644 play-services-safetynet/src/main/aidl/com/google/android/gms/safetynet/internal/ISafetyNetService.aidl create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/AttestationData.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/HarmfulAppsData.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/HarmfulAppsInfo.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/RecaptchaResultData.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/RemoveHarmfulAppData.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/SafeBrowsingData.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/SafetyNet.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/SafetyNetApi.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/SafetyNetClient.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/SafetyNetStatusCodes.java create mode 100644 play-services-safetynet/src/main/java/com/google/android/gms/safetynet/VerifyAppsConstants.java create mode 100644 play-services-safetynet/src/main/java/org/microg/gms/safetynet/ISafetyNetCallbacksDefaultStub.java create mode 100644 play-services-safetynet/src/main/java/org/microg/gms/safetynet/SafetyNetApiImpl.java create mode 100644 play-services-safetynet/src/main/java/org/microg/gms/safetynet/SafetyNetGmsClient.java create mode 100644 play-services-tapandpay/build.gradle create mode 100644 play-services-tapandpay/core/build.gradle create mode 100644 play-services-tapandpay/core/src/main/AndroidManifest.xml create mode 100644 play-services-tapandpay/core/src/main/kotlin/org/microg/gms/tapandpay/TapAndPayService.kt create mode 100644 play-services-tapandpay/src/main/AndroidManifest.xml create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/firstparty/GetActiveAccountResponse.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/firstparty/GetAllCardsResponse.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/firstparty/RefreshSeCardsResponse.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/firstparty/TokenStatus.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/internal/ITapAndPayService.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/internal/ITapAndPayServiceCallbacks.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/internal/firstparty/GetActiveAccountRequest.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/internal/firstparty/GetAllCardsRequest.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/internal/firstparty/RefreshSeCardsRequest.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/internal/firstparty/SetActiveAccountRequest.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/issuer/TokenInfo.aidl create mode 100644 play-services-tapandpay/src/main/aidl/com/google/android/gms/tapandpay/issuer/TokenStatus.aidl create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/TapAndPayStatusCodes.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/AccountInfo.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/CardInfo.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/GetActiveAccountResponse.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/GetAllCardsResponse.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/RefreshSeCardsResponse.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/TokenReference.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/firstparty/TokenStatus.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/internal/firstparty/GetActiveAccountRequest.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/internal/firstparty/GetAllCardsRequest.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/internal/firstparty/RefreshSeCardsRequest.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/internal/firstparty/SetActiveAccountRequest.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/issuer/TokenInfo.java create mode 100644 play-services-tapandpay/src/main/java/com/google/android/gms/tapandpay/issuer/TokenStatus.java create mode 100644 play-services-tasks/build.gradle create mode 100644 play-services-tasks/ktx/build.gradle create mode 100644 play-services-tasks/ktx/src/main/AndroidManifest.xml create mode 100644 play-services-tasks/ktx/src/main/kotlin/com/google/android/gms/tasks/Tasks.kt create mode 100644 play-services-tasks/src/main/AndroidManifest.xml create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/CancellationToken.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/CancellationTokenSource.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/Continuation.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/DuplicateTaskCompletionException.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/OnCanceledListener.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/OnCompleteListener.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/OnFailureListener.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/OnSuccessListener.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/OnTokenCanceledListener.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/RuntimeExecutionException.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/SuccessContinuation.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/Task.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskCompletionSource.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskExecutors.java create mode 100644 play-services-tasks/src/main/java/com/google/android/gms/tasks/Tasks.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/CancellationTokenImpl.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/CancelledExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/CompletedExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/ContinuationExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/ContinuationWithExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/FailureExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/SuccessContinuationExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/SuccessExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/TaskImpl.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateExecutor.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateListener.java create mode 100644 play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateListenerLifecycleObserver.java create mode 100644 play-services-threadnetwork/build.gradle create mode 100644 play-services-threadnetwork/core/build.gradle create mode 100644 play-services-threadnetwork/core/src/main/AndroidManifest.xml create mode 100644 play-services-threadnetwork/core/src/main/kotlin/org/microg/gms/threadnetwork/ThreadNetworkService.kt create mode 100644 play-services-threadnetwork/src/main/AndroidManifest.xml create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/ThreadBorderAgent.aidl create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/ThreadNetworkCredentials.aidl create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/internal/IGetCredentialsByExtendedPanIdCallback.aidl create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/internal/IGetPreferredCredentialsCallback.aidl create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/internal/IIsPreferredCredentialsCallback.aidl create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/internal/IThreadNetworkService.aidl create mode 100644 play-services-threadnetwork/src/main/aidl/com/google/android/gms/threadnetwork/internal/IThreadNetworkServiceCallbacks.aidl create mode 100644 play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/IsPreferredCredentialsResult.java create mode 100644 play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/ThreadBorderAgent.java create mode 100644 play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/ThreadNetworkClient.java create mode 100644 play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/ThreadNetworkCredentials.java create mode 100644 play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/ThreadNetworkStatusCodes.java create mode 100644 play-services-vision-common/build.gradle create mode 100644 play-services-vision-common/src/main/AndroidManifest.xml create mode 100644 play-services-vision-common/src/main/aidl/com/google/android/gms/vision/internal/FrameMetadataParcel.aidl create mode 100644 play-services-vision-common/src/main/java/com/google/android/gms/vision/CameraSource.java create mode 100644 play-services-vision-common/src/main/java/com/google/android/gms/vision/Detector.java create mode 100644 play-services-vision-common/src/main/java/com/google/android/gms/vision/Frame.java create mode 100644 play-services-vision-common/src/main/java/com/google/android/gms/vision/internal/FrameMetadataParcel.java create mode 100644 play-services-vision/build.gradle create mode 100644 play-services-vision/core/build.gradle create mode 100644 play-services-vision/core/src/main/AndroidManifest.xml create mode 100644 play-services-vision/core/src/main/assets/face_detection_yunet_2023mar.onnx create mode 100644 play-services-vision/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/vision/barcode/ModuleDescriptor.java create mode 100644 play-services-vision/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/vision/dynamite/ModuleDescriptor.java create mode 100644 play-services-vision/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/vision/dynamite/barcode/ModuleDescriptor.java create mode 100644 play-services-vision/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/vision/dynamite/face/ModuleDescriptor.java create mode 100644 play-services-vision/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/vision/face/ModuleDescriptor.java create mode 100644 play-services-vision/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/mlkit/dynamite/face/ModuleDescriptor.java create mode 100644 play-services-vision/core/src/main/kotlin/com/google/android/gms/vision/barcode/ChimeraNativeBarcodeDetectorCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/com/google/android/gms/vision/barcode/mlkit/BarcodeScannerCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/com/google/android/gms/vision/client/DynamiteNativeBarcodeDetectorCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/com/google/android/gms/vision/client/DynamiteNativeFaceDetectorCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/com/google/android/gms/vision/face/ChimeraNativeFaceDetectorCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/com/google/android/gms/vision/face/mlkit/FaceDetectorCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/com/google/mlkit/vision/face/bundled/internal/ThickFaceDetectorCreator.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/BarcodeDecodeHelper.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/BarcodeDetector.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/BarcodeScanner.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/MultiBarcodeReader.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/QRCodeScannerView.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/RawBarcodeData.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/barcode/extensions.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/face/FaceDetector.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/face/FaceDetectorHelper.kt create mode 100644 play-services-vision/core/src/main/kotlin/org/microg/gms/vision/face/mlkit/FaceDetector.kt create mode 100644 play-services-vision/src/main/AndroidManifest.xml create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/barcode/Barcode.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/barcode/internal/client/BarcodeDetectorOptions.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/barcode/internal/client/INativeBarcodeDetector.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/barcode/internal/client/INativeBarcodeDetectorCreator.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/face/Contour.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/face/Landmark.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/face/internal/client/DetectionOptions.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/face/internal/client/FaceParcel.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/face/internal/client/INativeFaceDetector.aidl create mode 100644 play-services-vision/src/main/aidl/com/google/android/gms/vision/face/internal/client/INativeFaceDetectorCreator.aidl create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/barcode/Barcode.java create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/barcode/BarcodeDetector.java create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/barcode/internal/client/BarcodeDetectorOptions.java create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/face/Contour.java create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/face/Landmark.java create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/face/internal/client/DetectionOptions.java create mode 100644 play-services-vision/src/main/java/com/google/android/gms/vision/face/internal/client/FaceParcel.java create mode 100644 play-services-wearable/build.gradle create mode 100644 play-services-wearable/core/build.gradle create mode 100644 play-services-wearable/core/src/main/AndroidManifest.xml create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/CapabilityManager.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/ClockworkNodePreferences.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/ConfigurationDatabaseHelper.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/DataItemInternal.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/DataItemRecord.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/MessageHandler.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/NodeDatabaseHelper.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/RpcHelper.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/WearableImpl.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/WearableService.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/WearableServiceImpl.java create mode 100644 play-services-wearable/core/src/main/java/org/microg/gms/wearable/location/WearableLocationService.java create mode 100644 play-services-wearable/src/main/AndroidManifest.xml create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/Asset.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/ConnectionConfiguration.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/AddListenerRequest.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/AddLocalCapabilityResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/AmsEntityUpdateParcelable.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/AncsNotificationParcelable.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/CapabilityInfoParcelable.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/ChannelEventParcelable.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/ChannelReceiveFileResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/ChannelSendFileResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/CloseChannelResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/DeleteDataItemsResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetAllCapabilitiesResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetCapabilityResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetChannelInputStreamResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetChannelOutputStreamResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetCloudSyncOptInOutDoneResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetCloudSyncOptInStatusResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetCloudSyncSettingResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetConfigResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetConfigsResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetConnectedNodesResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetDataItemResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetFdForAssetResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/GetLocalNodeResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/IChannelStreamCallbacks.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/IWearableCallbacks.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/IWearableListener.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/IWearableService.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/MessageEventParcelable.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/NodeParcelable.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/OpenChannelResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/PutDataRequest.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/PutDataResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/RemoveListenerRequest.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/RemoveLocalCapabilityResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/SendMessageResponse.aidl create mode 100644 play-services-wearable/src/main/aidl/com/google/android/gms/wearable/internal/StorageInfoResponse.aidl create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/AmsEntityUpdate.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/AncsNotification.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/Asset.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/CapabilityApi.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/CapabilityInfo.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/Channel.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/ChannelApi.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/ChannelIOException.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/ConnectionConfiguration.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataApi.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataEvent.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataEventBuffer.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataItem.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataItemAsset.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataItemBuffer.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataMap.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/DataMapItem.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/MessageApi.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/MessageEvent.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/Node.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/NodeApi.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/PutDataMapRequest.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/Wearable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/WearableListenerService.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/WearableStatusCodes.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/AddListenerRequest.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/AddLocalCapabilityResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/AmsEntityUpdateParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/AncsNotificationParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/CapabilityInfoParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/ChannelEventParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/ChannelParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/ChannelReceiveFileResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/ChannelSendFileResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/CloseChannelResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/DataItemAssetParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/DataItemParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/DeleteDataItemsResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetAllCapabilitiesResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetCapabilityResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetChannelInputStreamResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetChannelOutputStreamResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetCloudSyncOptInOutDoneResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetCloudSyncOptInStatusResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetCloudSyncSettingResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetConfigResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetConfigsResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetConnectedNodesResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetDataItemResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetFdForAssetResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/GetLocalNodeResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/MessageEventParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/NodeParcelable.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/OpenChannelResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/PutDataRequest.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/PutDataResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/RemoveListenerRequest.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/RemoveLocalCapabilityResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/SendMessageResponse.java create mode 100644 play-services-wearable/src/main/java/com/google/android/gms/wearable/internal/StorageInfoResponse.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/BaseWearableCallbacks.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/ChannelImpl.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/DataApiImpl.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/MessageApiImpl.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/NodeApiImpl.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/WearableApiClientBuilder.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/WearableClientImpl.java create mode 100644 play-services-wearable/src/main/java/org/microg/gms/wearable/databundle/DataBundleUtil.java create mode 100644 play-services-wearable/src/main/proto/databundle.proto create mode 100644 play-services/build.gradle create mode 100644 play-services/src/main/AndroidManifest.xml create mode 100644 proguard.flags create mode 100644 safe-parcel-processor/build.gradle create mode 100644 safe-parcel-processor/src/main/AndroidManifest.xml create mode 100644 safe-parcel-processor/src/main/kotlin/org/microg/safeparcel/SafeParcelProcessor.kt create mode 100644 safe-parcel-processor/src/main/resources/META-INF/gradle/incremental.annotation.processors create mode 100644 safe-parcel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor create mode 100644 settings.gradle create mode 100644 vending-app/build.gradle create mode 100644 vending-app/proguard-rules.pro create mode 100644 vending-app/src/huawei/AndroidManifest.xml create mode 100644 vending-app/src/huaweilh/AndroidManifest.xml create mode 100644 vending-app/src/main/AndroidManifest.xml create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingCreateAlternativeBillingOnlyTokenCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingCreateExternalPaymentReportingDetailsCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingDelegateToBackendCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingGetAlternativeBillingOnlyDialogIntentCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingGetBillingConfigCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingGetExternalPaymentDialogIntentCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingIsAlternativeBillingOnlyAvailableCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingIsExternalPaymentAvailableCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/billing/IInAppBillingServiceCallback.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/licensing/ILicenseV2ResultListener.aidl create mode 100644 vending-app/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/engage/protocol/IAppEngageService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/engage/protocol/IAppEngageServiceAvailableCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/engage/protocol/IAppEngageServiceDeleteClustersCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/engage/protocol/IAppEngageServicePublishClustersCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/engage/protocol/IAppEngageServicePublishStatusCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/finsky/externalreferrer/IGetInstallReferrerService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/finsky/services/IPlayGearheadService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/appupdate/protocol/IAppUpdateService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/appupdate/protocol/IAppUpdateServiceCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/assetpacks/protocol/IAssetModuleService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/assetpacks/protocol/IAssetModuleServiceCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/inappreview/protocol/IInAppReviewService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/inappreview/protocol/IInAppReviewServiceCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/integrity/protocol/IExpressIntegrityService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/integrity/protocol/IExpressIntegrityServiceCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/integrity/protocol/IIntegrityService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/integrity/protocol/IIntegrityServiceCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/integrity/protocol/IRequestDialogCallback.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/splitinstall/protocol/ISplitInstallService.aidl create mode 100644 vending-app/src/main/aidl/com/google/android/play/core/splitinstall/protocol/ISplitInstallServiceCallback.aidl create mode 100644 vending-app/src/main/java/com/android/billingclient/api/BillingClient.java create mode 100644 vending-app/src/main/java/com/android/billingclient/package-info.java create mode 100644 vending-app/src/main/java/com/android/vending/GrantFakeSignaturePermissionActivity.java create mode 100644 vending-app/src/main/java/com/android/vending/VendingPreferences.kt create mode 100644 vending-app/src/main/java/com/android/vending/billing/InAppBillingService.kt create mode 100644 vending-app/src/main/java/com/android/vending/licensing/LicenseChecker.kt create mode 100644 vending-app/src/main/java/com/android/vending/licensing/LicenseServiceNotification.kt create mode 100644 vending-app/src/main/java/com/android/vending/licensing/LicensingService.kt create mode 100644 vending-app/src/main/java/com/google/android/finsky/externalreferrer/GetInstallReferrerService.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetLocation.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackException.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackLocation.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackManager.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackManagerFactory.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackManagerImpl.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackServiceClient.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackState.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackStateImpl.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackStateUpdateListener.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackStates.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/AssetPackStatesImpl.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/model/AssetPackErrorCode.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/model/AssetPackStatus.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/model/AssetPackStorageMethod.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/model/AssetPackUpdateAvailability.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/protocol/BroadcastConstants.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/protocol/BundleKeys.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/protocol/CompressionFormat.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/assetpacks/protocol/PatchFormat.java create mode 100644 vending-app/src/main/java/com/google/android/play/core/listener/StateUpdateListener.java create mode 100644 vending-app/src/main/java/org/microg/vending/MarketIntentRedirect.java create mode 100644 vending-app/src/main/java/org/microg/vending/WorkAccountChangedReceiver.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/AcquireFreeAppLicense.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/AuthManager.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/CheckinServiceClient.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/Constants.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ContextProvider.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/DeviceIdentifier.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/GServices.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/InAppBillingServiceImpl.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/PurchaseActivity.java create mode 100644 vending-app/src/main/java/org/microg/vending/billing/PurchaseManager.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/SettingsManager.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/Utils.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/AcknowledgePurchaseParams.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/AcknowledgePurchaseResult.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/AcquireParams.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/AcquireResult.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/AuthData.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/BuyFlowParams.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/ClientInfo.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/ConsumePurchaseParams.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/ConsumePurchaseResult.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/DeviceEnvInfo.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/GetPurchaseHistoryParams.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/GetPurchaseHistoryResult.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/GetSkuDetailsParams.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/GetSkuDetailsResult.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/GooglePlayApi.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/HeaderProvider.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/HttpClient.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/IAPCacheManager.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/IAPCore.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/IAPResult.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/PurchaseItem.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/Utils.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/ui/UIComponents.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/ui/UIParser.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/core/ui/UIType.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/Extends.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/HtmlText.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/InAppBillingHostActivity.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/PlayWebViewActivity.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/SheetUIPage.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/Utils.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/WebViewHelper.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/logic/InAppBillingViewModel.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/logic/Models.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/theme/Color.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/theme/Theme.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/theme/Type.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/widgets/LoadingDialog.kt create mode 100644 vending-app/src/main/java/org/microg/vending/billing/ui/widgets/PasswdInputDialog.kt create mode 100644 vending-app/src/main/java/org/microg/vending/delivery/Delivery.kt create mode 100644 vending-app/src/main/java/org/microg/vending/enterprise/App.kt create mode 100644 vending-app/src/main/java/org/microg/vending/enterprise/AppState.kt create mode 100644 vending-app/src/main/java/org/microg/vending/enterprise/EnterpriseApp.kt create mode 100644 vending-app/src/main/java/org/microg/vending/enterprise/InstallProgress.kt create mode 100644 vending-app/src/main/java/org/microg/vending/splitinstall/Constants.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/InstallProgressNotification.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/MainActivity.java create mode 100644 vending-app/src/main/java/org/microg/vending/ui/NetworkState.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/WorkAppsActivity.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/WorkVendingTopAppBar.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/components/AppRow.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/components/EnterpriseList.kt create mode 100644 vending-app/src/main/java/org/microg/vending/ui/components/NetworkState.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/extensions.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/installer/Constants.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/installer/Install.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/installer/InstallReceiver.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/installer/InstallService.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/installer/SessionResultReceiver.kt create mode 100644 vending-app/src/main/kotlin/com/android/vending/installer/Uninstall.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/DeviceSyncInfo.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/DownloadManager.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/IntegrityExtensions.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/accounts/impl/AccountsChangedReceiver.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/appcontentservice/engage/AppEngageServiceV2.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/appcontentservice/engage/AppEngageServiceV2Impl.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/assetmoduleservice/AbstractAssetModuleServiceImpl.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/assetmoduleservice/AssetModuleService.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/assetmoduleservice/DownloadData.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/DeviceIntegrity.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/DeviceIntegrityAndExpiredKey.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/DeviceIntegrityResponse.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/ExpressIntegrityService.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/ExpressIntegritySession.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/IntermediateIntegrity.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/IntermediateIntegrityResponse.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/expressintegrityservice/PackageInformation.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/extensions.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/inappreviewservice/InAppReviewService.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/installservice/DevTriggeredUpdateService.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/integrityservice/IntegrityService.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/model/IntegrityErrorCode.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/model/StandardIntegrityException.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/services/PlayGearheadService.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/splitinstallservice/DownloadStatus.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/splitinstallservice/PackageComponent.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/splitinstallservice/SplitInstallManager.kt create mode 100644 vending-app/src/main/kotlin/com/google/android/finsky/splitinstallservice/SplitInstallService.kt create mode 100644 vending-app/src/main/kotlin/org/microg/vending/installer/AppInstallActivity.kt create mode 100644 vending-app/src/main/kotlin/org/microg/vending/installer/AppInstallExtensions.kt create mode 100644 vending-app/src/main/kotlin/org/microg/vending/installer/AskInstallReminderActivity.kt create mode 100644 vending-app/src/main/proto/AssetModule.proto create mode 100644 vending-app/src/main/proto/BulkGrant.proto create mode 100644 vending-app/src/main/proto/DeliveryResponse.proto create mode 100644 vending-app/src/main/proto/EnterpriseClientPolicy.proto create mode 100644 vending-app/src/main/proto/GetItemsRequest.proto create mode 100644 vending-app/src/main/proto/GetItemsResponse.proto create mode 100644 vending-app/src/main/proto/GooglePlayResponse.proto create mode 100644 vending-app/src/main/proto/Integrity.proto create mode 100644 vending-app/src/main/proto/LicenseResult.proto create mode 100644 vending-app/src/main/proto/Locality.proto create mode 100644 vending-app/src/main/proto/Purchase.proto create mode 100644 vending-app/src/main/proto/RequestHeader.proto create mode 100644 vending-app/src/main/proto/SyncRequest.proto create mode 100644 vending-app/src/main/proto/Timestamp.proto create mode 100644 vending-app/src/main/proto/UploadDeviceConfigResponse.proto create mode 100644 vending-app/src/main/res/drawable-v21/anim_check_mark.xml create mode 100644 vending-app/src/main/res/drawable-v21/google_play.xml create mode 100644 vending-app/src/main/res/drawable-v26/ic_app_foreground.xml create mode 100644 vending-app/src/main/res/drawable-v26/ic_app_foreground_mono.xml create mode 100644 vending-app/src/main/res/drawable/ic_cancel.xml create mode 100644 vending-app/src/main/res/drawable/ic_download.xml create mode 100644 vending-app/src/main/res/drawable/ic_notification.xml create mode 100644 vending-app/src/main/res/drawable/ic_update.xml create mode 100644 vending-app/src/main/res/drawable/ic_work.xml create mode 100644 vending-app/src/main/res/layout/activity_install_reminder.xml create mode 100644 vending-app/src/main/res/layout/activiy_confirm_purchase.xml create mode 100644 vending-app/src/main/res/mipmap-anydpi-v26/ic_app.xml create mode 100644 vending-app/src/main/res/mipmap-hdpi/ic_app.png create mode 100644 vending-app/src/main/res/mipmap-mdpi/ic_app.png create mode 100644 vending-app/src/main/res/mipmap-xhdpi/ic_app.png create mode 100644 vending-app/src/main/res/mipmap-xxhdpi/ic_app.png create mode 100644 vending-app/src/main/res/mipmap-xxxhdpi/ic_app.png create mode 100644 vending-app/src/main/res/values-ar/strings.xml create mode 100644 vending-app/src/main/res/values-ast/strings.xml create mode 100644 vending-app/src/main/res/values-az/strings.xml create mode 100644 vending-app/src/main/res/values-be/strings.xml create mode 100644 vending-app/src/main/res/values-cs/strings.xml create mode 100644 vending-app/src/main/res/values-de/strings.xml create mode 100644 vending-app/src/main/res/values-eo/strings.xml create mode 100644 vending-app/src/main/res/values-es/strings.xml create mode 100644 vending-app/src/main/res/values-fa/strings.xml create mode 100644 vending-app/src/main/res/values-fi/strings.xml create mode 100644 vending-app/src/main/res/values-fil/strings.xml create mode 100644 vending-app/src/main/res/values-fr/strings.xml create mode 100644 vending-app/src/main/res/values-ga/strings.xml create mode 100644 vending-app/src/main/res/values-in/strings.xml create mode 100644 vending-app/src/main/res/values-is/strings.xml create mode 100644 vending-app/src/main/res/values-it/strings.xml create mode 100644 vending-app/src/main/res/values-ja/strings.xml create mode 100644 vending-app/src/main/res/values-ko/strings.xml create mode 100644 vending-app/src/main/res/values-lv/strings.xml create mode 100644 vending-app/src/main/res/values-lzh/strings.xml create mode 100644 vending-app/src/main/res/values-ml/strings.xml create mode 100644 vending-app/src/main/res/values-nb-rNO/strings.xml create mode 100644 vending-app/src/main/res/values-nl/strings.xml create mode 100644 vending-app/src/main/res/values-pl/strings.xml create mode 100644 vending-app/src/main/res/values-pt-rBR/strings.xml create mode 100644 vending-app/src/main/res/values-pt/strings.xml create mode 100644 vending-app/src/main/res/values-ro/strings.xml create mode 100644 vending-app/src/main/res/values-ru/strings.xml create mode 100644 vending-app/src/main/res/values-sl/strings.xml create mode 100644 vending-app/src/main/res/values-sr/strings.xml create mode 100644 vending-app/src/main/res/values-sv/strings.xml create mode 100644 vending-app/src/main/res/values-ta/strings.xml create mode 100644 vending-app/src/main/res/values-th/strings.xml create mode 100644 vending-app/src/main/res/values-tr/strings.xml create mode 100644 vending-app/src/main/res/values-ug/strings.xml create mode 100644 vending-app/src/main/res/values-uk/strings.xml create mode 100644 vending-app/src/main/res/values-v11/styles.xml create mode 100644 vending-app/src/main/res/values-v26/ic_app_background.xml create mode 100644 vending-app/src/main/res/values-vi/strings.xml create mode 100644 vending-app/src/main/res/values-zh-rCN/strings.xml create mode 100644 vending-app/src/main/res/values-zh-rTW/strings.xml create mode 100644 vending-app/src/main/res/values/colors.xml create mode 100644 vending-app/src/main/res/values/strings.xml create mode 100644 vending-app/src/main/res/values/styles.xml diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..5cd0169 --- /dev/null +++ b/Android.mk @@ -0,0 +1,41 @@ +# Copyright (c) 2015 μg Project Team +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE := GmsCore +LOCAL_MODULE_TAGS := optional +LOCAL_PACKAGE_NAME := GmsCore + +gmscore_root := $(LOCAL_PATH) +gmscore_dir := play-services-core +gmscore_out := $(TARGET_COMMON_OUT_ROOT)/obj/APPS/$(LOCAL_MODULE)_intermediates +gmscore_build := $(gmscore_dir)/build +gmscore_apk := $(gmscore_build)/outputs/apk/release/play-services-core-release-unsigned.apk + +$(gmscore_root)/$(gmscore_apk): + rm -Rf $(gmscore_root)/$(gmscore_build) + mkdir -p $(ANDROID_BUILD_TOP)/$(gmscore_out) + ln -s $(ANDROID_BUILD_TOP)/$(gmscore_out) $(ANDROID_BUILD_TOP)/$(gmscore_root)/$(gmscore_build) + echo "sdk.dir=$(ANDROID_HOME)" > $(gmscore_root)/local.properties + cd $(gmscore_root) && git submodule update --recursive --init + cd $(gmscore_root)/$(gmscore_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease + +LOCAL_CERTIFICATE := platform +LOCAL_SRC_FILES := $(gmscore_apk) +LOCAL_MODULE_CLASS := APPS +LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) + +include $(BUILD_PREBUILT) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..4ed90b9 --- /dev/null +++ b/LICENSES/Apache-2.0.txt @@ -0,0 +1,208 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, +AND DISTRIBUTION + + 1. Definitions. + + + +"License" shall mean the terms and conditions for use, reproduction, and distribution +as defined by Sections 1 through 9 of this document. + + + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + + + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct +or indirect, to cause the direction or management of such entity, whether +by contract or otherwise, or (ii) ownership of fifty percent (50%) or more +of the outstanding shares, or (iii) beneficial ownership of such entity. + + + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions +granted by this License. + + + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + + + +"Object" form shall mean any form resulting from mechanical transformation +or translation of a Source form, including but not limited to compiled object +code, generated documentation, and conversions to other media types. + + + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice that +is included in or attached to the work (an example is provided in the Appendix +below). + + + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative +Works shall not include works that remain separable from, or merely link (or +bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative +Works thereof, that is intentionally submitted to Licensor for inclusion in +the Work by the copyright owner or by an individual or Legal Entity authorized +to submit on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication +sent to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + + + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently incorporated +within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable copyright license to reproduce, prepare +Derivative Works of, publicly display, publicly perform, sublicense, and distribute +the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, +each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) patent +license to make, have made, use, offer to sell, sell, import, and otherwise +transfer the Work, where such license applies only to those patent claims +licensable by such Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work to which such +Contribution(s) was submitted. If You institute patent litigation against +any entity (including a cross-claim or counterclaim in a lawsuit) alleging +that the Work or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses granted to You +under this License for that Work shall terminate as of the date such litigation +is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or +Derivative Works thereof in any medium, with or without modifications, and +in Source or Object form, provided that You meet the following conditions: + +(a) You must give any other recipients of the Work or Derivative Works a copy +of this License; and + +(b) You must cause any modified files to carry prominent notices stating that +You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source +form of the Work, excluding those notices that do not pertain to any part +of the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its distribution, +then any Derivative Works that You distribute must include a readable copy +of the attribution notices contained within such NOTICE file, excluding those +notices that do not pertain to any part of the Derivative Works, in at least +one of the following places: within a NOTICE text file distributed as part +of the Derivative Works; within the Source form or documentation, if provided +along with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works +that You distribute, alongside or as an addendum to the NOTICE text from the +Work, provided that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, +or distribution of Your modifications, or for any such Derivative Works as +a whole, provided Your use, reproduction, and distribution of the Work otherwise +complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any +Contribution intentionally submitted for inclusion in the Work by You to the +Licensor shall be under the terms and conditions of this License, without +any additional terms or conditions. Notwithstanding the above, nothing herein +shall supersede or modify the terms of any separate license agreement you +may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, +trademarks, service marks, or product names of the Licensor, except as required +for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to +in writing, Licensor provides the Work (and each Contributor provides its +Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR +A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness +of using or redistributing the Work and assume any risks associated with Your +exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether +in tort (including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed to +in writing, shall any Contributor be liable to You for damages, including +any direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of the use or inability +to use the Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all other commercial +damages or losses), even if such Contributor has been advised of the possibility +of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work +or Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such obligations, +You may act only on Your own behalf and on Your sole responsibility, not on +behalf of any other Contributor, and only if You agree to indemnify, defend, +and hold each Contributor harmless for any liability incurred by, or claims +asserted against, such Contributor by reason of your accepting any such warranty +or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own identifying +information. (Don't include the brackets!) The text should be enclosed in +the appropriate comment syntax for the file format. We also recommend that +a file or class name and description of purpose be included on the same "printed +page" as the copyright notice for easier identification within third-party +archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt new file mode 100644 index 0000000..3f92dfc --- /dev/null +++ b/LICENSES/CC-BY-4.0.txt @@ -0,0 +1,324 @@ +Creative Commons Attribution 4.0 International Creative Commons Corporation +("Creative Commons") is not a law firm and does not provide legal services +or legal advice. Distribution of Creative Commons public licenses does not +create a lawyer-client or other relationship. Creative Commons makes its licenses +and related information available on an "as-is" basis. Creative Commons gives +no warranties regarding its licenses, any material licensed under their terms +and conditions, or any related information. Creative Commons disclaims all +liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions +that creators and other rights holders may use to share original works of +authorship and other material subject to copyright and certain other rights +specified in the public license below. The following considerations are for +informational purposes only, are not exhaustive, and do not form part of our +licenses. + +Considerations for licensors: Our public licenses are intended for use by +those authorized to give the public permission to use material in ways otherwise +restricted by copyright and certain other rights. Our licenses are irrevocable. +Licensors should read and understand the terms and conditions of the license +they choose before applying it. Licensors should also secure all rights necessary +before applying our licenses so that the public can reuse the material as +expected. Licensors should clearly mark any material not subject to the license. +This includes other CC-licensed material, or material used under an exception +or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors + +Considerations for the public: By using one of our public licenses, a licensor +grants the public permission to use the licensed material under specified +terms and conditions. If the licensor's permission is not necessary for any +reason–for example, because of any applicable exception or limitation to copyright–then +that use is not regulated by the license. Our licenses grant only permissions +under copyright and certain other rights that a licensor has authority to +grant. Use of the licensed material may still be restricted for other reasons, +including because others have copyright or other rights in the material. A +licensor may make special requests, such as asking that all changes be marked +or described. Although not required by our licenses, you are encouraged to +respect those requests where reasonable. More considerations for the public +: wiki.creativecommons.org/Considerations_for_licensees Creative Commons Attribution +4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to +be bound by the terms and conditions of this Creative Commons Attribution +4.0 International Public License ("Public License"). To the extent this Public +License may be interpreted as a contract, You are granted the Licensed Rights +in consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the Licensor +receives from making the Licensed Material available under these terms and +conditions. + +Section 1 – Definitions. + +a. Adapted Material means material subject to Copyright and Similar Rights +that is derived from or based upon the Licensed Material and in which the +Licensed Material is translated, altered, arranged, transformed, or otherwise +modified in a manner requiring permission under the Copyright and Similar +Rights held by the Licensor. For purposes of this Public License, where the +Licensed Material is a musical work, performance, or sound recording, Adapted +Material is always produced where the Licensed Material is synched in timed +relation with a moving image. + +b. Adapter's License means the license You apply to Your Copyright and Similar +Rights in Your contributions to Adapted Material in accordance with the terms +and conditions of this Public License. + +c. Copyright and Similar Rights means copyright and/or similar rights closely +related to copyright including, without limitation, performance, broadcast, +sound recording, and Sui Generis Database Rights, without regard to how the +rights are labeled or categorized. For purposes of this Public License, the +rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + +d. Effective Technological Measures means those measures that, in the absence +of proper authority, may not be circumvented under laws fulfilling obligations +under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, +and/or similar international agreements. + +e. Exceptions and Limitations means fair use, fair dealing, and/or any other +exception or limitation to Copyright and Similar Rights that applies to Your +use of the Licensed Material. + +f. Licensed Material means the artistic or literary work, database, or other +material to which the Licensor applied this Public License. + +g. Licensed Rights means the rights granted to You subject to the terms and +conditions of this Public License, which are limited to all Copyright and +Similar Rights that apply to Your use of the Licensed Material and that the +Licensor has authority to license. + +h. Licensor means the individual(s) or entity(ies) granting rights under this +Public License. + +i. Share means to provide material to the public by any means or process that +requires permission under the Licensed Rights, such as reproduction, public +display, public performance, distribution, dissemination, communication, or +importation, and to make material available to the public including in ways +that members of the public may access the material from a place and at a time +individually chosen by them. + +j. Sui Generis Database Rights means rights other than copyright resulting +from Directive 96/9/EC of the European Parliament and of the Council of 11 +March 1996 on the legal protection of databases, as amended and/or succeeded, +as well as other essentially equivalent rights anywhere in the world. + +k. You means the individual or entity exercising the Licensed Rights under +this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + +1. Subject to the terms and conditions of this Public License, the Licensor +hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, +irrevocable license to exercise the Licensed Rights in the Licensed Material +to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + +2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions +and Limitations apply to Your use, this Public License does not apply, and +You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + +4. Media and formats; technical modifications allowed. The Licensor authorizes +You to exercise the Licensed Rights in all media and formats whether now known +or hereafter created, and to make technical modifications necessary to do +so. The Licensor waives and/or agrees not to assert any right or authority +to forbid You from making technical modifications necessary to exercise the +Licensed Rights, including technical modifications necessary to circumvent +Effective Technological Measures. For purposes of this Public License, simply +making modifications authorized by this Section 2(a)(4) never produces Adapted +Material. + + 5. Downstream recipients. + +A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed +Material automatically receives an offer from the Licensor to exercise the +Licensed Rights under the terms and conditions of this Public License. + +B. No downstream restrictions. You may not offer or impose any additional +or different terms or conditions on, or apply any Effective Technological +Measures to, the Licensed Material if doing so restricts exercise of the Licensed +Rights by any recipient of the Licensed Material. + +6. No endorsement. Nothing in this Public License constitutes or may be construed +as permission to assert or imply that You are, or that Your use of the Licensed +Material is, connected with, or sponsored, endorsed, or granted official status +by, the Licensor or others designated to receive attribution as provided in +Section 3(a)(1)(A)(i). + + b. Other rights. + +1. Moral rights, such as the right of integrity, are not licensed under this +Public License, nor are publicity, privacy, and/or other similar personality +rights; however, to the extent possible, the Licensor waives and/or agrees +not to assert any such rights held by the Licensor to the limited extent necessary +to allow You to exercise the Licensed Rights, but not otherwise. + +2. Patent and trademark rights are not licensed under this Public License. + +3. To the extent possible, the Licensor waives any right to collect royalties +from You for the exercise of the Licensed Rights, whether directly or through +a collecting society under any voluntary or waivable statutory or compulsory +licensing scheme. In all other cases the Licensor expressly reserves any right +to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following +conditions. + + a. Attribution. + +1. If You Share the Licensed Material (including in modified form), You must: + +A. retain the following if it is supplied by the Licensor with the Licensed +Material: + +i. identification of the creator(s) of the Licensed Material and any others +designated to receive attribution, in any reasonable manner requested by the +Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + +v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + +B. indicate if You modified the Licensed Material and retain an indication +of any previous modifications; and + +C. indicate the Licensed Material is licensed under this Public License, and +include the text of, or the URI or hyperlink to, this Public License. + +2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner +based on the medium, means, and context in which You Share the Licensed Material. +For example, it may be reasonable to satisfy the conditions by providing a +URI or hyperlink to a resource that includes the required information. + +3. If requested by the Licensor, You must remove any of the information required +by Section 3(a)(1)(A) to the extent reasonably practicable. + +4. If You Share Adapted Material You produce, the Adapter's License You apply +must not prevent recipients of the Adapted Material from complying with this +Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to +Your use of the Licensed Material: + +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, +reuse, reproduce, and Share all or a substantial portion of the contents of +the database; + +b. if You include all or a substantial portion of the database contents in +a database in which You have Sui Generis Database Rights, then the database +in which You have Sui Generis Database Rights (but not its individual contents) +is Adapted Material; and + +c. You must comply with the conditions in Section 3(a) if You Share all or +a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace +Your obligations under this Public License where the Licensed Rights include +other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + +a. Unless otherwise separately undertaken by the Licensor, to the extent possible, +the Licensor offers the Licensed Material as-is and as-available, and makes +no representations or warranties of any kind concerning the Licensed Material, +whether express, implied, statutory, or other. This includes, without limitation, +warranties of title, merchantability, fitness for a particular purpose, non-infringement, +absence of latent or other defects, accuracy, or the presence or absence of +errors, whether or not known or discoverable. Where disclaimers of warranties +are not allowed in full or in part, this disclaimer may not apply to You. + +b. To the extent possible, in no event will the Licensor be liable to You +on any legal theory (including, without limitation, negligence) or otherwise +for any direct, special, indirect, incidental, consequential, punitive, exemplary, +or other losses, costs, expenses, or damages arising out of this Public License +or use of the Licensed Material, even if the Licensor has been advised of +the possibility of such losses, costs, expenses, or damages. Where a limitation +of liability is not allowed in full or in part, this limitation may not apply +to You. + +c. The disclaimer of warranties and limitation of liability provided above +shall be interpreted in a manner that, to the extent possible, most closely +approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + +a. This Public License applies for the term of the Copyright and Similar Rights +licensed here. However, if You fail to comply with this Public License, then +Your rights under this Public License terminate automatically. + +b. Where Your right to use the Licensed Material has terminated under Section +6(a), it reinstates: + +1. automatically as of the date the violation is cured, provided it is cured +within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + +c. For the avoidance of doubt, this Section 6(b) does not affect any right +the Licensor may have to seek remedies for Your violations of this Public +License. + +d. For the avoidance of doubt, the Licensor may also offer the Licensed Material +under separate terms or conditions or stop distributing the Licensed Material +at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + +a. The Licensor shall not be bound by any additional or different terms or +conditions communicated by You unless expressly agreed. + +b. Any arrangements, understandings, or agreements regarding the Licensed +Material not stated herein are separate from and independent of the terms +and conditions of this Public License. + +Section 8 – Interpretation. + +a. For the avoidance of doubt, this Public License does not, and shall not +be interpreted to, reduce, limit, restrict, or impose conditions on any use +of the Licensed Material that could lawfully be made without permission under +this Public License. + +b. To the extent possible, if any provision of this Public License is deemed +unenforceable, it shall be automatically reformed to the minimum extent necessary +to make it enforceable. If the provision cannot be reformed, it shall be severed +from this Public License without affecting the enforceability of the remaining +terms and conditions. + +c. No term or condition of this Public License will be waived and no failure +to comply consented to unless expressly agreed to by the Licensor. + +d. Nothing in this Public License constitutes or may be interpreted as a limitation +upon, or waiver of, any privileges and immunities that apply to the Licensor +or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative +Commons may elect to apply one of its public licenses to material it publishes +and in those instances will be considered the "Licensor." The text of the +Creative Commons public licenses is dedicated to the public domain under the +CC0 Public Domain Dedication. Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as otherwise +permitted by the Creative Commons policies published at creativecommons.org/policies, +Creative Commons does not authorize the use of the trademark "Creative Commons" +or any other trademark or logo of Creative Commons without its prior written +consent including, without limitation, in connection with any unauthorized +modifications to any of its public licenses or any other arrangements, understandings, +or agreements concerning use of licensed material. For the avoidance of doubt, +this paragraph does not form part of the public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/README.md b/README.md index 28ebdc2..b275135 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,31 @@ -# microg-gms +# microG Services -MicroG Framework \ No newline at end of file +[![Build status](https://github.com/microg/GmsCore/actions/workflows/build.yml/badge.svg)](https://github.com/microg/GmsCore/actions/workflows/build.yml) + +Translation status + + +microG Services is a FLOSS (Free/Libre Open Source Software) framework to allow applications designed for Google Play Services to run on systems, where Play Services is not available. + +### Please refer to the [wiki](https://github.com/microg/GmsCore/wiki) for downloads and instructions + +## Translations + +If you'd like to help translate microG, take a look at [TRANSLATION](TRANSLATION.md). + + +License +------- + Copyright 2013-2025 microG Project Team + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/TRANSLATION.md b/TRANSLATION.md new file mode 100644 index 0000000..5238721 --- /dev/null +++ b/TRANSLATION.md @@ -0,0 +1,11 @@ +# Translating microG +microG [can be translated using Weblate](https://hosted.weblate.org/projects/microg/#languages). Thanks Weblate for free libre hosting! + +Preferably do not use pull requests to submit translations, as merge conflicts can happen easily. If you already made one or did it manually, you can try [importing](https://docs.weblate.org/en/latest/user/files.html#uploading-translations) the files manually into Weblate. + +> [!TIP] +> At the moment, the [microG-UI-tools](play-services-core/microg-ui-tools) component is not available for translation using Weblate. You may want to open a pull request for this. This component stores strings for the "Self-Check" menu and a few other things. + +If your language does not seem to be available for translation, you may have to add it first. If you're not logged in, you'll need to create an account and configure your known languages, once that's set up, you should be able to get working. + +Thanks for your help maintaining accessibility for other users worldwide! We appreciate it. diff --git a/artwork/ic_gamepad.svg b/artwork/ic_gamepad.svg new file mode 100644 index 0000000..9743c3c --- /dev/null +++ b/artwork/ic_gamepad.svg @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/artwork/ic_microg_settings.svg b/artwork/ic_microg_settings.svg new file mode 100644 index 0000000..bbb6cf9 --- /dev/null +++ b/artwork/ic_microg_settings.svg @@ -0,0 +1,275 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/artwork/ic_recaptcha.svg b/artwork/ic_recaptcha.svg new file mode 100644 index 0000000..6c80728 --- /dev/null +++ b/artwork/ic_recaptcha.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/artwork/styles/README.md b/artwork/styles/README.md new file mode 100644 index 0000000..9dcbe1e --- /dev/null +++ b/artwork/styles/README.md @@ -0,0 +1,73 @@ +## The files + +* `style-microg-normal-openmaptiles.json` is a pure OpenMapTiles schema version of microG's custom style. The sources are set to Stadia but could be modified to be used with another schema-compliant vendor, e.g. MapTiler. +* `style-microg-normal-stadia.json` is a variant with Stadia custom layers. +* `style-microg-normal-mapbox.json` is a historic, unmaintained variant for use with Mapbox. +* `style-microg-satellite-*.json` is the same, but with a satellite layer (the stadia variant is almost pure openmaptiles, but openmaptiles does not specify a satellite layer). +* `style-stadia-outdoors.json` is identical to Stadia's Outdoors style, but with added microG metadata. + +* `sprite_sources` files can be generated to a single sprite file as found in the app's assets using `spreet` (see below). +* PBF files for fonts can be generated using `build_pbf_glyphs` from the `fonts` folder. + +## Resources + +### For creating styles + +* Tool: https://maputnik.github.io/ +* Style spec: https://maplibre.org/maplibre-style-spec/ + * https://maplibre.org/maplibre-style-spec/expressions/ +* Style schema: **https://openmaptiles.org/schema/** +* Schema tileset explorer (requires maptiler login): https://cloud.maptiler.com/tiles/v3-openmaptiles/ + +#### Vendor-specific +* Mapbox + * https://docs.mapbox.com/data/tilesets/reference/mapbox-streets-v8/ +* Stadia + * https://docs.stadiamaps.com/custom-styles/ + * https://docs.stadiamaps.com/tilesets/ + +### For converting assets + +* https://github.com/flother/spreet +* https://github.com/stadiamaps/sdf_font_tools/tree/main/build_pbf_glyphs + + +Commands: + +``` +$ cp style-microg-{satellite,normal}-{mapbox,stadia}.json style-stadia-outdoors.json style-mapbox-outdoors-v12.json ../../play-services-maps-core-mapbox/src/main/assets/ +$ spreet sprite_sources/ ../../play-services-maps-core-mapbox/src/main/assets/sprites +$ spreet --retina sprite_sources/ ../../play-services-maps-core-mapbox/src/main/assets/sprites@2x +$ build_pbf_glyphs --overwrite -c fonts/combinations.json fonts/ ../../play-services-maps-core-mapbox/src/main/assets +$ rm -r ../../play-services-maps-core-mapbox/src/main/assets/OpenSans\ Regular # remove temporary files +``` + +* We combine Open Sans Regular with Roboto Regular so that no glyphs are missing. +* A symbolic link in the assets folder points from the font stack specification "Open Sans Regular,Arial Unicode MS Regular" to "Roboto Regular". It is unclear why MapLibre sometimes tries to access this font and fails rendering entire tiles if it is not present. + +The assets are referenced using `asset://` in the style. For using Maputnik, it may be convenient to set the glyphs and sprites source to these Mapbox-hosted sources: + +``` + "sprite": "mapbox://sprites/microg/cjui4020201oo1fmca7yuwbor/8fkcj5fgn4mftlzuak3guz1f9", + "glyphs": "mapbox://fonts/microg/{fontstack}/{range}.pbf", +``` + +## Legal + +* normal and satellite microG styles based on Mapbox Basic, part of the Mapbox Open Styles, licensed under + * Style code: BSD license + * Style virtual features / design: CC BY 3.0 + * Reference: https://github.com/mapbox/mapbox-gl-styles/blob/master/LICENSE.md +* derivation created by larma +* derivation created by /e/ foundation +* makes use of snippets from [Stadia's variant of OSM Bright](https://docs.stadiamaps.com/map-styles/osm-bright/), also a derivation of Mapbox Open Styles + * Style code: BSD 3-Clause License + * Style design: CC-BY 4.0 + * Reference: https://stadiamaps.com/attribution/ +* fonts: Roboto family, licensed Apache 2.0, https://fonts.google.com/specimen/Roboto/about + +* outdoor style based on https://docs.stadiamaps.com/map-styles/outdoors/#__tabbed_1_2 + * Style code: BSD 3-Clause License + * Style design: CC-BY 4.0 + * Reference: https://stadiamaps.com + diff --git a/artwork/styles/fonts/OpenSans Regular.ttf b/artwork/styles/fonts/OpenSans Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..29e9e605d38445507c405b444419ed76c7e63bfd GIT binary patch literal 130836 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%0DT7>-*+<%js3u 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

n4|U;7DM$wDnY1Ax#u}jKp!>O?~@hdwQoA z#`}aj+WYH$x(B=WtE>z@E(KiV?i8PBYmA7=4pgg`^L$WN*yc-bjIw;jMe+5N>d3-Z z*20qa0*YY-OwBF^&fDAF-4lQ!I(<+OP#Yq(w$u%(u*RH?1i^71%W8;?01RVCmZpLUQ|e0o_gWCyg4l zFQzhM;vBDNp?70Z%i;2!@72)q#qWM9KiX2*C#x~+qccWbqm#tyRMcW-VYrB zaaH96h7}l1xeeIza&?AZC!ASCftA-8R$zbm8mNwxBclRneXTX7XnCh|cO)>gzBeK#Z7$H@f^=Z*%5N#aWgR3DFiL2m}z;3OL)A5#XB6&+AFRivQdj; z*qveQF;{}T5j%U2ND0HYTebxFcD-WbbJ8vEm`9JAF=ND7^RUdM?im@~lQMB{)L$q^ zVDG~l1U}KZ84aEy?YJ7ysb+$O3Vw%*MG?9a;@sffpcU6nbS<0`9I5%ii5JTcKR9&M z(ps{Kg#WG8Ql6aRdRlLsu^=ky(X8=*Idb&FG56Y!emsGtVBefH=@xN4Ok0VX$2bSJ8+a@4?&7G0En+(gr`i6_b2Al=7Ik$)k&3qL}`rYIXa7bm^D5Nf9~``PNjVIIgc zWl3bV_GoOHP<}cJ!)*yTtUKCJ-Z~|kV;$ppBM8CNMSGpsqW<}p+rw6sw zE;_%tH8a~?xbNC~*@Rx&_9NT7_X{mMxr)1O$!w^7fT#%+K*CRe) z%+x4(d*`cGbV!73nNkX$4tbSJf<&a@s;cDuiAr6XhtP%Xy&Uq#4$*Rj6|IpyWxYo3JM3+%u)=*x+z2$4H z9RoV|Y{EXrurxpDE$e;K**^E^l>Zz5_+KhtSg+lH58~+O;^Ju+<|xp7j9_a?u+8Yp z4bgH?=sj_`K(IL@@@@SEpc!!}?lVR52#x)-ta(;n%}H&}ut~96eT?55_C_6dN|`fe zPKv5*VQ>DlION!Z=D3lSeLSVl>^720vVb(*x+HCs&PZQPOxae(h39QrmvK_sCLNPL zn0|;fkv9o1-Lw26b-7t~>%F&!w0{P!355iMF2S;Y3|)MEO-4_RmuQFV8qu2mW1Dss z&0nW+dfo(&0-dyz6Dyl?My8wm3$3YD>NSJ*&fFPRp6~hVmdyF1GL;AI%V%^~>P*3g z9UfkMi`c8Chq_>1p;qW~OIjuEKGOTxnG#7g<~MBh*u5{IMe@hvO?mmjBzg2-Mzu*N zrI+hxl5V8xGGqYF!f6MMVNEE4fMlZ83d9FM#Nvg=kI$N2tOcCZPizIW98MKToEA_b zJ4$q(lyZ^*(j}5}j2x5(zy8+G;~q%geDlHeljWxxE()bh@4nk4{fpHEp-yMS^jLbX z(ed|)p%~vAd4P^aQ6#Rw1921tX9J;1NGy$V$;n96M54nY^^u)tRI^3LBKiguLF5=2 zA{`)EAHQF99ohK5{6gNB?vS{;og2l_zcxxQ?c7S!J1;fbJH(WFV&7bTGs!h%Sn>{zNHw^<)(Gt9UVgAx~@0H zXD_-id-Jk4*2~4;;45@97Ed5sE)>xb7gq;l%4xMeqNqZ8lu8>Qd-O9P7MW2`{X%f- zKb;|Z=86(EcmrF| zdI~S`{9(7O-o1VAeCm^yoCZ*+KjEbjfF9L$gs0XS>K> z5uNGgX)xFezy@%zx7RxZ0T2_=YV`krE&LiOeZcq9K4XL4Z_`%Tx~D#P$YSKhG%YJ$l9G<@_JxyDE|^q zfPTKPmk|3yC5E>*kSC4)zNnLQa4^cGlcfNgAQc4wfpT*;@$k@sXo1k1c#|`9Z;~Je z5HU;|RKIJmso{8oZ_dmKN5@ak@?Ckh!85&bFoSD&dZC=&d*25W+zjvLqsr& z{rT*W0YqmfERar4t?li(>7ssiWZb9*=?dmXIgeJYn&2hP$n+zDfx#w|FHRGGe>z7m zFCUQ5M-3vnx_a9pCTpG`^i&K{84`|FKAwr(s+ap4z&up|NQ}!T`2MM{Fk&a;%_S(*4=wa%MzCe zPwC2m16;Cn8Y^&~1k)90))p*eE09-gvOGcqosvAd0`cV@l8z;`j=?e@cuf?UQjw6P zd<)r`>6t!3{{B%0M*v=XM5U)|yG21Xm6X*D=+`e#%L+rGGtwM8py;E_i)N3}YA^aE zSOc6VvNss|bw>yf(#dA2QH9RtFYa(($qFBf0n(GuYE36WwO}~qNSqkpA8XKsIK@nf zI(y~%jE}1!e!c1P(6;*8 zYXeFPPEQFeDe{{aJ1@S=z|qRLG-8dY9Mse8`s&RmQ2T#k?AeLn&{{Ku8LwYZn8Pl`K=us6DwP0=j^ks>8hgPG@QLi-<*3WHfT{@?DQ~%V= zxw$^Qa((8;PEHOTI7Tc~i<3o!Cp}hA968%lZOEF?fAHE;f%Az8jE+)@M(5Qou1aOj zgw))c9Dxrh>y=d++R(qcq&Ud5+$%^OT-3+YBWP4|Ol1nSb*Dfkeb1spGnnmbMN~qx zXcG?NC-}^?E|kUo{oLF{FPNcDHZ#;(NAf!>Q~-h?-SNH%ctNBFgmB^uzXxWvjM)3` zWL0~(y5_xuyWcU}@oyWx`Mv3RQ96O7iGLkF{L3=o!h(P7{TV(=+OZq`%Av#1+8tJR z;^pEZxWnXhu$i2;S#`EJT{}%l1<2Y?c4qVE3na~?HGPzpNy@%W6L#&^a~m~1KQ@yX&b;-o@|@4tv|Sq>MFgMCkI|)g&S(5mB>d{GUx`U?o@fAD7olmfv^Kk z8JsH49WEW=%jnDmKk4js%MYi?K=&XYd$kdV-Lc4G^Dt9}yL+^lm|8pP(N{pJ$muzC zWNb+Pit0GdZ`0{wy>hkMP99z8A(X+FgVCL7@sf`Ae`5e*a3ay*!jnBNPXd^S%(THy z{=qHOpbIwmMFu-dmb=o}<3#JzRjJYhxNR|I4-v|g;!;r=T#(xS7nD8*mM-+~wkDUn zIeu0YxQ0D9weYxU)anxKg*RAccTkL+j{PKOy9c$+khmgWH3A>BKN}c@slo|^t0;#_ z&YGR5HaFnR&cM0on$e{zAD9y75TP^&D$Ty&HCG$2b?cTvBXoGMKd@VetHWAu9&80p zgdG?6J6wq*v9M^z-?#4k=eEA}#O1A9#Bueb&#P~2*><(6>T2`W7l#Vw6TcaQyfkXN zMBgt?NTDHP){Tzo?d6_s>QR;Bp7tj^`jyQqa*62HZIFIGX{k#bQym_=uZ&yt$Zd3U zv7KtUsE(@av7OqrlC%1-Fc=w>C7_2&F<5BDck1z34P5&!&<~PnoH8KD7kz~kXe$&G z*{z#{J?n%4Gsf}txNfggZ>S@ZN@-;kv`vb>3`h_v(_LMi7=|^v`pIul@x;l2OgYEJ zmCsGgvs?4QhCa&)dEPEBAudmMMyfAZ|4zNG_w$CF_^4dNl4l0qyyn;|Dn7??>FKJ< z(=%d{U21O-#g%RTJ?Zi`=A8!$^3C}=&P~>9g;6Oh=7lWJ192wIsCPu4b8`kxt&^$QoSv`dMNPP1Q8%Z2RvcD-9nM0mVw(>Hs*A^w4JUAiQ=ZusYpX-6l!bO|(d z^?mo56Ce6^4G0YJ`w(2Z5cb_+b*91=}7>&7nFmJZk>712yuC69`x0E>E zJU+iyubjNRoSZP`UP4|RJ&&QQ(@e7{oYweFMs>-OQ>BomNbxmUet^*#j+TUYxfDz` zPLYI07gt_MhL1~+BIebjT|Jqr6%KAWy}(*ghxLc0K%;1IwjcLTt4KwQAi$2+k&$vY@IXm(&^V0xPLe4bOhw~I4W z#o*wcsR;wK9=v;gu}|P3zsKrh98hesS!u`n;8kyOc#GM^DXNd1L&vx7W=$l#sMv8QL=?aZsjnu1g~5 z>fqrO68uq6WYAnwq$xGSC$Tuu>$h+Fu77*Q1)^9H;8o}9`SH6Wc27x-?@oG47eiy* z#$8$Z?#G^Pi@gF?JXTylOU2U6Y}P-K`NLGskjn@%5f$G+Mnig|FCeQzk!5!%werLk zT!VaSdX3^b_A(ICWq3eVS6_=-!Y|N3+tF2H1{^8VOOakFpFO{4SPE6ofJlS* zKGWVQ%gsA7y7uMO`BT5W7*!s8Wb4<5C&dkWj%dZ#BD!n{j40jpY2&lfFB`Nv%N+7y z@8uW&zVr}req}NyL@_k^7H9wrGs(edX9k#f$I;h$bS5TT*&@n7`83ITN%5Ze=!BJN zGk5kY-epcN329k!YgJyu_rO2(Xms%(a(Ugxi-X)8Ez`+|ISucvN8ukGv*xiRK=p#< zYkx+x*RmKKJ&S;2s|seXQ0L$zk-qpX(=HPKEa}U)iEoDV`E%yyq|Y-*z+2L1nZ!>N zGo{NdH7!ze8@^o2AUQ2HZDdl*ls2T(D!NHGR9D0%py+sk^OF?0h}sT^p5~rupKllt z!KW(yCXEj9L$se|t6+RtIKcNu^>y<9{hRZDx$?jLO{^A2j~+fzRiG+}PtQ?3N_y&7 z@~b#{)QE}7zN*6b^lWweE4IHD#^K@#w%^!Ch3-%NI$InyX4oX$mtLxFe^wkddc*{k z^+x>JL1QMAC!74z+Jgs;8DBwvlI{&0GodWmleM(IVWMdCZi7@=OnV8qIk71^lS1f`?29$5*3GO$-ca9}4&)2K=)qH@Fy zb`(R(fI?*imxmJiClfT@U|=Lu=@AOVI5$-&{Q+;l6bnrt^b%SJrJSAJ_dwcUE}~}o zqmKsj;Wg6}v-%vA3d*nM>kG~m32Hm%9MfReE?Q1BcqPWUWJFF1Z;y=|Q#^V6%5y#VHYWSkrMnrnJ zaBkNjQ7vfN?>xT;t|`E>U3_tiWn0+yy$(Kbt52UEM(nKyviUKoT6Yd7d4!Ea%7d5NiXT*OYgT&27=W+Y0A!>WWhV1Tz;++IA2#c zNq--Iao($+3nMmNZEv^yRd$kd7*zqJA{Y3|>G*nQM@J$E4lb^u=;lCOIuIyuBG^jX zY%cOY_mK}Jq0&brbJMlz!8djQwPptzwY*7U7H?mtbouup%ipa)0lOFd`_bQQUUKGT z5~hO!jR&8ya-zm>|2EC#LK9Nw*4L|B**8tU%l z1sz28lw(2I|Cl8Hr+6XM`@&r2HdGcGiUFcNHiJBGo|=T#D0#=cxn~9}tM;=ORjm!~ zD*qwNDqsI)NZGWJb*7SD=Eh7eea&poXxBO87RJVGaf$2~8E*EMdMIP}$Ck!Of0w>G z`eU!1{f_Az_`eN2u{5CZ>L`tRcfUi4$LGBJ4$iGeth*Le*U<5hCKNlU7vLoK^^1GGtMTP*pKFBX%p=pAoK3gJ`C5&3?Z4k#

U6$t8WhBdG7e%? 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 literal 0 HcmV?d00001 diff --git a/artwork/styles/fonts/Roboto Bold.ttf b/artwork/styles/fonts/Roboto Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..43da14d84ecb949ca5f5e8ecca3a514aa7fe1c7d GIT binary patch literal 167336 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 X76wnEi(n^v8!x?bp_;lO!DIggn3ZN8 literal 0 HcmV?d00001 diff --git a/artwork/styles/fonts/Roboto Regular.ttf b/artwork/styles/fonts/Roboto Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ddf4bfacb396e97546364ccfeeb9c31dfaea4c25 GIT binary patch literal 168260 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

S&jh1n&JeeMOkU4{=4@cYr6k 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≤FHXCuU9Qce=@vmZ{%9^5??OaVQJ8!4u8-w;yt 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 \ No newline at end of file diff --git a/artwork/styles/sprite_sources/city.svg b/artwork/styles/sprite_sources/city.svg new file mode 100644 index 0000000..5b2d7b9 --- /dev/null +++ b/artwork/styles/sprite_sources/city.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic.svg b/artwork/styles/sprite_sources/poi_generic.svg new file mode 100644 index 0000000..cc152d7 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic_blue.svg b/artwork/styles/sprite_sources/poi_generic_blue.svg new file mode 100644 index 0000000..af273c4 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic_blue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic_green.svg b/artwork/styles/sprite_sources/poi_generic_green.svg new file mode 100644 index 0000000..3513b38 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic_green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic_orange.svg b/artwork/styles/sprite_sources/poi_generic_orange.svg new file mode 100644 index 0000000..297cc03 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic_orange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic_purple.svg b/artwork/styles/sprite_sources/poi_generic_purple.svg new file mode 100644 index 0000000..7b2e944 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic_purple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic_red.svg b/artwork/styles/sprite_sources/poi_generic_red.svg new file mode 100644 index 0000000..cc2c315 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic_red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_generic_teal.svg b/artwork/styles/sprite_sources/poi_generic_teal.svg new file mode 100644 index 0000000..43a64e2 --- /dev/null +++ b/artwork/styles/sprite_sources/poi_generic_teal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_grocery.svg b/artwork/styles/sprite_sources/poi_grocery.svg new file mode 100644 index 0000000..5f30dea --- /dev/null +++ b/artwork/styles/sprite_sources/poi_grocery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_lodging.svg b/artwork/styles/sprite_sources/poi_lodging.svg new file mode 100644 index 0000000..fb6ff1e --- /dev/null +++ b/artwork/styles/sprite_sources/poi_lodging.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_museum.svg b/artwork/styles/sprite_sources/poi_museum.svg new file mode 100644 index 0000000..906343e --- /dev/null +++ b/artwork/styles/sprite_sources/poi_museum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_res.svg b/artwork/styles/sprite_sources/poi_res.svg new file mode 100644 index 0000000..877041a --- /dev/null +++ b/artwork/styles/sprite_sources/poi_res.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_restaurant.svg b/artwork/styles/sprite_sources/poi_restaurant.svg new file mode 100644 index 0000000..877041a --- /dev/null +++ b/artwork/styles/sprite_sources/poi_restaurant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/poi_theatre.svg b/artwork/styles/sprite_sources/poi_theatre.svg new file mode 100644 index 0000000..89df60b --- /dev/null +++ b/artwork/styles/sprite_sources/poi_theatre.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_de-motorway_2.svg b/artwork/styles/sprite_sources/shield_de-motorway_2.svg new file mode 100644 index 0000000..f746743 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_de-motorway_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_de-motorway_3.svg b/artwork/styles/sprite_sources/shield_de-motorway_3.svg new file mode 100644 index 0000000..9617161 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_de-motorway_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-blue_2.svg b/artwork/styles/sprite_sources/shield_rectangle-blue_2.svg new file mode 100644 index 0000000..035f372 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-blue_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-blue_3.svg b/artwork/styles/sprite_sources/shield_rectangle-blue_3.svg new file mode 100644 index 0000000..e7499b9 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-blue_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-blue_4.svg b/artwork/styles/sprite_sources/shield_rectangle-blue_4.svg new file mode 100644 index 0000000..1fe0ea2 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-blue_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-blue_5.svg b/artwork/styles/sprite_sources/shield_rectangle-blue_5.svg new file mode 100644 index 0000000..9d813a9 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-blue_5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-blue_6.svg b/artwork/styles/sprite_sources/shield_rectangle-blue_6.svg new file mode 100644 index 0000000..5ca3733 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-blue_6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-green_2.svg b/artwork/styles/sprite_sources/shield_rectangle-green_2.svg new file mode 100644 index 0000000..4fb48ad --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-green_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-green_3.svg b/artwork/styles/sprite_sources/shield_rectangle-green_3.svg new file mode 100644 index 0000000..172b314 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-green_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-green_4.svg b/artwork/styles/sprite_sources/shield_rectangle-green_4.svg new file mode 100644 index 0000000..bedbdf1 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-green_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-red_2.svg b/artwork/styles/sprite_sources/shield_rectangle-red_2.svg new file mode 100644 index 0000000..ece73c6 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-red_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-red_3.svg b/artwork/styles/sprite_sources/shield_rectangle-red_3.svg new file mode 100644 index 0000000..9c93afd --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-red_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-white_2.svg b/artwork/styles/sprite_sources/shield_rectangle-white_2.svg new file mode 100644 index 0000000..c4cdc1f --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-white_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-white_3.svg b/artwork/styles/sprite_sources/shield_rectangle-white_3.svg new file mode 100644 index 0000000..69aa539 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-white_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-white_4.svg b/artwork/styles/sprite_sources/shield_rectangle-white_4.svg new file mode 100644 index 0000000..2c85468 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-white_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-white_5.svg b/artwork/styles/sprite_sources/shield_rectangle-white_5.svg new file mode 100644 index 0000000..c9e1658 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-white_5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-white_6.svg b/artwork/styles/sprite_sources/shield_rectangle-white_6.svg new file mode 100644 index 0000000..b61184c --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-white_6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-yellow_2.svg b/artwork/styles/sprite_sources/shield_rectangle-yellow_2.svg new file mode 100644 index 0000000..4a6d5bd --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-yellow_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_rectangle-yellow_3.svg b/artwork/styles/sprite_sources/shield_rectangle-yellow_3.svg new file mode 100644 index 0000000..9beb86f --- /dev/null +++ b/artwork/styles/sprite_sources/shield_rectangle-yellow_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_us-interstate_2.svg b/artwork/styles/sprite_sources/shield_us-interstate_2.svg new file mode 100644 index 0000000..31aed1f --- /dev/null +++ b/artwork/styles/sprite_sources/shield_us-interstate_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_us-interstate_3.svg b/artwork/styles/sprite_sources/shield_us-interstate_3.svg new file mode 100644 index 0000000..54de117 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_us-interstate_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/sprite_sources/shield_us-interstate_4.svg b/artwork/styles/sprite_sources/shield_us-interstate_4.svg new file mode 100644 index 0000000..22bdfd9 --- /dev/null +++ b/artwork/styles/sprite_sources/shield_us-interstate_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/artwork/styles/style-mapbox-outdoors-v12.json b/artwork/styles/style-mapbox-outdoors-v12.json new file mode 100644 index 0000000..21c4d40 --- /dev/null +++ b/artwork/styles/style-mapbox-outdoors-v12.json @@ -0,0 +1,13845 @@ +{ + "name": "Mapbox Outdoors", + "sprite": "mapbox://sprites/mapbox/outdoors-v12", + "glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf", + "center": [ + 9.1, + 42.2 + ], + "zoom": 7.5, + "fog": { + "range": [ + 1, + 20 + ], + "color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 4, + "hsl(200, 100%, 100%)", + 6, + "hsl(200, 50%, 90%)" + ], + "high-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 4, + "hsl(200, 100%, 60%)", + 6, + "hsl(310, 60%, 80%)" + ], + "space-color": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 4, + "hsl(205, 10%, 10%)", + 6, + "hsl(205, 60%, 50%)" + ], + "horizon-blend": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 4, + 0.01, + 6, + 0.1 + ], + "star-intensity": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 4, + 0.1, + 6, + 0 + ] + }, + "projection": { + "name": "globe" + }, + "visibility": "public", + "version": 8, + "layers": [ + { + "id": "land", + "type": "background", + "layout": {}, + "minzoom": 0, + "paint": { + "background-color": "hsl(60, 20%, 85%)" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, land", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "landcover", + "type": "fill", + "source": "composite", + "source-layer": "landcover", + "minzoom": 0, + "maxzoom": 12, + "layout": {}, + "paint": { + "fill-color": [ + "match", + [ + "get", + "class" + ], + "wood", + "hsla(103, 50%, 60%, 0.8)", + "scrub", + "hsla(98, 47%, 68%, 0.6)", + "crop", + "hsla(68, 55%, 70%, 0.6)", + "grass", + "hsla(98, 50%, 74%, 0.6)", + "snow", + "hsl(205, 45%, 95%)", + "hsl(98, 48%, 67%)" + ], + "fill-opacity": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 8, + 0.8, + 12, + 0 + ], + "fill-antialias": false + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, land", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "national-park", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 5, + "filter": [ + "==", + [ + "get", + "class" + ], + "national_park" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(98, 38%, 68%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 5, + 0, + 6, + 0.6, + 12, + 0.2 + ] + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, land", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "national-park_tint-band", + "type": "line", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 9, + "filter": [ + "==", + [ + "get", + "class" + ], + "national_park" + ], + "layout": {}, + "paint": { + "line-color": "hsl(98, 38%, 68%)", + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 9, + 1, + 14, + 8 + ], + "line-blur": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 9, + 1, + 14, + 8 + ] + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, land", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "landuse", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 5, + "filter": [ + "all", + [ + ">=", + [ + "to-number", + [ + "get", + "sizerank" + ] + ], + 0 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "agriculture", + "wood", + "grass", + "scrub", + "glacier", + "pitch", + "sand" + ], + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + "residential", + [ + "step", + [ + "zoom" + ], + true, + 10, + false + ], + [ + "park", + "airport" + ], + [ + "step", + [ + "zoom" + ], + false, + 8, + [ + "case", + [ + "==", + [ + "get", + "sizerank" + ], + 1 + ], + true, + false + ], + 10, + true + ], + [ + "facility", + "industrial" + ], + [ + "step", + [ + "zoom" + ], + false, + 12, + true + ], + "rock", + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + "cemetery", + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + "school", + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + "hospital", + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + "commercial_area", + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + false + ], + [ + "<=", + [ + "-", + [ + "to-number", + [ + "get", + "sizerank" + ] + ], + [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0, + 18, + 14 + ] + ], + 14 + ] + ], + "layout": {}, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + [ + "match", + [ + "get", + "class" + ], + "wood", + "hsla(103, 50%, 60%, 0.8)", + "scrub", + "hsla(98, 47%, 68%, 0.6)", + "agriculture", + "hsla(98, 50%, 74%, 0.6)", + "park", + [ + "match", + [ + "get", + "type" + ], + [ + "garden", + "playground", + "zoo" + ], + "hsl(98, 38%, 68%)", + "hsl(98, 55%, 70%)" + ], + "grass", + "hsla(98, 50%, 74%, 0.6)", + "airport", + "hsl(230, 40%, 82%)", + "cemetery", + "hsl(98, 45%, 75%)", + "glacier", + "hsl(205, 45%, 95%)", + "hospital", + "hsl(20, 45%, 82%)", + "pitch", + "hsl(88, 65%, 75%)", + "sand", + "hsl(69, 60%, 72%)", + "rock", + "hsl(60, 0%, 85%)", + "school", + "hsl(40, 45%, 78%)", + "commercial_area", + "hsl(55, 45%, 85%)", + "residential", + "hsl(60, 7%, 87%)", + [ + "facility", + "industrial" + ], + "hsl(230, 20%, 85%)", + "hsl(60, 22%, 72%)" + ], + 16, + [ + "match", + [ + "get", + "class" + ], + "wood", + "hsla(103, 50%, 60%, 0.8)", + "scrub", + "hsla(98, 47%, 68%, 0.6)", + "agriculture", + "hsla(98, 50%, 74%, 0.6)", + "park", + [ + "match", + [ + "get", + "type" + ], + [ + "garden", + "playground", + "zoo" + ], + "hsl(98, 38%, 68%)", + "hsl(98, 55%, 70%)" + ], + "grass", + "hsla(98, 50%, 74%, 0.6)", + "airport", + "hsl(230, 40%, 82%)", + "cemetery", + "hsl(98, 45%, 75%)", + "glacier", + "hsl(205, 45%, 95%)", + "hospital", + "hsl(20, 45%, 82%)", + "pitch", + "hsl(88, 65%, 75%)", + "sand", + "hsl(69, 60%, 72%)", + "rock", + "hsla(60, 0%, 85%, 0.5)", + "school", + "hsl(40, 45%, 78%)", + "commercial_area", + "hsla(55, 45%, 85%, 0.5)", + [ + "facility", + "industrial" + ], + "hsl(230, 20%, 85%)", + "hsl(60, 22%, 72%)" + ] + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + [ + "match", + [ + "get", + "class" + ], + "residential", + 0.8, + 0.2 + ], + 10, + [ + "match", + [ + "get", + "class" + ], + "residential", + 0, + 1 + ] + ], + "fill-antialias": false + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, land", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "pitch-outline", + "type": "line", + "source": "composite", + "source-layer": "landuse", + "minzoom": 15, + "filter": [ + "==", + [ + "get", + "class" + ], + "pitch" + ], + "layout": {}, + "paint": { + "line-color": "hsl(88, 60%, 65%)" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, land", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "waterway-shadow", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 10, + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 11, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 11, + "round" + ] + }, + "paint": { + "line-color": "hsl(224, 79%, 69%)", + "line-width": [ + "interpolate", + [ + "exponential", + 1.3 + ], + [ + "zoom" + ], + 9, + [ + "match", + [ + "get", + "class" + ], + [ + "canal", + "river" + ], + 0.1, + 0 + ], + 20, + [ + "match", + [ + "get", + "class" + ], + [ + "canal", + "river" + ], + 8, + 3 + ] + ], + "line-translate": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 7, + [ + "literal", + [ + 0, + 0 + ] + ], + 16, + [ + "literal", + [ + -1, + -1 + ] + ] + ], + "line-translate-anchor": "viewport", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 0, + 8.5, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "water-shadow", + "type": "fill", + "source": "composite", + "source-layer": "water", + "minzoom": 10, + "layout": {}, + "paint": { + "fill-color": "hsl(224, 79%, 69%)", + "fill-translate": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 7, + [ + "literal", + [ + 0, + 0 + ] + ], + 16, + [ + "literal", + [ + -1, + -1 + ] + ] + ], + "fill-translate-anchor": "viewport" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "waterway", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 11, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 11, + "round" + ] + }, + "paint": { + "line-color": "hsl(205, 75%, 70%)", + "line-width": [ + "interpolate", + [ + "exponential", + 1.3 + ], + [ + "zoom" + ], + 9, + [ + "match", + [ + "get", + "class" + ], + [ + "canal", + "river" + ], + 0.1, + 0 + ], + 20, + [ + "match", + [ + "get", + "class" + ], + [ + "canal", + "river" + ], + 8, + 3 + ] + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 0, + 8.5, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "water", + "type": "fill", + "source": "composite", + "source-layer": "water", + "minzoom": 0, + "layout": {}, + "paint": { + "fill-color": "hsl(205, 75%, 70%)" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "water-depth", + "type": "fill", + "source": "composite", + "source-layer": "depth", + "minzoom": 0, + "maxzoom": 8, + "layout": {}, + "paint": { + "fill-antialias": false, + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 6, + [ + "interpolate", + [ + "linear" + ], + [ + "get", + "min_depth" + ], + 0, + "hsla(205, 75%, 70%, 0.35)", + 200, + "hsla(205, 75%, 63%, 0.35)", + 7000, + "hsla(205, 75%, 56%, 0.35)" + ], + 8, + [ + "interpolate", + [ + "linear" + ], + [ + "get", + "min_depth" + ], + 0, + "hsla(205, 75%, 70%, 0)", + 200, + "hsla(205, 75%, 63%, 0)", + 7000, + "hsla(205, 75%, 53%, 0)" + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "wetland", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 5, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "wetland", + "wetland_noveg" + ], + true, + false + ], + "paint": { + "fill-color": "hsl(194, 38%, 74%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 0.25, + 10.5, + 0.15 + ] + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "wetland-pattern", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 5, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "wetland", + "wetland_noveg" + ], + true, + false + ], + "paint": { + "fill-color": "hsl(194, 38%, 74%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 0, + 10.5, + 1 + ], + "fill-pattern": "wetland", + "fill-translate-anchor": "viewport" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, water", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "hillshade", + "type": "fill", + "source": "composite", + "source-layer": "hillshade", + "filter": [ + "all", + [ + "step", + [ + "zoom" + ], + [ + "==", + [ + "get", + "class" + ], + "shadow" + ], + 11, + true + ], + [ + "match", + [ + "get", + "level" + ], + 89, + true, + 78, + [ + "step", + [ + "zoom" + ], + false, + 5, + true + ], + 67, + [ + "step", + [ + "zoom" + ], + false, + 9, + true + ], + 56, + [ + "step", + [ + "zoom" + ], + false, + 6, + true + ], + 94, + [ + "step", + [ + "zoom" + ], + false, + 11, + true + ], + 90, + [ + "step", + [ + "zoom" + ], + false, + 12, + true + ], + false + ] + ], + "minzoom": 0, + "maxzoom": 16, + "layout": {}, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "match", + [ + "get", + "class" + ], + "shadow", + "hsla(66, 38%, 17%, 0.08)", + "hsla(60, 20%, 95%, 0.14)" + ], + 16, + [ + "match", + [ + "get", + "class" + ], + "shadow", + "hsla(66, 38%, 17%, 0)", + "hsla(60, 20%, 95%, 0)" + ] + ], + "fill-antialias": false + }, + "metadata": { + "mapbox:featureComponent": "terrain", + "mapbox:group": "Terrain, land", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "contour-line", + "type": "line", + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": [ + "!=", + [ + "get", + "index" + ], + -1 + ], + "layout": {}, + "paint": { + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + [ + "match", + [ + "get", + "index" + ], + [ + 1, + 2 + ], + 0.15, + 0.3 + ], + 13, + [ + "match", + [ + "get", + "index" + ], + [ + 1, + 2 + ], + 0.3, + 0.5 + ] + ], + "line-color": "hsl(60, 10%, 35%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + [ + "match", + [ + "get", + "index" + ], + [ + 1, + 2 + ], + 0.5, + 0.6 + ], + 16, + [ + "match", + [ + "get", + "index" + ], + [ + 1, + 2 + ], + 0.8, + 1.2 + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "terrain", + "mapbox:group": "Terrain, land", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "land-structure-polygon", + "type": "fill", + "source": "composite", + "source-layer": "structure", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "land" + ], + [ + "==", + [ + "geometry-type" + ], + "Polygon" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(60, 20%, 85%)" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, built", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "land-structure-line", + "type": "line", + "source": "composite", + "source-layer": "structure", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "land" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": "square" + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.99 + ], + [ + "zoom" + ], + 14, + 0.75, + 20, + 40 + ], + "line-color": "hsl(60, 20%, 85%)" + }, + "metadata": { + "mapbox:featureComponent": "land-and-water", + "mapbox:group": "Land & water, built", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "aeroway-polygon", + "type": "fill", + "source": "composite", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + [ + "match", + [ + "get", + "type" + ], + [ + "runway", + "taxiway", + "helipad" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "Polygon" + ] + ], + "paint": { + "fill-color": "hsl(230, 36%, 74%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 0, + 11, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, built", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "aeroway-line", + "type": "line", + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "==", + [ + "geometry-type" + ], + "LineString" + ], + "paint": { + "line-color": "hsl(230, 36%, 74%)", + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 9, + [ + "match", + [ + "get", + "type" + ], + "runway", + 1, + 0.5 + ], + 18, + [ + "match", + [ + "get", + "type" + ], + "runway", + 80, + 20 + ] + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 0, + 11, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, built", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "building", + "type": "fill", + "source": "composite", + "source-layer": "building", + "minzoom": 15, + "filter": [ + "all", + [ + "!=", + [ + "get", + "type" + ], + "building:part" + ], + [ + "==", + [ + "get", + "underground" + ], + "false" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(50, 15%, 75%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + 1 + ], + "fill-outline-color": "hsl(60, 10%, 65%)" + }, + "metadata": { + "mapbox:featureComponent": "buildings", + "mapbox:group": "Buildings, built", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "building-underground", + "type": "fill", + "source": "composite", + "source-layer": "building", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + [ + "get", + "underground" + ], + "true" + ], + [ + "==", + [ + "geometry-type" + ], + "Polygon" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(260, 60%, 85%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + 0.5 + ] + }, + "metadata": { + "mapbox:featureComponent": "buildings", + "mapbox:group": "Buildings, built", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-minor-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "track" + ], + true, + "service", + [ + "step", + [ + "zoom" + ], + false, + 14, + true + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 3%, 57%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 18, + 10, + 22, + 100 + ], + "line-dasharray": [ + 3, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-street-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 3%, 57%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 14, + 1 + ], + "line-dasharray": [ + 3, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-minor-link-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "secondary_link", + "tertiary_link" + ], + true, + false + ], + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.4, + 18, + 18, + 22, + 180 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 11, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-secondary-tertiary-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 3%, 57%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0, + 18, + 26, + 22, + 260 + ], + "line-dasharray": [ + 3, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-primary-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "primary" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 3%, 57%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 28, + 22, + 280 + ], + "line-dasharray": [ + 3, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-major-link-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ], + "line-dasharray": [ + 3, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-motorway-trunk-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ], + "line-dasharray": [ + 3, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels-case", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-path-trail", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "hiking", + "mountain_bike", + "trail" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(60, 32%, 90%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 5, + 0.5 + ] + ], + 15, + [ + "literal", + [ + 4, + 0.5 + ] + ], + 16, + [ + "literal", + [ + 4, + 0.45 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "tunnel-path-cycleway-piste", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "cycleway", + "piste" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(60, 32%, 90%)", + "line-dasharray": [ + 10, + 0 + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-path", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "!=", + [ + "get", + "type" + ], + "steps" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(60, 32%, 90%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.75, + 1 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.75 + ] + ], + 17, + [ + "literal", + [ + 1, + 0.5 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-steps", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "type" + ], + "steps" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 16, + 1.6, + 18, + 6 + ], + "line-color": "hsl(60, 32%, 90%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.75, + 1 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.75 + ] + ], + 17, + [ + "literal", + [ + 0.3, + 0.3 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-pedestrian", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "pedestrian" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 18, + 12 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.5, + 0.4 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.2 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-construction", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "construction" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 2, + 18, + 20, + 22, + 200 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0.4, + 0.8 + ] + ], + 15, + [ + "literal", + [ + 0.3, + 0.6 + ] + ], + 16, + [ + "literal", + [ + 0.2, + 0.3 + ] + ], + 17, + [ + "literal", + [ + 0.2, + 0.25 + ] + ], + 18, + [ + "literal", + [ + 0.15, + 0.15 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-minor", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "track" + ], + true, + "service", + [ + "step", + [ + "zoom" + ], + false, + 14, + true + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 18, + 10, + 22, + 100 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "street_limited", + "hsl(60, 22%, 80%)", + "hsl(0, 0%, 95%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-minor-link", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "secondary_link", + "tertiary_link" + ], + true, + false + ], + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 13, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 13, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.4, + 18, + 18, + 22, + 180 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-major-link", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway_link", + "hsl(15, 100%, 85%)", + "hsl(35, 78%, 85%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-street", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "street_limited", + "hsl(60, 22%, 80%)", + "hsl(0, 0%, 95%)" + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-street-low", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "maxzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-secondary-tertiary", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0, + 18, + 26, + 22, + 260 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-primary", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "primary" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 28, + 22, + 280 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-motorway-trunk", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway", + "hsl(15, 100%, 85%)", + "hsl(35, 78%, 85%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "tunnel-oneway-arrow-blue", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "oneway" + ], + "true" + ], + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ], + true, + false + ], + 16, + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "street", + "street_limited", + "primary_link", + "secondary_link", + "tertiary_link", + "service", + "track" + ], + true, + false + ] + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": [ + "step", + [ + "zoom" + ], + "oneway-small", + 18, + "oneway-large" + ], + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "tunnel-oneway-arrow-white", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + true, + false + ], + [ + "==", + [ + "get", + "oneway" + ], + "true" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": [ + "step", + [ + "zoom" + ], + "oneway-white-small", + 18, + "oneway-white-large" + ], + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, tunnels", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "cliff", + "type": "line", + "source": "composite", + "source-layer": "structure", + "minzoom": 15, + "filter": [ + "==", + [ + "get", + "class" + ], + "cliff" + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 15.25, + 1 + ], + "line-width": 10, + "line-pattern": "cliff" + }, + "metadata": { + "mapbox:featureComponent": "terrain", + "mapbox:group": "Terrain, surface", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "ferry", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 8, + "filter": [ + "==", + [ + "get", + "type" + ], + "ferry" + ], + "paint": { + "line-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(214, 68%, 63%)", + 17, + "hsl(239, 68%, 63%)" + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 20, + 1 + ], + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 13, + [ + "literal", + [ + 12, + 4 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, ferries", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "ferry-auto", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 8, + "filter": [ + "==", + [ + "get", + "type" + ], + "ferry_auto" + ], + "paint": { + "line-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(214, 68%, 63%)", + 17, + "hsl(239, 68%, 63%)" + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 20, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, ferries", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-pedestrian-polygon-fill", + "type": "fill", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "case", + [ + "has", + "layer" + ], + [ + ">=", + [ + "get", + "layer" + ], + 0 + ], + true + ], + [ + "==", + [ + "geometry-type" + ], + "Polygon" + ] + ], + "paint": { + "fill-color": "hsl(60, 20%, 85%)" + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-pedestrian-polygon-pattern", + "type": "fill", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "case", + [ + "has", + "layer" + ], + [ + ">=", + [ + "get", + "layer" + ], + 0 + ], + true + ], + [ + "==", + [ + "geometry-type" + ], + "Polygon" + ] + ], + "paint": { + "fill-pattern": "pedestrian-polygon", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 0, + 17, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-path-bg", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "step", + [ + "zoom" + ], + [ + "!", + [ + "match", + [ + "get", + "type" + ], + [ + "steps", + "sidewalk", + "crossing" + ], + true, + false + ] + ], + 16, + [ + "!=", + [ + "get", + "type" + ], + "steps" + ] + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 2, + 18, + 7 + ], + "line-color": [ + "match", + [ + "get", + "type" + ], + "piste", + "hsl(215, 80%, 48%)", + [ + "mountain_bike", + "hiking", + "trail", + "cycleway", + "footway", + "path", + "bridleway" + ], + "hsl(35, 80%, 48%)", + "hsl(60, 1%, 64%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-steps-bg", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "type" + ], + "steps" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 2, + 17, + 4.6, + 18, + 7 + ], + "line-color": "hsl(35, 80%, 48%)", + "line-opacity": 0.75 + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-pedestrian-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "pedestrian" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "case", + [ + "has", + "layer" + ], + [ + ">=", + [ + "get", + "layer" + ], + 0 + ], + true + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 2, + 18, + 14.5 + ], + "line-color": "hsl(60, 10%, 70%)" + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-path-trail", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "hiking", + "mountain_bike", + "trail" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 5, + 0.5 + ] + ], + 15, + [ + "literal", + [ + 4, + 0.5 + ] + ], + 16, + [ + "literal", + [ + 4, + 0.45 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-path-cycleway-piste", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "cycleway", + "piste" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + 10, + 0 + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-path", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "step", + [ + "zoom" + ], + [ + "!", + [ + "match", + [ + "get", + "type" + ], + [ + "steps", + "sidewalk", + "crossing" + ], + true, + false + ] + ], + 16, + [ + "!=", + [ + "get", + "type" + ], + "steps" + ] + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 13, + 0.5, + 14, + 1, + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 4, + 0.3 + ] + ], + 15, + [ + "literal", + [ + 1.75, + 0.3 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.3 + ] + ], + 17, + [ + "literal", + [ + 1, + 0.25 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-steps", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "type" + ], + "steps" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 16, + 1.6, + 18, + 6 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.75, + 1 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.75 + ] + ], + 17, + [ + "literal", + [ + 0.3, + 0.3 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-pedestrian", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "pedestrian" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "case", + [ + "has", + "layer" + ], + [ + ">=", + [ + "get", + "layer" + ], + 0 + ], + true + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 18, + 12 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.5, + 0.4 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.2 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "golf-hole-line", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "==", + [ + "get", + "class" + ], + "golf" + ], + "paint": { + "line-color": "hsl(98, 26%, 56%)" + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., surface", + "microg:gms-type-feature": "poi.attraction", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-polygon", + "type": "fill", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk", + "trunk_link", + "street", + "street_limited", + "track", + "service" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "Polygon" + ] + ], + "paint": { + "fill-color": "hsl(0, 0%, 95%)", + "fill-outline-color": "hsl(60, 10%, 70%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "turning-feature-outline", + "type": "circle", + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "turning_circle", + "turning_loop" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ] + ], + "paint": { + "circle-radius": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 4.5, + 16, + 8, + 18, + 20, + 22, + 200 + ], + "circle-color": "hsl(0, 0%, 95%)", + "circle-stroke-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0.8, + 16, + 1.2, + 18, + 2 + ], + "circle-stroke-color": "hsl(60, 10%, 70%)", + "circle-pitch-alignment": "map" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-minor-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "track" + ], + true, + "service", + [ + "step", + [ + "zoom" + ], + false, + 14, + true + ], + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "track", + "hsl(35, 80%, 48%)", + "hsl(60, 10%, 70%)" + ], + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 18, + 10, + 22, + 100 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-street-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-minor-link-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "secondary_link", + "tertiary_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.4, + 18, + 18, + 22, + 180 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 11, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-secondary-tertiary-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0, + 18, + 26, + 22, + 260 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-primary-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "primary" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 28, + 22, + 280 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-major-link-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 11, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "road-motorway-trunk-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 3, + "filter": [ + "all", + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + 5, + [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ] + ] + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0, + 3.5, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "turning-feature", + "type": "circle", + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "turning_circle", + "turning_loop" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ] + ], + "paint": { + "circle-radius": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 4.5, + 16, + 8, + 18, + 20, + 22, + 200 + ], + "circle-color": "hsl(0, 0%, 95%)", + "circle-pitch-alignment": "map" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-construction", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "construction" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 2, + 18, + 20, + 22, + 200 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0.4, + 0.8 + ] + ], + 15, + [ + "literal", + [ + 0.3, + 0.6 + ] + ], + 16, + [ + "literal", + [ + 0.2, + 0.3 + ] + ], + 17, + [ + "literal", + [ + 0.2, + 0.25 + ] + ], + 18, + [ + "literal", + [ + 0.15, + 0.15 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-minor", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "track" + ], + true, + "service", + [ + "step", + [ + "zoom" + ], + false, + 14, + true + ], + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 18, + 10, + 22, + 100 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-minor-link", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "secondary_link", + "tertiary_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 13, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 13, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.4, + 18, + 18, + 22, + 180 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-major-link", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 13, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 13, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway_link", + "hsl(15, 100%, 75%)", + "hsl(35, 89%, 75%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-street", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "street_limited", + "hsl(60, 22%, 80%)", + "hsl(0, 0%, 95%)" + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-street-low", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "maxzoom": 14, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-secondary-tertiary", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 9, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0, + 18, + 26, + 22, + 260 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-primary", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 6, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "primary" + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 28, + 22, + 280 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-motorway-trunk", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 3, + "filter": [ + "all", + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + 5, + [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ] + ] + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 13, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 13, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ], + "line-color": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + "motorway", + "hsl(15, 88%, 69%)", + "trunk", + "hsl(35, 81%, 59%)", + "hsl(60, 18%, 85%)" + ], + 9, + [ + "match", + [ + "get", + "class" + ], + "motorway", + "hsl(15, 100%, 75%)", + "hsl(35, 89%, 75%)" + ] + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0, + 3.5, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-rail", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "major_rail", + "minor_rail" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ] + ], + "paint": { + "line-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + "hsl(75, 25%, 68%)", + 16, + "hsl(60, 0%, 56%)" + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 20, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, surface", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "road-rail-tracks", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "major_rail", + "minor_rail" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ] + ], + "paint": { + "line-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + "hsl(75, 25%, 68%)", + 16, + "hsl(60, 0%, 56%)" + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 4, + 20, + 8 + ], + "line-dasharray": [ + 0.1, + 15 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13.75, + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, surface", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "level-crossing", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "==", + [ + "get", + "class" + ], + "level_crossing" + ], + "layout": { + "icon-image": "level-crossing", + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface-icons", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "road-oneway-arrow-blue", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "oneway" + ], + "true" + ], + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "street", + "street_limited" + ], + true, + false + ], + 16, + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "street", + "street_limited", + "primary_link", + "secondary_link", + "tertiary_link", + "service", + "track" + ], + true, + false + ] + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": [ + "step", + [ + "zoom" + ], + "oneway-small", + 18, + "oneway-large" + ], + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface-icons", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "road-oneway-arrow-white", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "oneway" + ], + "true" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk", + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "none", + "ford" + ], + true, + false + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": [ + "step", + [ + "zoom" + ], + "oneway-white-small", + 18, + "oneway-white-large" + ], + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface-icons", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "crosswalks", + "type": "symbol", + "source": "composite", + "source-layer": "structure", + "minzoom": 17, + "filter": [ + "all", + [ + "==", + [ + "get", + "type" + ], + "crosswalk" + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ] + ], + "layout": { + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 0.1, + 18, + 0.2, + 19, + 0.5, + 22, + 1.5 + ], + "icon-image": [ + "step", + [ + "zoom" + ], + "crosswalk-small", + 18, + "crosswalk-large" + ], + "icon-rotate": [ + "get", + "direction" + ], + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, surface-icons", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "gate-fence-hedge", + "type": "line", + "source": "composite", + "source-layer": "structure", + "minzoom": 16, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "gate", + "fence", + "hedge" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": [ + "match", + [ + "get", + "class" + ], + "hedge", + "hsl(98, 32%, 56%)", + "hsl(60, 25%, 63%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 1, + 20, + 3 + ], + "line-opacity": [ + "match", + [ + "get", + "class" + ], + "gate", + 0.5, + 1 + ], + "line-dasharray": [ + 1, + 2, + 5, + 2, + 1, + 2 + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-path-bg", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "step", + [ + "zoom" + ], + [ + "!", + [ + "match", + [ + "get", + "type" + ], + [ + "steps", + "sidewalk", + "crossing" + ], + true, + false + ] + ], + 16, + [ + "!=", + [ + "get", + "type" + ], + "steps" + ] + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 2, + 18, + 7 + ], + "line-color": [ + "match", + [ + "get", + "type" + ], + "piste", + "hsl(215, 80%, 48%)", + [ + "mountain_bike", + "hiking", + "trail", + "cycleway", + "footway", + "path", + "bridleway" + ], + "hsl(35, 80%, 48%)", + "hsl(60, 1%, 64%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-steps-bg", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "type" + ], + "steps" + ], + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 2, + 17, + 4.6, + 18, + 7 + ], + "line-color": "hsl(35, 80%, 48%)", + "line-opacity": 0.75 + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-pedestrian-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "pedestrian" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 2, + 18, + 14.5 + ], + "line-color": "hsl(60, 10%, 70%)" + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-path-trail", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "hiking", + "mountain_bike", + "trail" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 5, + 0.5 + ] + ], + 15, + [ + "literal", + [ + 4, + 0.5 + ] + ], + 16, + [ + "literal", + [ + 4, + 0.45 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-path-cycleway-piste", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "cycleway", + "piste" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + 10, + 0 + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-path", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "path" + ], + [ + "!=", + [ + "get", + "type" + ], + "steps" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 18, + 4 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 4, + 0.3 + ] + ], + 15, + [ + "literal", + [ + 1.75, + 0.3 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.3 + ] + ], + 17, + [ + "literal", + [ + 1, + 0.25 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-steps", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "type" + ], + "steps" + ], + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 15, + 1, + 16, + 1.6, + 18, + 6 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.75, + 1 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.75 + ] + ], + 17, + [ + "literal", + [ + 0.3, + 0.3 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-pedestrian", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "pedestrian" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 18, + 12 + ], + "line-color": "hsl(0, 0%, 95%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 1, + 0 + ] + ], + 15, + [ + "literal", + [ + 1.5, + 0.4 + ] + ], + 16, + [ + "literal", + [ + 1, + 0.2 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "gate-label", + "type": "symbol", + "source": "composite", + "source-layer": "structure", + "minzoom": 16, + "filter": [ + "==", + [ + "get", + "class" + ], + "gate" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "type" + ], + "gate", + "gate", + "lift_gate", + "lift-gate", + "" + ] + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., barriers-bridges", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "bridge-minor-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "track" + ], + true, + "service", + [ + "step", + [ + "zoom" + ], + false, + 14, + true + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "track", + "hsl(35, 80%, 48%)", + "hsl(60, 10%, 70%)" + ], + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 18, + 10, + 22, + 100 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-street-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "track", + "hsl(35, 80%, 48%)", + "hsl(60, 10%, 70%)" + ], + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-minor-link-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "secondary_link", + "tertiary_link" + ], + true, + false + ], + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.4, + 18, + 18, + 22, + 180 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 11, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-secondary-tertiary-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0, + 18, + 26, + 22, + 260 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 10, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-primary-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "primary" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 28, + 22, + 280 + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 10, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-major-link-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "<=", + [ + "get", + "layer" + ], + 1 + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-motorway-trunk-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "<=", + [ + "get", + "layer" + ], + 1 + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-construction", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "construction" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 2, + 18, + 20, + 22, + 200 + ], + "line-color": "hsl(60, 10%, 70%)", + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0.4, + 0.8 + ] + ], + 15, + [ + "literal", + [ + 0.3, + 0.6 + ] + ], + 16, + [ + "literal", + [ + 0.2, + 0.3 + ] + ], + 17, + [ + "literal", + [ + 0.2, + 0.25 + ] + ], + 18, + [ + "literal", + [ + 0.15, + 0.15 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-minor", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "track" + ], + true, + "service", + [ + "step", + [ + "zoom" + ], + false, + 14, + true + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 18, + 10, + 22, + 100 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-minor-link", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "secondary_link", + "tertiary_link" + ], + true, + false + ], + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.4, + 18, + 18, + 22, + 180 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-major-link", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "<=", + [ + "get", + "layer" + ], + 1 + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 13, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway_link", + "hsl(15, 100%, 75%)", + "hsl(35, 89%, 75%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-street", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "street_limited", + "hsl(60, 22%, 80%)", + "hsl(0, 0%, 95%)" + ], + "line-opacity": [ + "step", + [ + "zoom" + ], + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-street-low", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "maxzoom": 14, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ], + "line-join": [ + "step", + [ + "zoom" + ], + "miter", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.5, + 18, + 20, + 22, + 200 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0, + 18, + 26, + 22, + 260 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-primary", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "class" + ], + "primary" + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 28, + 22, + 280 + ], + "line-color": "hsl(0, 0%, 95%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-motorway-trunk", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "<=", + [ + "get", + "layer" + ], + 1 + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway", + "hsl(15, 100%, 75%)", + "hsl(35, 89%, 75%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-major-link-2-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + ">=", + [ + "get", + "layer" + ], + 2 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.8, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-motorway-trunk-2-case", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + ">=", + [ + "get", + "layer" + ], + 2 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 22, + 2 + ], + "line-color": "hsl(60, 10%, 82%)", + "line-gap-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "bridge-major-link-2", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + ">=", + [ + "get", + "layer" + ], + 2 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 13, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12, + 0.8, + 18, + 20, + 22, + 200 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway_link", + "hsl(15, 100%, 75%)", + "hsl(35, 89%, 75%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-motorway-trunk-2", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + ">=", + [ + "get", + "layer" + ], + 2 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-cap": [ + "step", + [ + "zoom" + ], + "butt", + 14, + "round" + ] + }, + "paint": { + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 3, + 0.8, + 18, + 30, + 22, + 300 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "motorway", + "hsl(15, 100%, 75%)", + "hsl(35, 89%, 75%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-oneway-arrow-blue", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "==", + [ + "get", + "oneway" + ], + "true" + ], + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "street", + "street_limited" + ], + true, + false + ], + 16, + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "street", + "street_limited", + "primary_link", + "secondary_link", + "tertiary_link", + "service", + "track" + ], + true, + false + ] + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": [ + "step", + [ + "zoom" + ], + "oneway-small", + 18, + "oneway-large" + ], + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "bridge-oneway-arrow-white", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk", + "motorway_link", + "trunk_link" + ], + true, + false + ], + [ + "==", + [ + "get", + "oneway" + ], + "true" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": "oneway-white-small", + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-allow-overlap": true, + "icon-ignore-placement": true + }, + "paint": {}, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, bridges", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "bridge-rail", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "major_rail", + "minor_rail" + ], + true, + false + ] + ], + "paint": { + "line-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + "hsl(75, 25%, 68%)", + 16, + "hsl(60, 0%, 56%)" + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 0.5, + 20, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, bridges", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "bridge-rail-tracks", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + [ + "get", + "structure" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "major_rail", + "minor_rail" + ], + true, + false + ] + ], + "paint": { + "line-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + "hsl(75, 25%, 68%)", + 16, + "hsl(60, 0%, 56%)" + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 4, + 20, + 8 + ], + "line-dasharray": [ + 0.1, + 15 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13.75, + 0, + 14, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, bridges", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "aerialway", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "==", + [ + "get", + "class" + ], + "aerialway" + ], + "paint": { + "line-color": "hsl(230, 50%, 60%)", + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 14, + 1, + 20, + 2 + ], + "line-dasharray": [ + 4, + 1 + ] + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, elevated", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "admin-1-boundary-bg", + "type": "line", + "source": "composite", + "source-layer": "admin", + "minzoom": 7, + "filter": [ + "all", + [ + "==", + [ + "get", + "admin_level" + ], + 1 + ], + [ + "==", + [ + "get", + "maritime" + ], + "false" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ] + ], + "paint": { + "line-color": "hsl(350, 90%, 88%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 3, + 12, + 6 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 7, + 0, + 8, + 0.5 + ], + "line-dasharray": [ + 1, + 0 + ], + "line-blur": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0, + 12, + 3 + ] + }, + "metadata": { + "mapbox:featureComponent": "admin-boundaries", + "mapbox:group": "Administrative boundaries, admin", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "admin-0-boundary-bg", + "type": "line", + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + [ + "get", + "admin_level" + ], + 0 + ], + [ + "==", + [ + "get", + "maritime" + ], + "false" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ] + ], + "paint": { + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 4, + 12, + 8 + ], + "line-color": "hsl(350, 90%, 88%)", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0, + 4, + 0.5 + ], + "line-blur": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0, + 12, + 2 + ] + }, + "metadata": { + "mapbox:featureComponent": "admin-boundaries", + "mapbox:group": "Administrative boundaries, admin", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "admin-1-boundary", + "type": "line", + "source": "composite", + "source-layer": "admin", + "minzoom": 2, + "filter": [ + "all", + [ + "==", + [ + "get", + "admin_level" + ], + 1 + ], + [ + "==", + [ + "get", + "maritime" + ], + "false" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 2, + 0 + ] + ], + 7, + [ + "literal", + [ + 2, + 2, + 6, + 2 + ] + ] + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0.3, + 12, + 1.5 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 2, + 0, + 3, + 1 + ], + "line-color": "hsl(350, 30%, 55%)" + }, + "metadata": { + "mapbox:featureComponent": "admin-boundaries", + "mapbox:group": "Administrative boundaries, admin", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "admin-0-boundary", + "type": "line", + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + [ + "get", + "admin_level" + ], + 0 + ], + [ + "==", + [ + "get", + "disputed" + ], + "false" + ], + [ + "==", + [ + "get", + "maritime" + ], + "false" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(350, 30%, 50%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0.5, + 12, + 2 + ], + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 2, + 0 + ] + ], + 7, + [ + "literal", + [ + 2, + 2, + 6, + 2 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "admin-boundaries", + "mapbox:group": "Administrative boundaries, admin", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "admin-0-boundary-disputed", + "type": "line", + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + [ + "get", + "disputed" + ], + "true" + ], + [ + "==", + [ + "get", + "admin_level" + ], + 0 + ], + [ + "==", + [ + "get", + "maritime" + ], + "false" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ] + ], + "paint": { + "line-color": "hsl(350, 30%, 50%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 0.5, + 12, + 2 + ], + "line-dasharray": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 3, + 2, + 5 + ] + ], + 7, + [ + "literal", + [ + 2, + 1.5 + ] + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "admin-boundaries", + "mapbox:group": "Administrative boundaries, admin", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "contour-label", + "type": "symbol", + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": [ + "any", + [ + "==", + [ + "get", + "index" + ], + 10 + ], + [ + "==", + [ + "get", + "index" + ], + 5 + ] + ], + "layout": { + "text-field": [ + "concat", + [ + "get", + "ele" + ], + " m" + ], + "symbol-placement": "line", + "text-pitch-alignment": "viewport", + "text-max-angle": 25, + "text-padding": 5, + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 9.5, + 20, + 12 + ] + }, + "paint": { + "text-color": "hsl(60, 10%, 35%)", + "text-halo-width": 1, + "text-halo-color": "hsl(60, 10%, 85%)" + }, + "metadata": { + "mapbox:featureComponent": "terrain", + "mapbox:group": "Terrain, terrain-labels", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "building-entrance", + "type": "symbol", + "source": "composite", + "source-layer": "structure", + "minzoom": 18, + "filter": [ + "==", + [ + "get", + "class" + ], + "entrance" + ], + "layout": { + "icon-image": "marker", + "text-field": [ + "get", + "ref" + ], + "text-size": 10, + "text-offset": [ + 0, + -0.5 + ], + "text-font": [ + "DIN Pro Italic", + "Arial Unicode MS Regular" + ] + }, + "paint": { + "text-color": "hsl(60, 8%, 38%)", + "text-halo-color": "hsl(60, 13%, 77%)", + "text-halo-width": 1, + "icon-opacity": 0.4 + }, + "metadata": { + "mapbox:featureComponent": "buildings", + "mapbox:group": "Buildings, building-labels", + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "building-number-label", + "type": "symbol", + "source": "composite", + "source-layer": "housenum_label", + "minzoom": 17, + "layout": { + "text-field": [ + "get", + "house_num" + ], + "text-font": [ + "DIN Pro Italic", + "Arial Unicode MS Regular" + ], + "text-padding": 4, + "text-max-width": 7, + "text-size": 10 + }, + "paint": { + "text-color": "hsl(60, 8%, 38%)", + "text-halo-color": "hsl(60, 13%, 77%)", + "text-halo-width": 1 + }, + "metadata": { + "mapbox:featureComponent": "buildings", + "mapbox:group": "Buildings, building-labels", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "block-number-label", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "settlement_subdivision" + ], + [ + "==", + [ + "get", + "type" + ], + "block" + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "text-font": [ + "DIN Pro Italic", + "Arial Unicode MS Regular" + ], + "text-max-width": 7, + "text-size": 11 + }, + "paint": { + "text-color": "hsl(60, 18%, 44%)", + "text-halo-color": "hsl(60, 17%, 84%)", + "text-halo-width": 0.5, + "text-halo-blur": 0.5 + }, + "metadata": { + "mapbox:featureComponent": "buildings", + "mapbox:group": "Buildings, building-labels", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "road-label", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk", + "primary", + "secondary", + "tertiary" + ], + true, + false + ], + 12, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "street", + "street_limited", + "track" + ], + true, + false + ], + 15, + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian", + "golf", + "ferry", + "aerialway" + ], + false, + true + ] + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk", + "primary", + "secondary", + "tertiary" + ], + 10, + [ + "motorway_link", + "trunk_link", + "primary_link", + "secondary_link", + "tertiary_link", + "street", + "street_limited", + "track" + ], + 9, + 6.5 + ], + 18, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk", + "primary", + "secondary", + "tertiary" + ], + 16, + [ + "motorway_link", + "trunk_link", + "primary_link", + "secondary_link", + "tertiary_link", + "street", + "street_limited", + "track" + ], + 14, + 13 + ] + ], + "text-max-angle": 30, + "text-font": [ + "DIN Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0,0%, 0%)", + "text-halo-color": [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "trunk" + ], + "hsla(60, 25%, 100%, 0.75)", + "hsl(60, 25%, 100%)" + ], + "text-halo-width": 1, + "text-halo-blur": 1 + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, road-labels", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "road-intersection", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "intersection" + ], + [ + "has", + "name" + ] + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "icon-image": "intersection", + "icon-text-fit": "both", + "icon-text-fit-padding": [ + 1, + 2, + 1, + 2 + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15, + 9, + 18, + 12 + ], + "text-font": [ + "DIN Pro Bold", + "Arial Unicode MS Bold" + ] + }, + "paint": { + "text-color": "hsl(230, 36%, 64%)" + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, road-labels", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "road-number-shield", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 6, + "filter": [ + "all", + [ + "has", + "reflen" + ], + [ + "<=", + [ + "get", + "reflen" + ], + 6 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian", + "service" + ], + false, + true + ], + [ + "step", + [ + "zoom" + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ], + 11, + [ + ">", + [ + "get", + "len" + ], + 5000 + ], + 12, + [ + ">", + [ + "get", + "len" + ], + 2500 + ], + 13, + [ + ">", + [ + "get", + "len" + ], + 1000 + ], + 14, + true + ] + ], + "layout": { + "text-size": 9, + "icon-image": [ + "case", + [ + "has", + "shield_beta" + ], + [ + "coalesce", + [ + "image", + [ + "concat", + [ + "get", + "shield_beta" + ], + "-", + [ + "to-string", + [ + "get", + "reflen" + ] + ] + ] + ], + [ + "image", + [ + "concat", + "default-", + [ + "to-string", + [ + "get", + "reflen" + ] + ] + ] + ] + ], + [ + "concat", + [ + "get", + "shield" + ], + "-", + [ + "to-string", + [ + "get", + "reflen" + ] + ] + ] + ], + "icon-rotation-alignment": "viewport", + "text-max-angle": 38, + "symbol-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 400, + 14, + 600 + ], + "text-font": [ + "DIN Pro Bold", + "Arial Unicode MS Bold" + ], + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "text-rotation-alignment": "viewport", + "text-field": [ + "get", + "ref" + ], + "text-letter-spacing": 0.05 + }, + "paint": { + "text-color": [ + "case", + [ + "all", + [ + "has", + "shield_text_color_beta" + ], + [ + "to-boolean", + [ + "coalesce", + [ + "image", + [ + "concat", + [ + "get", + "shield_beta" + ], + "-", + [ + "to-string", + [ + "get", + "reflen" + ] + ] + ] + ], + "" + ] + ] + ], + [ + "match", + [ + "get", + "shield_text_color_beta" + ], + "white", + "hsl(0, 0%, 100%)", + "yellow", + "hsl(50, 63%, 70%)", + "orange", + "hsl(25, 63%, 75%)", + "blue", + "hsl(230, 36%, 44%)", + "red", + "hsl(0, 54%, 59%)", + "green", + "hsl(140, 46%, 37%)", + "hsl(230, 11%, 13%)" + ], + [ + "match", + [ + "get", + "shield_text_color" + ], + "white", + "hsl(0, 0%, 100%)", + "yellow", + "hsl(50, 63%, 70%)", + "orange", + "hsl(25, 63%, 75%)", + "blue", + "hsl(230, 36%, 44%)", + "red", + "hsl(0, 54%, 59%)", + "green", + "hsl(140, 46%, 37%)", + "hsl(230, 11%, 13%)" + ] + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, road-labels", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "road-exit-shield", + "type": "symbol", + "source": "composite", + "source-layer": "motorway_junction", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "reflen" + ], + [ + "<=", + [ + "get", + "reflen" + ], + 9 + ] + ], + "layout": { + "text-field": [ + "get", + "ref" + ], + "text-size": 9, + "icon-image": [ + "concat", + "motorway-exit-", + [ + "to-string", + [ + "get", + "reflen" + ] + ] + ], + "text-font": [ + "DIN Pro Bold", + "Arial Unicode MS Bold" + ] + }, + "paint": { + "text-color": "hsl(0, 0%, 100%)", + "text-translate": [ + 0, + 0 + ] + }, + "metadata": { + "mapbox:featureComponent": "road-network", + "mapbox:group": "Road network, road-labels", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + } + }, + { + "id": "path-pedestrian-label", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "case", + [ + "has", + "layer" + ], + [ + ">=", + [ + "get", + "layer" + ], + 0 + ], + true + ], + [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian" + ], + true, + false + ], + 15, + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ] + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + [ + "match", + [ + "get", + "class" + ], + "pedestrian", + 9, + 6.5 + ], + 18, + [ + "match", + [ + "get", + "class" + ], + "pedestrian", + 14, + 13 + ] + ], + "text-max-angle": 30, + "text-font": [ + "DIN Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0,0%, 0%)", + "text-halo-color": "hsl(60, 25%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., walking-cycling-labels", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "golf-hole-label", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "==", + [ + "get", + "class" + ], + "golf" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": 12 + }, + "paint": { + "text-halo-color": "hsl(98, 60%, 55%)", + "text-halo-width": 0.5, + "text-halo-blur": 0.5, + "text-color": "hsl(100, 80%, 18%)" + }, + "metadata": { + "mapbox:featureComponent": "walking-cycling", + "mapbox:group": "Walking, cycling, etc., walking-cycling-labels", + "microg:gms-type-feature": "poi.attraction", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "ferry-aerialway-label", + "type": "symbol", + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "match", + [ + "get", + "class" + ], + "aerialway", + true, + "ferry", + true, + false + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 6.5, + 18, + 13 + ], + "text-max-angle": 30, + "text-font": [ + "DIN Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "class" + ], + "ferry", + "hsl(205, 43%, 100%)", + "hsl(230, 50%, 60%)" + ], + "text-halo-color": [ + "match", + [ + "get", + "class" + ], + "ferry", + "hsl(205, 75%, 70%)", + "hsl(60, 20%, 100%)" + ], + "text-halo-width": 1, + "text-halo-blur": 1 + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, ferry-aerialway-labels", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "composite", + "source-layer": "natural_label", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "canal", + "river", + "stream", + "disputed_canal", + "disputed_river", + "disputed_stream" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "text-font": [ + "DIN Pro Italic", + "Arial Unicode MS Regular" + ], + "text-max-angle": 30, + "symbol-spacing": [ + "interpolate", + [ + "linear", + 1 + ], + [ + "zoom" + ], + 15, + 250, + 17, + 400 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 12, + 18, + 18 + ], + "symbol-placement": "line", + "text-pitch-alignment": "viewport", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": "hsl(205, 43%, 90%)", + "text-halo-color": "hsla(60, 17%, 84%, 0.5)" + }, + "metadata": { + "mapbox:featureComponent": "natural-features", + "mapbox:group": "Natural features, natural-labels", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "natural-line-label", + "type": "symbol", + "metadata": { + "mapbox:featureComponent": "natural-features", + "mapbox:group": "Natural features, natural-labels", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "natural_label", + "minzoom": 4, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "glacier", + "landform", + "disputed_glacier", + "disputed_landform" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "<=", + [ + "get", + "filterrank" + ], + 4 + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "text-size": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + 18, + 5, + 12 + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + 18, + 13, + 12 + ] + ], + "text-max-angle": 30, + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line-center", + "text-pitch-alignment": "viewport" + }, + "paint": { + "text-halo-width": 0.5, + "text-halo-color": "hsl(60, 17%, 84%)", + "text-halo-blur": 0.5, + "text-color": "hsl(340, 10%, 38%)" + } + }, + { + "id": "natural-point-label", + "type": "symbol", + "source": "composite", + "source-layer": "natural_label", + "minzoom": 4, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "dock", + "glacier", + "landform", + "water_feature", + "wetland", + "disputed_dock", + "disputed_glacier", + "disputed_landform", + "disputed_water_feature", + "disputed_wetland" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "<=", + [ + "get", + "filterrank" + ], + 4 + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ] + ], + "layout": { + "text-size": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + 18, + 5, + 12 + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + 18, + 13, + 12 + ] + ], + "icon-image": [ + "get", + "maki" + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + [ + "literal", + [ + 0, + 0 + ] + ], + 5, + [ + "literal", + [ + 0, + 0.8 + ] + ] + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + [ + "literal", + [ + 0, + 0 + ] + ], + 13, + [ + "literal", + [ + 0, + 0.8 + ] + ] + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + "center", + 5, + "top" + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + "center", + 13, + "top" + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "icon-opacity": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + 0, + 5, + 1 + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + 0, + 13, + 1 + ] + ], + "text-halo-color": "hsl(60, 20%, 100%)", + "text-halo-width": 0.5, + "text-halo-blur": 0.5, + "text-color": "hsl(340, 10%, 38%)" + }, + "metadata": { + "mapbox:featureComponent": "natural-features", + "mapbox:group": "Natural features, natural-labels", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "water-line-label", + "type": "symbol", + "metadata": { + "mapbox:featureComponent": "natural-features", + "mapbox:group": "Natural features, natural-labels", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "natural_label", + "minzoom": 1, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "bay", + "ocean", + "reservoir", + "sea", + "water", + "disputed_bay", + "disputed_ocean", + "disputed_reservoir", + "disputed_sea", + "disputed_water" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "*", + [ + "-", + 16, + [ + "sqrt", + [ + "get", + "sizerank" + ] + ] + ], + 1 + ], + 22, + [ + "*", + [ + "-", + 22, + [ + "sqrt", + [ + "get", + "sizerank" + ] + ] + ], + 1 + ] + ], + "text-max-angle": 30, + "text-letter-spacing": [ + "match", + [ + "get", + "class" + ], + "ocean", + 0.25, + [ + "sea", + "bay" + ], + 0.15, + 0 + ], + "text-font": [ + "DIN Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line-center", + "text-pitch-alignment": "viewport", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "class" + ], + [ + "bay", + "ocean", + "sea" + ], + "hsl(205, 71%, 90%)", + "hsl(205, 43%, 90%)" + ], + "text-halo-color": "hsla(60, 17%, 84%, 0.5)" + } + }, + { + "id": "water-point-label", + "type": "symbol", + "source": "composite", + "source-layer": "natural_label", + "minzoom": 1, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "bay", + "ocean", + "reservoir", + "sea", + "water", + "disputed_bay", + "disputed_ocean", + "disputed_reservoir", + "disputed_sea", + "disputed_water" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ] + ], + "layout": { + "text-line-height": 1.3, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "*", + [ + "-", + 16, + [ + "sqrt", + [ + "get", + "sizerank" + ] + ] + ], + 1 + ], + 22, + [ + "*", + [ + "-", + 22, + [ + "sqrt", + [ + "get", + "sizerank" + ] + ] + ], + 1 + ] + ], + "text-font": [ + "DIN Pro Italic", + "Arial Unicode MS Regular" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": [ + "match", + [ + "get", + "class" + ], + "ocean", + 0.25, + [ + "bay", + "sea" + ], + 0.15, + 0.01 + ], + "text-max-width": [ + "match", + [ + "get", + "class" + ], + "ocean", + 4, + "sea", + 5, + [ + "bay", + "water" + ], + 7, + 10 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "class" + ], + [ + "bay", + "ocean", + "sea" + ], + "hsl(205, 71%, 90%)", + "hsl(205, 43%, 90%)" + ], + "text-halo-color": "hsla(60, 17%, 84%, 0.5)" + }, + "metadata": { + "mapbox:featureComponent": "natural-features", + "mapbox:group": "Natural features, natural-labels", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "poi-label", + "type": "symbol", + "source": "composite", + "source-layer": "poi_label", + "minzoom": 6, + "filter": [ + "<=", + [ + "get", + "filterrank" + ], + [ + "+", + [ + "step", + [ + "zoom" + ], + 0, + 16, + 1, + 17, + 2 + ], + [ + "match", + [ + "get", + "class" + ], + "food_and_drink_stores", + 3, + "historic", + 3, + "landmark", + 3, + "medical", + 3, + "motorist", + 3, + "park_like", + 4, + "sport_and_leisure", + 4, + "visitor_amenities", + 4, + 2 + ] + ] + ], + "layout": { + "text-size": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + 18, + 5, + 12 + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + 18, + 13, + 12 + ] + ], + "icon-image": [ + "case", + [ + "has", + "maki_beta" + ], + [ + "coalesce", + [ + "image", + [ + "get", + "maki_beta" + ] + ], + [ + "image", + [ + "get", + "maki" + ] + ] + ], + [ + "image", + [ + "get", + "maki" + ] + ] + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + [ + "literal", + [ + 0, + 0 + ] + ], + 5, + [ + "literal", + [ + 0, + 0.8 + ] + ] + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + [ + "literal", + [ + 0, + 0 + ] + ], + 13, + [ + "literal", + [ + 0, + 0.8 + ] + ] + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + "center", + 5, + "top" + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + "center", + 13, + "top" + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "icon-opacity": [ + "step", + [ + "zoom" + ], + [ + "step", + [ + "get", + "sizerank" + ], + 0, + 5, + 1 + ], + 17, + [ + "step", + [ + "get", + "sizerank" + ], + 0, + 13, + 1 + ] + ], + "text-halo-color": "hsl(60, 20%, 100%)", + "text-halo-width": 0.5, + "text-halo-blur": 0.5, + "text-color": [ + "match", + [ + "get", + "class" + ], + "food_and_drink", + "hsl(35, 80%, 38%)", + "park_like", + "hsl(100, 80%, 18%)", + "education", + "hsl(30, 60%, 28%)", + "medical", + "hsl(10, 60%, 43%)", + "sport_and_leisure", + "hsl(210, 60%, 38%)", + "hsl(340, 10%, 38%)" + ] + }, + "metadata": { + "mapbox:featureComponent": "point-of-interest-labels", + "mapbox:group": "Point of interest labels, poi-labels", + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "transit-label", + "type": "symbol", + "source": "composite", + "source-layer": "transit_stop_label", + "minzoom": 12, + "filter": [ + "step", + [ + "zoom" + ], + [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + 4 + ], + [ + "match", + [ + "get", + "mode" + ], + "rail", + true, + "metro_rail", + true, + false + ], + [ + "!=", + [ + "get", + "stop_type" + ], + "entrance" + ] + ], + 14, + [ + "all", + [ + "match", + [ + "get", + "mode" + ], + "rail", + true, + "metro_rail", + true, + false + ], + [ + "!=", + [ + "get", + "stop_type" + ], + "entrance" + ] + ], + 15, + [ + "all", + [ + "match", + [ + "get", + "mode" + ], + "rail", + true, + "metro_rail", + true, + "ferry", + true, + "light_rail", + true, + false + ], + [ + "!=", + [ + "get", + "stop_type" + ], + "entrance" + ] + ], + 16, + [ + "all", + [ + "match", + [ + "get", + "mode" + ], + "bus", + false, + true + ], + [ + "!=", + [ + "get", + "stop_type" + ], + "entrance" + ] + ], + 17, + [ + "!=", + [ + "get", + "stop_type" + ], + "entrance" + ], + 19, + true + ], + "layout": { + "text-size": 12, + "icon-image": [ + "get", + "network" + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-justify": [ + "match", + [ + "get", + "stop_type" + ], + "entrance", + "left", + "center" + ], + "text-offset": [ + "match", + [ + "get", + "stop_type" + ], + "entrance", + [ + "literal", + [ + 1, + 0 + ] + ], + [ + "literal", + [ + 0, + 0.8 + ] + ] + ], + "text-anchor": [ + "match", + [ + "get", + "stop_type" + ], + "entrance", + "left", + "top" + ], + "text-field": [ + "step", + [ + "zoom" + ], + "", + 13, + [ + "match", + [ + "get", + "mode" + ], + [ + "rail", + "metro_rail" + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "" + ], + 14, + [ + "match", + [ + "get", + "mode" + ], + [ + "bus", + "bicycle" + ], + "", + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + 18, + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-letter-spacing": 0.01, + "text-max-width": [ + "match", + [ + "get", + "stop_type" + ], + "entrance", + 15, + 9 + ] + }, + "paint": { + "text-halo-color": "hsl(60, 20%, 100%)", + "text-color": [ + "match", + [ + "get", + "network" + ], + "tokyo-metro", + "hsl(180, 30%, 30%)", + "mexico-city-metro", + "hsl(25, 63%, 63%)", + [ + "barcelona-metro", + "delhi-metro", + "hong-kong-mtr", + "milan-metro", + "osaka-subway" + ], + "hsl(0, 57%, 47%)", + [ + "boston-t", + "washington-metro" + ], + "hsl(230, 11%, 20%)", + [ + "chongqing-rail-transit", + "kiev-metro", + "singapore-mrt", + "taipei-metro" + ], + "hsl(140, 56%, 25%)", + "hsl(230, 50%, 60%)" + ], + "text-halo-blur": 0.5, + "text-halo-width": 0.5 + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, transit-labels", + "microg:gms-type-feature": "transit.station.bus", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "airport-label", + "type": "symbol", + "source": "composite", + "source-layer": "airport_label", + "minzoom": 8, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "military", + "civil", + "disputed_military", + "disputed_civil" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + "layout": { + "text-line-height": 1.1, + "text-size": [ + "step", + [ + "get", + "sizerank" + ], + 18, + 9, + 12 + ], + "icon-image": [ + "get", + "maki" + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-offset": [ + 0, + 0.8 + ], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": [ + "step", + [ + "get", + "sizerank" + ], + [ + "case", + [ + "has", + "ref" + ], + [ + "concat", + [ + "get", + "ref" + ], + " -\n", + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + 15, + [ + "get", + "ref" + ] + ], + "text-letter-spacing": 0.01, + "text-max-width": 9 + }, + "paint": { + "text-color": "hsl(230, 40%, 55%)", + "text-halo-color": "hsl(60, 20%, 100%)", + "text-halo-width": 1 + }, + "metadata": { + "mapbox:featureComponent": "transit", + "mapbox:group": "Transit, transit-labels", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "settlement-subdivision-label", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 15, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "settlement_subdivision", + "disputed_settlement_subdivision" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "<=", + [ + "get", + "filterrank" + ], + 3 + ] + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-transform": "uppercase", + "text-font": [ + "DIN Pro Regular", + "Arial Unicode MS Regular" + ], + "text-letter-spacing": [ + "match", + [ + "get", + "type" + ], + "suburb", + 0.15, + 0.05 + ], + "text-max-width": 7, + "text-padding": 3, + "text-size": [ + "interpolate", + [ + "cubic-bezier", + 0.5, + 0, + 1, + 1 + ], + [ + "zoom" + ], + 11, + [ + "match", + [ + "get", + "type" + ], + "suburb", + 11, + 10.5 + ], + 15, + [ + "match", + [ + "get", + "type" + ], + "suburb", + 15, + 14 + ] + ] + }, + "paint": { + "text-halo-color": "hsla(60, 25%, 100%, 0.75)", + "text-halo-width": 1, + "text-color": "hsl(230, 29%, 36%)", + "text-halo-blur": 0.5 + }, + "metadata": { + "mapbox:featureComponent": "place-labels", + "mapbox:group": "Place labels, place-labels", + "microg:gms-type-feature": "administrative.neighborhood", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "settlement-minor-label", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 2, + "maxzoom": 13, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + 3 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "disputed_settlement" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "step", + [ + "zoom" + ], + [ + ">", + [ + "get", + "symbolrank" + ], + 6 + ], + 4, + [ + ">=", + [ + "get", + "symbolrank" + ], + 7 + ], + 6, + [ + ">=", + [ + "get", + "symbolrank" + ], + 8 + ], + 7, + [ + ">=", + [ + "get", + "symbolrank" + ], + 10 + ], + 10, + [ + ">=", + [ + "get", + "symbolrank" + ], + 11 + ], + 11, + [ + ">=", + [ + "get", + "symbolrank" + ], + 13 + ], + 12, + [ + ">=", + [ + "get", + "symbolrank" + ], + 15 + ] + ] + ], + "layout": { + "symbol-sort-key": [ + "get", + "symbolrank" + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "case", + [ + "==", + [ + "get", + "capital" + ], + 2 + ], + "border-dot-13", + [ + "step", + [ + "get", + "symbolrank" + ], + "dot-11", + 9, + "dot-10", + 11, + "dot-9" + ] + ], + 8, + "" + ], + "text-font": [ + "DIN Pro Regular", + "Arial Unicode MS Regular" + ], + "text-radial-offset": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + 2, + 0.6, + 0.55 + ], + 8, + 0 + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + [ + "get", + "text_anchor" + ], + 8, + "center" + ], + "text-justify": "auto", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-max-width": 7, + "text-line-height": 1.1, + "text-size": [ + "interpolate", + [ + "cubic-bezier", + 0.2, + 0, + 0.9, + 1 + ], + [ + "zoom" + ], + 3, + [ + "step", + [ + "get", + "symbolrank" + ], + 11, + 9, + 10 + ], + 6, + [ + "step", + [ + "get", + "symbolrank" + ], + 14, + 9, + 12, + 12, + 10 + ], + 8, + [ + "step", + [ + "get", + "symbolrank" + ], + 16, + 9, + 14, + 12, + 12, + 15, + 10 + ], + 13, + [ + "step", + [ + "get", + "symbolrank" + ], + 22, + 9, + 20, + 12, + 16, + 15, + 14 + ] + ] + }, + "paint": { + "text-color": "hsl(230, 29%, 0%)", + "text-halo-color": "hsl(60, 25%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + }, + "metadata": { + "mapbox:featureComponent": "place-labels", + "mapbox:group": "Place labels, place-labels", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "settlement-major-label", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 2, + "maxzoom": 15, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + 3 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "disputed_settlement" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + [ + "step", + [ + "zoom" + ], + false, + 2, + [ + "<=", + [ + "get", + "symbolrank" + ], + 6 + ], + 4, + [ + "<", + [ + "get", + "symbolrank" + ], + 7 + ], + 6, + [ + "<", + [ + "get", + "symbolrank" + ], + 8 + ], + 7, + [ + "<", + [ + "get", + "symbolrank" + ], + 10 + ], + 10, + [ + "<", + [ + "get", + "symbolrank" + ], + 11 + ], + 11, + [ + "<", + [ + "get", + "symbolrank" + ], + 13 + ], + 12, + [ + "<", + [ + "get", + "symbolrank" + ], + 15 + ], + 13, + [ + ">=", + [ + "get", + "symbolrank" + ], + 11 + ], + 14, + [ + ">=", + [ + "get", + "symbolrank" + ], + 15 + ] + ] + ], + "layout": { + "symbol-sort-key": [ + "get", + "symbolrank" + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "case", + [ + "==", + [ + "get", + "capital" + ], + 2 + ], + "border-dot-13", + [ + "step", + [ + "get", + "symbolrank" + ], + "dot-11", + 9, + "dot-10", + 11, + "dot-9" + ] + ], + 8, + "" + ], + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-radial-offset": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + 2, + 0.6, + 0.55 + ], + 8, + 0 + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + [ + "get", + "text_anchor" + ], + 8, + "center" + ], + "text-justify": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "text_anchor" + ], + [ + "left", + "bottom-left", + "top-left" + ], + "left", + [ + "right", + "bottom-right", + "top-right" + ], + "right", + "center" + ], + 8, + "center" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-max-width": 7, + "text-line-height": 1.1, + "text-size": [ + "interpolate", + [ + "cubic-bezier", + 0.2, + 0, + 0.9, + 1 + ], + [ + "zoom" + ], + 3, + [ + "step", + [ + "get", + "symbolrank" + ], + 13, + 6, + 11 + ], + 6, + [ + "step", + [ + "get", + "symbolrank" + ], + 18, + 6, + 16, + 7, + 14 + ], + 8, + [ + "step", + [ + "get", + "symbolrank" + ], + 20, + 9, + 16, + 10, + 14 + ], + 15, + [ + "step", + [ + "get", + "symbolrank" + ], + 24, + 9, + 20, + 12, + 16, + 15, + 14 + ] + ] + }, + "paint": { + "text-color": "hsl(230, 29%, 0%)", + "text-halo-color": "hsl(60, 25%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + }, + "metadata": { + "mapbox:featureComponent": "place-labels", + "mapbox:group": "Place labels, place-labels", + "microg:gms-type-feature": "administrative.land_parcel", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "state-label", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 3, + "maxzoom": 9, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "state", + "disputed_state" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + "layout": { + "text-size": [ + "interpolate", + [ + "cubic-bezier", + 0.85, + 0.7, + 0.65, + 1 + ], + [ + "zoom" + ], + 4, + [ + "step", + [ + "get", + "symbolrank" + ], + 9, + 6, + 8, + 7, + 7 + ], + 9, + [ + "step", + [ + "get", + "symbolrank" + ], + 21, + 6, + 16, + 7, + 14 + ] + ], + "text-transform": "uppercase", + "text-font": [ + "DIN Pro Bold", + "Arial Unicode MS Bold" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-color": "hsl(230, 29%, 0%)", + "text-halo-color": "hsl(60, 25%, 100%)", + "text-halo-width": 1, + "text-opacity": 0.5 + }, + "metadata": { + "mapbox:featureComponent": "place-labels", + "mapbox:group": "Place labels, place-labels", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "country-label", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 10, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "country", + "disputed_country" + ], + [ + "match", + [ + "get", + "worldview" + ], + [ + "all", + "US" + ], + true, + false + ], + false + ], + "layout": { + "icon-image": "", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-line-height": 1.1, + "text-max-width": 6, + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-radial-offset": [ + "step", + [ + "zoom" + ], + 0.6, + 8, + 0 + ], + "text-justify": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "text_anchor" + ], + [ + "left", + "bottom-left", + "top-left" + ], + "left", + [ + "right", + "bottom-right", + "top-right" + ], + "right", + "center" + ], + 7, + "auto" + ], + "text-size": [ + "interpolate", + [ + "cubic-bezier", + 0.2, + 0, + 0.7, + 1 + ], + [ + "zoom" + ], + 1, + [ + "step", + [ + "get", + "symbolrank" + ], + 11, + 4, + 9, + 5, + 8 + ], + 9, + [ + "step", + [ + "get", + "symbolrank" + ], + 22, + 4, + 19, + 5, + 17 + ] + ] + }, + "paint": { + "icon-opacity": [ + "step", + [ + "zoom" + ], + [ + "case", + [ + "has", + "text_anchor" + ], + 1, + 0 + ], + 7, + 0 + ], + "text-color": "hsl(230, 29%, 0%)", + "text-halo-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 2, + "hsla(60, 25%, 100%, 0.75)", + 3, + "hsl(60, 25%, 100%)" + ], + "text-halo-width": 1.25 + }, + "metadata": { + "mapbox:featureComponent": "place-labels", + "mapbox:group": "Place labels, place-labels", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "continent-label", + "type": "symbol", + "source": "composite", + "source-layer": "natural_label", + "minzoom": 0.75, + "maxzoom": 3, + "filter": [ + "==", + [ + "get", + "class" + ], + "continent" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-line-height": 1.1, + "text-max-width": 6, + "text-font": [ + "DIN Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "exponential", + 0.5 + ], + [ + "zoom" + ], + 0, + 10, + 2.5, + 15 + ], + "text-transform": "uppercase", + "text-letter-spacing": 0.05 + }, + "paint": { + "text-color": "hsl(230, 29%, 0%)", + "text-halo-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + "hsla(60, 25%, 100%, 0.75)", + 3, + "hsl(60, 25%, 100%)" + ], + "text-halo-width": 1.5, + "text-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + 0.8, + 1.5, + 0.5, + 2.5, + 0 + ] + }, + "metadata": { + "mapbox:featureComponent": "place-labels", + "mapbox:group": "Place labels, place-labels", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + } + } + ], + "sources": { + "composite": { + "url": "mapbox://mapbox.mapbox-streets-v8,mapbox.mapbox-terrain-v2,mapbox.mapbox-bathymetry-v2", + "type": "vector" + } + }, + "created": "1970-01-01T00:00:00.000Z", + "modified": "1970-01-01T00:00:00.000Z", + "owner": "mapbox", + "id": "outdoors-v12", + "draft": false +} diff --git a/artwork/styles/style-microg-normal-mapbox.json b/artwork/styles/style-microg-normal-mapbox.json new file mode 100644 index 0000000..295ffad --- /dev/null +++ b/artwork/styles/style-microg-normal-mapbox.json @@ -0,0 +1,4392 @@ +{ + "version": 8, + "name": "Mountain View Full", + "metadata": { + "mapbox:origin": "basic-template", + "mapbox:autocomposite": true, + "mapbox:type": "template", + "mapbox:sdk-support": { + "js": "0.50.0", + "android": "6.7.0", + "ios": "4.6.0" + }, + "mapbox:trackposition": false, + "mapbox:groups": { + "f51b507d2a17e572c70a5db74b0fec7e": { + "name": "Base", + "collapsed": false + }, + "3f48b8dc54ff2e6544b9ef9cedbf2990": { + "name": "Streets", + "collapsed": true + }, + "29bb589e8d1b9b402583363648b70302": { + "name": "Buildings", + "collapsed": true + }, + "3c26e9cbc75335c6f0ba8de5439cf1fa": { + "name": "Country borders", + "collapsed": true + }, + "7b44201d7f1682d99f7140188aff23ce": { + "name": "Labels", + "collapsed": true + }, + "24306bdccbff03e2ee08d5d1a4ca7312": { + "name": "Street name", + "collapsed": true + }, + "124a9d7a8e5226775d947c592110dfad": { + "name": "POI", + "collapsed": true + } + }, + "mapbox:uiParadigm": "layers" + }, + "center": [ + 12.819420849458652, + 50.03325860617235 + ], + "zoom": 3.315829104862067, + "bearing": 0, + "pitch": 1.5, + "light": { + "intensity": 0.5, + "color": "hsl(0, 0%, 100%)", + "anchor": "viewport" + }, + "sources": { + "composite": { + "url": "mapbox://mapbox.mapbox-streets-v8,mapbox.mapbox-terrain-v2", + "type": "vector" + } + }, + "sprite": "mapbox://sprites/microg/cjui4020201oo1fmca7yuwbor/8fkcj5fgn4mftlzuak3guz1f9", + "glyphs": "mapbox://fonts/microg/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "layout": {}, + "paint": { + "background-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 4, + "hsl(43, 30%, 91%)", + 5, + "hsl(0, 0%, 96%)", + 8, + "hsl(0, 0%, 96%)", + 9, + "#efeee8", + 16, + "hsl(0, 0%, 95%)", + 18, + "#f8f9fb" + ] + }, + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "grass", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "grass" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 30%, 90%)", + 11, + "hsl(107, 30%, 94%)", + 12.5, + "hsl(107, 30%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "forrest", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "wood", + "scrub" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 42%, 86%)", + 11, + "hsl(107, 47%, 94%)", + 12.5, + "hsl(107, 47%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "national_park", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landuse_overlay", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "national_park" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": "hsl(106, 58%, 85%)" + } + }, + { + "id": "snow", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "snow" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": "#f9fafc" + } + }, + { + "id": "hillshade", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "hillshade", + "layout": {}, + "paint": { + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 0.03, + 13, + 0 + ] + } + }, + { + "id": "park", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "park", + "scrub" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": "#c1ecaf" + } + }, + { + "id": "pitch", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "pitch" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": "#c8efbb" + } + }, + { + "id": "landuse", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "airport", + "school", + "hospital" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": "hsl(202, 26%, 94%)" + } + }, + { + "id": "river", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "water", + "layout": {}, + "paint": { + "fill-color": "hsl(206, 100%, 83%)" + } + }, + { + "id": "path", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ], + [ + "match", + [ + "get", + "type" + ], + [ + "platform", + "steps" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 34%, 66%)", + "line-dasharray": [ + 4, + 2 + ] + } + }, + { + "id": "steps", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ], + [ + "match", + [ + "get", + "type" + ], + [ + "steps" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 5%, 66%)", + "line-dasharray": [ + 1, + 1 + ], + "line-gap-width": 1 + } + }, + { + "id": "platform", + "type": "fill", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.rail", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "type" + ], + [ + "platform" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(2, 20%, 92%)", + 16, + "hsl(2, 95%, 92%)" + ], + "fill-outline-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(1, 10%, 76%)", + 16, + "hsl(1, 74%, 76%)" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0, + 16, + 1 + ] + } + }, + { + "id": "primary_tunnel_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 7, + 0, + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "#cbcccd" + } + }, + { + "id": "primary_tunnel", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "hsl(0, 0%, 89%)" + } + }, + { + "id": "aeroway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "aeroway", + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)" + } + }, + { + "id": "service_road", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "service" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)" + } + }, + { + "id": "pedestrian_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "has", + "name" + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-color": "#e3e3e3", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 1 + ] + } + }, + { + "id": "street_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "street" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ], + "line-color": "#e3e3e3" + } + }, + { + "id": "secondary_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "secondary_link", + "tertiary_link", + "tertiary", + "trunk_link", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ], + "line-color": "#e3e3e3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 1, + 20, + 2 + ] + } + }, + { + "id": "primary_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-color": "#ecd283" + } + }, + { + "id": "motorway_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ], + "line-color": "#ecd283", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15, + 2 + ] + } + }, + { + "id": "railway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "major_rail", + "minor_rail", + "service_rail" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(220, 4%, 85%)" + } + }, + { + "id": "pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "platform" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 1 + ] + } + }, + { + "id": "street", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "street" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ] + } + }, + { + "id": "secondary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "secondary_link", + "trunk_link", + "tertiary", + "tertiary_link", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ] + } + }, + { + "id": "primary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ] + } + }, + { + "id": "motorway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffeba3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ] + } + }, + { + "id": "primary_bridge_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "bridge" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-color": "hsl(45, 73%, 72%)" + } + }, + { + "id": "primary_bridge", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "bridge" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ] + } + }, + { + "id": "building", + "type": "fill", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "building", + "filter": [ + "match", + [ + "get", + "type" + ], + [ + "roof" + ], + false, + true + ], + "layout": {}, + "paint": { + "fill-color": [ + "match", + [ + "get", + "type" + ], + [ + "store", + "retail", + "church", + "kiosk", + "civic", + "hotel", + "supermarket", + "pub", + "dormitory" + ], + "hsl(33, 100%, 96%)", + "#ededed" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 17, + 1 + ] + } + }, + { + "id": "building_border", + "type": "line", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "building", + "filter": [ + "match", + [ + "get", + "type" + ], + [ + "roof" + ], + false, + true + ], + "layout": {}, + "paint": { + "line-color": [ + "match", + [ + "get", + "type" + ], + [ + "store", + "retail", + "church", + "kiosk", + "civic", + "commercial", + "hotel", + "supermarket", + "pub" + ], + "#f8e1c7", + "#dcdcdc" + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 17, + 1 + ] + } + }, + { + "id": "building_3d", + "type": "fill-extrusion", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "building", + "filter": [ + "match", + [ + "get", + "extrude" + ], + [ + "true" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-extrusion-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + [ + "get", + "height" + ] + ], + "fill-extrusion-opacity": 0.3, + "fill-extrusion-color": "hsl(0, 0%, 93%)" + } + }, + { + "id": "admin_0", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + "match", + [ + "get", + "maritime" + ], + [ + "false" + ], + true, + false + ], + [ + "match", + [ + "get", + "admin_level" + ], + [ + 0 + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + true + ], + "hsl(0, 24%, 48%)", + "#787a7b" + ] + } + }, + { + "id": "admin_1", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + "match", + [ + "get", + "maritime" + ], + [ + "false" + ], + true, + false + ], + [ + "match", + [ + "get", + "admin_level" + ], + [ + 1 + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + true + ], + "hsl(0, 24%, 48%)", + "#787a7b" + ], + "line-dasharray": [ + 1, + 1 + ] + } + }, + { + "id": "river_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "natural_label", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "river" + ], + true, + false + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "symbol-placement": "line", + "symbol-spacing": 500, + "text-font": [ + "Roboto Regular" + ] + }, + "paint": { + "text-color": "#5083c1", + "text-halo-color": "#5083c1", + "text-halo-blur": 1 + } + }, + { + "id": "city_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-optional": true, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "left", + "text-offset": [ + 0.5, + 0.1 + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": "left", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "symbolrank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "right", + "text-offset": [ + -0.5, + 0.1 + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": "right", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "symbolrank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + 0, + 0.4 + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": "top", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "symbolrank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + 8, + "" + ], + "text-transform": [ + "step", + [ + "get", + "symbolrank" + ], + "none", + 15, + "uppercase" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0, + -0.2 + ] + ], + 8, + [ + "literal", + [ + 0, + 0 + ] + ] + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + "bottom", + 8, + "center" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "get", + "symbolrank" + ], + 0, + 0, + 8, + 0, + 12, + 0.1, + 16, + 0.2 + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "symbolrank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "park_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-size": 14 + }, + "paint": { + "text-color": "#297925", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "road-number-shield", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "ref" + ], + [ + "<=", + [ + "get", + "reflen" + ], + 6 + ] + ], + "layout": { + "text-size": 9, + "icon-image": [ + "case", + [ + "match", + [ + "get", + "shield" + ], + [ + "de-motorway", + "rectangle-green", + "rectangle-yellow", + "rectangle-white", + "rectangle-blue", + "rectangle-red", + "us-interstate" + ], + true, + false + ], + [ + "concat", + "shield_", + [ + "get", + "shield" + ], + "_", + [ + "get", + "reflen" + ] + ], + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + true, + false + ], + [ + "concat", + "shield_rectangle-blue_", + [ + "get", + "reflen" + ] + ], + [ + "concat", + "shield_rectangle-white_", + [ + "get", + "reflen" + ] + ] + ], + "icon-rotation-alignment": "viewport", + "text-font": [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + [ + "literal", + [ + "Roboto Bold" + ] + ], + [ + "black" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + [ + "literal", + [ + "Roboto Bold" + ] + ] + ], + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "text-offset": [ + 0, + 0.1 + ], + "text-rotation-alignment": "viewport", + "icon-size": 0.75, + "text-field": [ + "get", + "ref" + ], + "text-letter-spacing": 0.05 + }, + "paint": { + "text-color": [ + "case", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + true, + false + ], + "#ffffff", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "black" + ], + true, + false + ], + "hsl(0, 0%, 7%)", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "yellow" + ], + true, + false + ], + "hsl(50, 100%, 70%)", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "orange" + ], + true, + false + ], + "hsl(25, 100%, 75%)", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "blue" + ], + true, + false + ], + "hsl(230, 48%, 34%)", + "#ffffff" + ] + } + }, + { + "id": "country_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "country" + ], + true, + false + ], + "layout": { + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + 0, + 3, + 0.15 + ], + "text-font": [ + "Roboto Medium" + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 1, + 12, + 7, + [ + "/", + 100, + [ + "get", + "symbolrank" + ] + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": "hsl(0, 0%, 10%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1, + "text-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 6, + 1, + 7, + 0 + ] + } + }, + { + "id": "pedestrian_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "match", + [ + "get", + "type" + ], + [ + "platform" + ], + false, + true + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 17, + 10, + 22, + 14 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "#575757", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "street_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 6, + 16, + 10 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "#575757", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "secondary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "secondary_link", + "tertiary_link", + "tertiary", + "trunk_link", + "trunk" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 8, + 16, + 13 + ], + "symbol-spacing": 300, + "text-padding": 25 + }, + "paint": { + "text-color": "hsl(196, 0%, 34%)", + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-halo-blur": 1 + } + }, + { + "id": "primary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "primary_link" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 10, + 18, + 14 + ], + "symbol-spacing": 800, + "text-padding": 50 + }, + "paint": { + "text-color": "#6e481d", + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3.5 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-optional": true, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + 0.5 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "top", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "#c77d57", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 48%)", + [ + "bank", + "parking", + "parking-garage" + ], + "#737b9b", + [ + "hospital", + "doctor" + ], + "#a47172", + "#67747b" + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_above", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3.5 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-optional": true, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + -2 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "bottom", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "#c77d57", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 48%)", + [ + "bank", + "parking", + "parking-garage" + ], + "#737b9b", + [ + "hospital", + "doctor" + ], + "#a47172", + "#67747b" + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3.5 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "right", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + -1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + -1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "right", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "#c77d57", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 48%)", + [ + "bank", + "parking", + "parking-garage" + ], + "#737b9b", + [ + "hospital", + "doctor" + ], + "#a47172", + "#67747b" + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 3.5 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "left", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + 1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + 1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "left", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "#c77d57", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 48%)", + [ + "bank", + "parking", + "parking-garage" + ], + "#737b9b", + [ + "hospital", + "doctor" + ], + "#a47172", + "#67747b" + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + } + ], + "created": "2019-04-15T08:41:40.148Z", + "modified": "2020-09-05T19:42:03.856Z", + "id": "cjui4020201oo1fmca7yuwbor", + "owner": "microg", + "visibility": "public", + "protected": false, + "draft": false +} diff --git a/artwork/styles/style-microg-normal-openmaptiles.json b/artwork/styles/style-microg-normal-openmaptiles.json new file mode 100644 index 0000000..8c08fd4 --- /dev/null +++ b/artwork/styles/style-microg-normal-openmaptiles.json @@ -0,0 +1,4565 @@ +{ + "version": 8, + "name": "Mountain View Full", + "metadata": { + "mapbox:origin": "basic-template", + "mapbox:autocomposite": true, + "mapbox:type": "template", + "mapbox:sdk-support": { + "js": "0.50.0", + "android": "6.7.0", + "ios": "4.6.0" + }, + "mapbox:trackposition": false, + "mapbox:groups": { + "f51b507d2a17e572c70a5db74b0fec7e": { + "name": "Base", + "collapsed": false + }, + "3f48b8dc54ff2e6544b9ef9cedbf2990": { + "name": "Streets", + "collapsed": true + }, + "29bb589e8d1b9b402583363648b70302": { + "name": "Buildings", + "collapsed": true + }, + "3c26e9cbc75335c6f0ba8de5439cf1fa": { + "name": "Country borders", + "collapsed": true + }, + "7b44201d7f1682d99f7140188aff23ce": { + "name": "Labels", + "collapsed": true + }, + "24306bdccbff03e2ee08d5d1a4ca7312": { + "name": "Street name", + "collapsed": true + }, + "124a9d7a8e5226775d947c592110dfad": { + "name": "POI", + "collapsed": true + } + }, + "mapbox:uiParadigm": "layers", + "maputnik:renderer": "mbgljs" + }, + "center": [ + 12.819420849458652, + 50.03325860617235 + ], + "zoom": 3.315829104862067, + "bearing": 0, + "pitch": 1.5, + "light": { + "intensity": 0.5, + "color": "hsl(0, 0%, 100%)", + "anchor": "viewport" + }, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://tiles.stadiamaps.com/data/openmaptiles.json" + } + }, + "sprite": "asset://sprites", + "glyphs": "asset://{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "layout": { + "visibility": "visible" + }, + "paint": { + "background-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 4, + "hsl(43, 30%, 91%)", + 5, + "hsl(0, 0%, 96%)", + 8, + "hsl(0, 0%, 96%)", + 9, + "#efeee8", + 16, + "hsl(0, 0%, 95%)", + 18, + "#f8f9fb" + ] + } + }, + { + "id": "grass", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "grass" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 30%, 90%)", + 11, + "hsl(107, 30%, 94%)", + 12.5, + "hsl(107, 30%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "forrest", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "wood" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 42%, 86%)", + 11, + "hsl(107, 47%, 94%)", + 12.5, + "hsl(107, 47%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "national_park", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "park", + "filter": [ + "all" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(106, 58%, 85%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 11.5, + 0 + ] + } + }, + { + "id": "snow", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 6, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "ice" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#f9fafc" + } + }, + { + "id": "park", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "subclass" + ], + [ + "scrub", + "park" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#c1ecaf" + } + }, + { + "id": "pitch", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "pitch" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#c8efbb" + } + }, + { + "id": "landuse", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "school", + "hospital" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(202, 26%, 94%)" + } + }, + { + "id": "airport", + "type": "fill", + "source": "openmaptiles", + "source-layer": "aeroway", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(202, 26%, 94%)" + }, + "metadata": { + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "path", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill", + "maputnik:comment": "unpaved paths" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 14, + "maxzoom": 24, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 34%, 66%)", + "line-dasharray": [ + 4, + 2 + ] + } + }, + { + "id": "waterway-other", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "!in", + "class", + "canal", + "river", + "stream" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(206, 100%, 83%)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 2 + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "waterway-stream-canal", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "in", + "class", + "canal", + "stream" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(206, 100%, 83%)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "waterway-river", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "==", + "class", + "river" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(206, 100%, 83%)", + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.8 + ], + [ + 20, + 6 + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "water-offset", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "minzoom": 6, + "maxzoom": 8, + "filter": [ + "==", + "$type", + "Polygon" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(206, 100%, 83%)", + "fill-opacity": 1, + "fill-translate": { + "base": 1, + "stops": [ + [ + 6, + [ + 2, + 0 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "water", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(206, 100%, 83%)" + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "steps", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "subclass" + ], + [ + "steps" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 5%, 66%)", + "line-dasharray": [ + 1, + 1 + ], + "line-gap-width": 1 + } + }, + { + "id": "platform", + "type": "fill", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.rail", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "platform" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(2, 20%, 92%)", + 16, + "hsl(2, 95%, 92%)" + ], + "fill-outline-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(1, 10%, 76%)", + 16, + "hsl(1, 74%, 76%)" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0, + 16, + 1 + ] + } + }, + { + "id": "primary_tunnel_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brun" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 7, + 0, + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "#cbcccd" + } + }, + { + "id": "primary_tunnel", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "hsl(0, 0%, 89%)" + } + }, + { + "id": "aeroway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)" + } + }, + { + "id": "service_road", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "service" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)" + } + }, + { + "id": "pedestrian_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-color": "#e3e3e3", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 1 + ] + } + }, + { + "id": "street_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ], + "line-color": "#e3e3e3" + } + }, + { + "id": "secondary_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "ok" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ], + "line-color": "#e3e3e3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 1, + 20, + 2 + ] + } + }, + { + "id": "primary_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-color": "#ecd283" + } + }, + { + "id": "motorway_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ], + "line-color": "#ecd283", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15, + 2 + ] + } + }, + { + "id": "railway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "rail" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(220, 4%, 85%)" + } + }, + { + "id": "pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 1 + ] + } + }, + { + "id": "street", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ] + } + }, + { + "id": "secondary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ] + } + }, + { + "id": "primary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ] + } + }, + { + "id": "motorway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffeba3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ] + } + }, + { + "id": "primary_bridge_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-color": "hsl(45, 73%, 72%)" + } + }, + { + "id": "primary_bridge", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ] + } + }, + { + "id": "building", + "type": "fill", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "building", + "filter": [ + "all" + ], + "layout": {}, + "paint": { + "fill-color": "#ededed", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 17, + 1 + ] + } + }, + { + "id": "building_border", + "type": "line", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "#f8e1c7 for store, retail, church, kiosk, civic, commercial, hotel, supermarket, pub could not be ported (no appropriate metadata in `building` style spec)" + }, + "source": "openmaptiles", + "source-layer": "building", + "filter": [ + "all" + ], + "layout": {}, + "paint": { + "line-color": [ + "match", + [ + "get", + "type" + ], + [ + "store", + "retail", + "church", + "kiosk", + "civic", + "commercial", + "hotel", + "supermarket", + "pub" + ], + "#f8e1c7", + "#dcdcdc" + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 17, + 1 + ] + } + }, + { + "id": "building_3d", + "type": "fill-extrusion", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "building", + "filter": [ + "!=", + [ + "get", + "hide_3d" + ], + true + ], + "layout": {}, + "paint": { + "fill-extrusion-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + [ + "get", + "render_height" + ] + ], + "fill-extrusion-opacity": 0.3, + "fill-extrusion-color": "hsl(0, 0%, 93%)" + } + }, + { + "id": "admin_0", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "maritime=false filter could not be ported due to missing attributes in `boundary` layer" + }, + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "match", + [ + "get", + "admin_level" + ], + [ + 2 + ], + true, + false + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + 1 + ], + "hsl(0, 24%, 48%)", + "#787a7b" + ] + } + }, + { + "id": "admin_1", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "match", + [ + "get", + "admin_level" + ], + [ + 3, + 4 + ], + true, + false + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + 1 + ], + "hsl(0, 24%, 48%)", + "#787a7b" + ], + "line-dasharray": [ + 1, + 1 + ] + } + }, + { + "id": "river_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 13, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "river" + ], + true, + false + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "symbol-placement": "line", + "symbol-spacing": 500, + "text-font": [ + "Roboto Regular" + ] + }, + "paint": { + "text-color": "#5083c1", + "text-halo-color": "#5083c1", + "text-halo-blur": 1 + } + }, + { + "id": "city_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-optional": false, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "left", + "text-offset": [ + 0.5, + 0.1 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "left", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "right", + "text-offset": [ + -0.5, + 0.1 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "right", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + 0, + 0.4 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "top", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + 8, + "" + ], + "text-transform": [ + "step", + [ + "get", + "rank" + ], + "none", + 15, + "uppercase" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0, + -0.2 + ] + ], + 8, + [ + "literal", + [ + 0, + 0 + ] + ] + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + "bottom", + 8, + "center" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "get", + "rank" + ], + 0, + 0, + 8, + 0, + 12, + 0.1, + 16, + 0.2 + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "park_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 17, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-size": 14 + }, + "paint": { + "text-color": "#297925", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "road-number-shield", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "ref" + ], + [ + "<=", + [ + "get", + "ref_length" + ], + 6 + ] + ], + "layout": { + "text-size": 9, + "icon-image": [ + "case", + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ], + [ + "concat", + "shield_", + [ + "get", + "network" + ], + "_", + [ + "get", + "ref_length" + ] + ], + [ + "concat", + "shield_rectangle-white_", + [ + "get", + "ref_length" + ] + ] + ], + "icon-rotation-alignment": "viewport", + "text-font": [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + [ + "literal", + [ + "Roboto Bold" + ] + ], + [ + "black" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + [ + "literal", + [ + "Roboto Bold" + ] + ] + ], + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "text-offset": [ + 0, + 0.1 + ], + "text-rotation-alignment": "viewport", + "icon-size": 0.75, + "text-field": [ + "get", + "ref" + ], + "text-letter-spacing": 0.05, + "visibility": "visible", + "icon-padding": 10 + }, + "paint": { + "text-color": [ + "case", + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ], + "#ffffff", + "#000000" + ] + } + }, + { + "id": "country_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "country" + ], + true, + false + ], + "layout": { + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + 0, + 3, + 0.15 + ], + "text-font": [ + "Roboto Medium" + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 1, + 12, + 7, + [ + "/", + 30, + [ + "get", + "rank" + ] + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(0, 0%, 10%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1, + "text-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 6, + 1, + 7, + 0 + ] + } + }, + { + "id": "pedestrian_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 16, + "filter": [ + "any", + [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + [ + "match", + [ + "get", + "subclass" + ], + "platform", + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 17, + 10, + 22, + 14 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "#575757", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "street_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 6, + 16, + 10 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "#575757", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "secondary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 8, + 16, + 13 + ], + "symbol-spacing": 300, + "text-padding": 25 + }, + "paint": { + "text-color": "hsl(196, 0%, 34%)", + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-halo-blur": 1 + } + }, + { + "id": "primary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 10, + 18, + 14 + ], + "symbol-spacing": 800, + "text-padding": 50 + }, + "paint": { + "text-color": "#6e481d", + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-optional": false, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + 0.5 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "top", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_above", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-optional": false, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + -2 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "bottom", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "right", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + -1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + -1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "right", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "left", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + 1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + 1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "left", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + } + ], + "created": "2019-04-15T08:41:40.148Z", + "modified": "2020-09-05T19:42:03.856Z", + "id": "cjui4020201oo1fmca7yuwbor", + "owner": "microg", + "visibility": "public", + "protected": false, + "draft": false +} diff --git a/artwork/styles/style-microg-normal-stadia.json b/artwork/styles/style-microg-normal-stadia.json new file mode 100644 index 0000000..a540426 --- /dev/null +++ b/artwork/styles/style-microg-normal-stadia.json @@ -0,0 +1,4735 @@ +{ + "version": 8, + "name": "Mountain View Full", + "metadata": { + "mapbox:origin": "basic-template", + "mapbox:autocomposite": true, + "mapbox:type": "template", + "mapbox:sdk-support": { + "js": "0.50.0", + "android": "6.7.0", + "ios": "4.6.0" + }, + "mapbox:trackposition": false, + "mapbox:groups": { + "f51b507d2a17e572c70a5db74b0fec7e": { + "name": "Base", + "collapsed": false + }, + "3f48b8dc54ff2e6544b9ef9cedbf2990": { + "name": "Streets", + "collapsed": true + }, + "29bb589e8d1b9b402583363648b70302": { + "name": "Buildings", + "collapsed": true + }, + "3c26e9cbc75335c6f0ba8de5439cf1fa": { + "name": "Country borders", + "collapsed": true + }, + "7b44201d7f1682d99f7140188aff23ce": { + "name": "Labels", + "collapsed": true + }, + "24306bdccbff03e2ee08d5d1a4ca7312": { + "name": "Street name", + "collapsed": true + }, + "124a9d7a8e5226775d947c592110dfad": { + "name": "POI", + "collapsed": true + } + }, + "mapbox:uiParadigm": "layers", + "maputnik:renderer": "mbgljs" + }, + "center": [ + 12.819420849458652, + 50.03325860617235 + ], + "zoom": 3.315829104862067, + "bearing": 0, + "pitch": 1.5, + "light": { + "intensity": 0.5, + "color": "hsl(0, 0%, 100%)", + "anchor": "viewport" + }, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://tiles.stadiamaps.com/data/openmaptiles.json" + }, + "terrain": { + "type": "raster-dem", + "tiles": [ + "https://tiles.stadiamaps.com/data/terrarium/{z}/{x}/{y}.png" + ], + "minzoom": 0, + "maxzoom": 12, + "tileSize": 256, + "encoding": "terrarium" + }, + "global": { + "type": "vector", + "tiles": [ + "https://tiles.stadiamaps.com/data/global_landcover_v1/{z}/{x}/{y}.pbf" + ], + "minzoom": 0, + "maxzoom": 6 + } + }, + "sprite": "asset://sprites", + "glyphs": "asset://{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "layout": { + "visibility": "visible" + }, + "paint": { + "background-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 4, + "hsl(43, 30%, 91%)", + 5, + "hsl(0, 0%, 96%)", + 8, + "hsl(0, 0%, 96%)", + 9, + "#efeee8", + 16, + "hsl(0, 0%, 95%)", + 18, + "#f8f9fb" + ] + } + }, + { + "id": "global_grass", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill", + "maputnik:comment": "Stadia specific" + }, + "source": "global", + "source-layer": "global_landcover", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "grass" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 30%, 90%)", + 11, + "hsl(107, 30%, 94%)", + 12.5, + "hsl(107, 30%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "grass", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "grass" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 30%, 90%)", + 11, + "hsl(107, 30%, 94%)", + 12.5, + "hsl(107, 30%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "global_forest", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill", + "maputnik:comment": "Stadia specific" + }, + "source": "global", + "source-layer": "global_landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "wood" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 42%, 86%)", + 11, + "hsl(107, 47%, 94%)", + 12.5, + "hsl(107, 47%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "forrest", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "wood" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + "hsl(124, 42%, 86%)", + 11, + "hsl(107, 47%, 94%)", + 12.5, + "hsl(107, 47%, 94%)", + 13.5, + "hsl(45, 12%, 93%)" + ] + } + }, + { + "id": "national_park", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "park", + "filter": [ + "all" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(106, 58%, 85%)", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 11.5, + 0 + ] + } + }, + { + "id": "global_snow", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "global", + "source-layer": "global_landcover", + "minzoom": 0, + "maxzoom": 6, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "ice" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#f9fafc" + } + }, + { + "id": "snow", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 6, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "ice" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#f9fafc" + } + }, + { + "id": "hillshade", + "type": "hillshade", + "source": "terrain", + "maxzoom": 12, + "layout": { + "visibility": "visible" + }, + "paint": { + "hillshade-illumination-anchor": "viewport", + "hillshade-exaggeration": 0.1 + }, + "metadata": { + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "park", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "match", + [ + "get", + "subclass" + ], + [ + "scrub", + "park" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#c1ecaf" + } + }, + { + "id": "pitch", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.natural.terrain", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "pitch" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#c8efbb" + } + }, + { + "id": "landuse", + "type": "fill", + "metadata": { + "mapbox:group": "f51b507d2a17e572c70a5db74b0fec7e", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "school", + "hospital" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(202, 26%, 94%)" + } + }, + { + "id": "airport", + "type": "fill", + "source": "openmaptiles", + "source-layer": "aeroway", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(202, 26%, 94%)" + }, + "metadata": { + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "path", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill", + "maputnik:comment": "unpaved paths" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 14, + "maxzoom": 24, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 34%, 66%)", + "line-dasharray": [ + 4, + 2 + ] + } + }, + { + "id": "waterway-other", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "!in", + "class", + "canal", + "river", + "stream" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(206, 100%, 83%)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 2 + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "waterway-stream-canal", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "in", + "class", + "canal", + "stream" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(206, 100%, 83%)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "waterway-river", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "==", + "class", + "river" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(206, 100%, 83%)", + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.8 + ], + [ + 20, + 6 + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "water-offset", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "minzoom": 6, + "maxzoom": 8, + "filter": [ + "==", + "$type", + "Polygon" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(206, 100%, 83%)", + "fill-opacity": 1, + "fill-translate": { + "base": 1, + "stops": [ + [ + 6, + [ + 2, + 0 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + } + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "water", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(206, 100%, 83%)" + }, + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "steps", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "subclass" + ], + [ + "steps" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 5%, 66%)", + "line-dasharray": [ + 1, + 1 + ], + "line-gap-width": 1 + } + }, + { + "id": "platform", + "type": "fill", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.rail", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "platform" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(2, 20%, 92%)", + 16, + "hsl(2, 95%, 92%)" + ], + "fill-outline-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(1, 10%, 76%)", + 16, + "hsl(1, 74%, 76%)" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0, + 16, + 1 + ] + } + }, + { + "id": "primary_tunnel_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brun" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 7, + 0, + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "#cbcccd" + } + }, + { + "id": "primary_tunnel", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "hsl(0, 0%, 89%)" + } + }, + { + "id": "aeroway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)" + } + }, + { + "id": "service_road", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "service" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)" + } + }, + { + "id": "pedestrian_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-color": "#e3e3e3", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 1 + ] + } + }, + { + "id": "street_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ], + "line-color": "#e3e3e3" + } + }, + { + "id": "secondary_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "ok" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ], + "line-color": "#e3e3e3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 1, + 20, + 2 + ] + } + }, + { + "id": "primary_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-color": "#ecd283" + } + }, + { + "id": "motorway_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ], + "line-color": "#ecd283", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15, + 2 + ] + } + }, + { + "id": "railway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "any", + [ + "match", + [ + "get", + "class" + ], + [ + "rail" + ], + true, + false + ], + [ + "match", + [ + "get", + "subclass" + ], + [ + "light_rail", + "tram" + ], + true, + false + ] + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(220, 4%, 85%)" + } + }, + { + "id": "pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 1 + ] + } + }, + { + "id": "street", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ] + } + }, + { + "id": "secondary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ] + } + }, + { + "id": "primary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ] + } + }, + { + "id": "motorway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffeba3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ] + } + }, + { + "id": "primary_bridge_border", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-color": "hsl(45, 73%, 72%)" + } + }, + { + "id": "primary_bridge", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ] + } + }, + { + "id": "building", + "type": "fill", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "building", + "filter": [ + "all" + ], + "layout": {}, + "paint": { + "fill-color": "#ededed", + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 17, + 1 + ] + } + }, + { + "id": "building_border", + "type": "line", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "#f8e1c7 for store, retail, church, kiosk, civic, commercial, hotel, supermarket, pub could not be ported (no appropriate metadata in `building` style spec)" + }, + "source": "openmaptiles", + "source-layer": "building", + "filter": [ + "all" + ], + "layout": {}, + "paint": { + "line-color": [ + "match", + [ + "get", + "type" + ], + [ + "store", + "retail", + "church", + "kiosk", + "civic", + "commercial", + "hotel", + "supermarket", + "pub" + ], + "#f8e1c7", + "#dcdcdc" + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 17, + 1 + ] + } + }, + { + "id": "building_3d", + "type": "fill-extrusion", + "metadata": { + "mapbox:group": "29bb589e8d1b9b402583363648b70302", + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "building", + "filter": [ + "!=", + [ + "get", + "hide_3d" + ], + true + ], + "layout": {}, + "paint": { + "fill-extrusion-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + [ + "get", + "render_height" + ] + ], + "fill-extrusion-opacity": 0.3, + "fill-extrusion-color": "hsl(0, 0%, 93%)" + } + }, + { + "id": "admin_0", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "maritime=false filter could not be ported due to missing attributes in `boundary` layer" + }, + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "match", + [ + "get", + "admin_level" + ], + [ + 2 + ], + true, + false + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + 1 + ], + "hsl(0, 24%, 48%)", + "#787a7b" + ] + } + }, + { + "id": "admin_1", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "match", + [ + "get", + "admin_level" + ], + [ + 3, + 4 + ], + true, + false + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + 1 + ], + "hsl(0, 24%, 48%)", + "#787a7b" + ], + "line-dasharray": [ + 1, + 1 + ] + } + }, + { + "id": "river_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 13, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "river" + ], + true, + false + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "symbol-placement": "line", + "symbol-spacing": 500, + "text-font": [ + "Roboto Regular" + ] + }, + "paint": { + "text-color": "#5083c1", + "text-halo-color": "#5083c1", + "text-halo-blur": 1 + } + }, + { + "id": "city_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-optional": false, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "left", + "text-offset": [ + 0.5, + 0.1 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "left", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "right", + "text-offset": [ + -0.5, + 0.1 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "right", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + 0, + 0.4 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "top", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + 8, + "" + ], + "text-transform": [ + "step", + [ + "get", + "rank" + ], + "none", + 15, + "uppercase" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0, + -0.2 + ] + ], + 8, + [ + "literal", + [ + 0, + 0 + ] + ] + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + "bottom", + 8, + "center" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "get", + "rank" + ], + 0, + 0, + 8, + 0, + 12, + 0.1, + 16, + 0.2 + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "get", + "rank" + ], + 25 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 100%)", + "icon-opacity": 0.8 + } + }, + { + "id": "park_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 17, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-size": 14 + }, + "paint": { + "text-color": "#297925", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "road-number-shield", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "ref" + ], + [ + "<=", + [ + "get", + "ref_length" + ], + 6 + ] + ], + "layout": { + "text-size": 9, + "icon-image": [ + "case", + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ], + [ + "concat", + "shield_", + [ + "get", + "network" + ], + "_", + [ + "get", + "ref_length" + ] + ], + [ + "concat", + "shield_rectangle-white_", + [ + "get", + "ref_length" + ] + ] + ], + "icon-rotation-alignment": "viewport", + "text-font": [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + [ + "literal", + [ + "Roboto Bold" + ] + ], + [ + "black" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + [ + "literal", + [ + "Roboto Bold" + ] + ] + ], + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "text-offset": [ + 0, + 0.1 + ], + "text-rotation-alignment": "viewport", + "icon-size": 0.75, + "text-field": [ + "get", + "ref" + ], + "text-letter-spacing": 0.05, + "visibility": "visible", + "icon-padding": 10 + }, + "paint": { + "text-color": [ + "case", + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ], + "#ffffff", + "#000000" + ] + } + }, + { + "id": "country_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "country" + ], + true, + false + ], + "layout": { + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + 0, + 3, + 0.15 + ], + "text-font": [ + "Roboto Medium" + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 1, + 12, + 7, + [ + "/", + 30, + [ + "get", + "rank" + ] + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(0, 0%, 10%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1, + "text-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 6, + 1, + 7, + 0 + ] + } + }, + { + "id": "pedestrian_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 16, + "filter": [ + "any", + [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + [ + "match", + [ + "get", + "subclass" + ], + "platform", + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 17, + 10, + 22, + 14 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "#575757", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "street_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 6, + 16, + 10 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "#575757", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "secondary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 8, + 16, + 13 + ], + "symbol-spacing": 300, + "text-padding": 25 + }, + "paint": { + "text-color": "hsl(196, 0%, 34%)", + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-halo-blur": 1 + } + }, + { + "id": "primary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 10, + 18, + 14 + ], + "symbol-spacing": 800, + "text-padding": 50 + }, + "paint": { + "text-color": "#6e481d", + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-optional": false, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + 0.5 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "top", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_above", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-optional": false, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + -2 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "bottom", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "right", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + -1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + -1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "right", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "left", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + 1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + 1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "left", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 31%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "#737b9b", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "#c77d57", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 44%)", + [ + "hospital", + "doctors" + ], + "#a47172", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 48%)", + "#67747b" + ] + ], + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + } + ], + "created": "2019-04-15T08:41:40.148Z", + "modified": "2020-09-05T19:42:03.856Z", + "id": "cjui4020201oo1fmca7yuwbor", + "owner": "microg", + "visibility": "public", + "protected": false, + "draft": false +} diff --git a/artwork/styles/style-microg-satellite-mapbox.json b/artwork/styles/style-microg-satellite-mapbox.json new file mode 100644 index 0000000..accb627 --- /dev/null +++ b/artwork/styles/style-microg-satellite-mapbox.json @@ -0,0 +1,3489 @@ +{ + "version": 8, + "name": "Mountain View Satellite", + "metadata": { + "mapbox:origin": "basic-template", + "mapbox:autocomposite": true, + "mapbox:type": "template", + "mapbox:sdk-support": { + "js": "0.50.0", + "android": "6.7.0", + "ios": "4.6.0" + }, + "mapbox:trackposition": false, + "mapbox:groups": { + "f51b507d2a17e572c70a5db74b0fec7e": { + "name": "Base", + "collapsed": true + }, + "3f48b8dc54ff2e6544b9ef9cedbf2990": { + "name": "Streets", + "collapsed": false + }, + "29bb589e8d1b9b402583363648b70302": { + "name": "Buildings", + "collapsed": true + }, + "3c26e9cbc75335c6f0ba8de5439cf1fa": { + "name": "Country borders", + "collapsed": true + }, + "7b44201d7f1682d99f7140188aff23ce": { + "name": "Labels", + "collapsed": true + }, + "24306bdccbff03e2ee08d5d1a4ca7312": { + "name": "Street name", + "collapsed": false + }, + "124a9d7a8e5226775d947c592110dfad": { + "name": "POI", + "collapsed": true + } + }, + "mapbox:uiParadigm": "layers" + }, + "center": [ + 12.819420849458652, + 50.03325860617235 + ], + "zoom": 3.315829104862067, + "bearing": 0, + "pitch": 1.5, + "light": { + "intensity": 0.5, + "color": "hsl(0, 0%, 0%)" + }, + "sources": { + "mapbox://mapbox.satellite": { + "url": "mapbox://mapbox.satellite", + "type": "raster", + "tileSize": 256 + }, + "composite": { + "url": "mapbox://mapbox.mapbox-streets-v8,mapbox.mapbox-terrain-v2", + "type": "vector" + } + }, + "sprite": "mapbox://sprites/microg/cjxgloted25ap1ct4uex7m6hi/8fkcj5fgn4mftlzuak3guz1f9", + "glyphs": "mapbox://fonts/microg/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "raster", + "source": "mapbox://mapbox.satellite", + "layout": {}, + "paint": {}, + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "path", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ], + [ + "match", + [ + "get", + "type" + ], + [ + "platform", + "steps" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 34%, 66%)", + "line-dasharray": [ + 4, + 2 + ], + "line-opacity": 0.3 + } + }, + { + "id": "steps", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ], + [ + "match", + [ + "get", + "type" + ], + [ + "steps" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 5%, 66%)", + "line-dasharray": [ + 1, + 1 + ], + "line-gap-width": 1, + "line-opacity": 0.3 + } + }, + { + "id": "platform", + "type": "fill", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.rail", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "type" + ], + [ + "platform" + ], + true, + false + ], + "layout": {}, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(2, 20%, 92%)", + 16, + "hsl(2, 95%, 92%)" + ], + "fill-outline-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(1, 10%, 76%)", + 16, + "hsl(1, 74%, 76%)" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0, + 16, + 0.3 + ] + } + }, + { + "id": "primary_tunnel", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "hsl(0, 0%, 89%)", + "line-opacity": 0.3 + } + }, + { + "id": "aeroway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "aeroway", + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)", + "line-opacity": 0.3 + } + }, + { + "id": "service_road", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "service" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)", + "line-opacity": 0.3 + } + }, + { + "id": "railway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "major_rail", + "minor_rail", + "service_rail" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(220, 4%, 85%)", + "line-opacity": 0.3 + } + }, + { + "id": "pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "type" + ], + [ + "platform" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 0.3 + ] + } + }, + { + "id": "street", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "street" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ], + "line-opacity": 0.3 + } + }, + { + "id": "secondary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "secondary_link", + "trunk_link", + "tertiary", + "tertiary_link", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ], + "line-opacity": 0.3 + } + }, + { + "id": "primary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "primary", + "motorway_link" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-opacity": 0.3 + } + }, + { + "id": "motorway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(47, 100%, 82%)", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ], + "line-opacity": 0.3 + } + }, + { + "id": "admin_0", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + "match", + [ + "get", + "maritime" + ], + [ + "false" + ], + true, + false + ], + [ + "match", + [ + "get", + "admin_level" + ], + [ + 0 + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + true + ], + "hsl(0, 24%, 85%)", + "hsl(200, 1%, 85%)" + ] + } + }, + { + "id": "admin_1", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + "match", + [ + "get", + "maritime" + ], + [ + "false" + ], + true, + false + ], + [ + "match", + [ + "get", + "admin_level" + ], + [ + 1 + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + true + ], + "hsl(0, 24%, 85%)", + "hsl(200, 1%, 85%)" + ], + "line-dasharray": [ + 1, + 1 + ] + } + }, + { + "id": "river_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "natural_label", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "river" + ], + true, + false + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "symbol-placement": "line", + "symbol-spacing": 500, + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ] + }, + "paint": { + "text-color": "#5083c1", + "text-halo-color": "#5083c1", + "text-halo-blur": 1 + } + }, + { + "id": "city_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-optional": true, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium", + "Arial Unicode MS Regular" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular", + "Arial Unicode MS Regular" + ] + ] + ], + "text-justify": "left", + "text-offset": [ + 0.5, + 0.1 + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": "left", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "-", + 100, + [ + "get", + "symbolrank" + ] + ], + 5 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "icon-opacity": 0.8, + "text-halo-color": "hsl(0, 1%, 0%)" + } + }, + { + "id": "city_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium", + "Arial Unicode MS Regular" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular", + "Arial Unicode MS Regular" + ] + ] + ], + "text-justify": "right", + "text-offset": [ + -0.5, + 0.1 + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": "right", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "-", + 100, + [ + "get", + "symbolrank" + ] + ], + 5 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "icon-opacity": 0.8, + "text-halo-color": "hsl(0, 1%, 0%)" + } + }, + { + "id": "city_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium", + "Arial Unicode MS Regular" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular", + "Arial Unicode MS Regular" + ] + ] + ], + "text-offset": [ + 0, + 0.4 + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": "top", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "-", + 100, + [ + "get", + "symbolrank" + ] + ], + 5 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "icon-opacity": 0.8, + "text-halo-color": "hsl(0, 1%, 0%)" + } + }, + { + "id": "city_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "filter": [ + "all", + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "settlement", + "settlement_subdivision" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "symbolrank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "symbolrank" + ], + 4 + ] + ] + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + [ + 0, + 2 + ], + "capital", + "city" + ], + 8, + "" + ], + "text-transform": [ + "step", + [ + "get", + "symbolrank" + ], + "none", + 15, + "uppercase" + ], + "text-font": [ + "step", + [ + "get", + "symbolrank" + ], + [ + "literal", + [ + "Roboto Medium", + "Arial Unicode MS Regular" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular", + "Arial Unicode MS Regular" + ] + ] + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0, + -0.2 + ] + ], + 8, + [ + "literal", + [ + 0, + 0 + ] + ] + ], + "icon-size": [ + "/", + 5, + [ + "get", + "symbolrank" + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + "bottom", + 8, + "center" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "get", + "symbolrank" + ], + 0, + 0, + 8, + 0, + 12, + 0.1, + 16, + 0.2 + ] + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "*", + [ + "get", + "symbolrank" + ], + 2 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "+", + [ + "-", + 100, + [ + "get", + "symbolrank" + ] + ], + 5 + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "icon-opacity": 0.8, + "text-halo-color": "hsl(0, 1%, 0%)" + } + }, + { + "id": "park_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-size": 14 + }, + "paint": { + "text-color": "#297925", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "road-number-shield", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.icon" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "ref" + ], + [ + "<=", + [ + "get", + "reflen" + ], + 6 + ] + ], + "layout": { + "text-size": 9, + "icon-image": [ + "case", + [ + "match", + [ + "get", + "shield" + ], + [ + "de-motorway", + "rectangle-green", + "rectangle-yellow", + "rectangle-white", + "rectangle-blue", + "rectangle-red", + "us-interstate" + ], + true, + false + ], + [ + "concat", + "shield_", + [ + "get", + "shield" + ], + "_", + [ + "get", + "reflen" + ] + ], + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + true, + false + ], + [ + "concat", + "shield_rectangle-blue_", + [ + "get", + "reflen" + ] + ], + [ + "concat", + "shield_rectangle-white_", + [ + "get", + "reflen" + ] + ] + ], + "icon-rotation-alignment": "viewport", + "text-font": [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + [ + "literal", + [ + "DIN Offc Pro Bold", + "Arial Unicode MS Regular" + ] + ], + [ + "black" + ], + [ + "literal", + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ], + [ + "literal", + [ + "DIN Offc Pro Bold", + "Arial Unicode MS Regular" + ] + ] + ], + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "text-rotation-alignment": "viewport", + "icon-size": 0.75, + "text-field": [ + "get", + "ref" + ], + "text-letter-spacing": 0.05 + }, + "paint": { + "text-color": [ + "case", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + true, + false + ], + "#ffffff", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "black" + ], + true, + false + ], + "hsl(0, 0%, 7%)", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "yellow" + ], + true, + false + ], + "hsl(50, 100%, 70%)", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "orange" + ], + true, + false + ], + "hsl(25, 100%, 75%)", + [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "blue" + ], + true, + false + ], + "hsl(230, 48%, 34%)", + "#ffffff" + ] + } + }, + { + "id": "country_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "place_label", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "country" + ], + true, + false + ], + "layout": { + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + 0, + 3, + 0.15 + ], + "text-font": [ + "Roboto Medium", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 1, + 12, + 7, + [ + "/", + 100, + [ + "get", + "symbolrank" + ] + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 6, + 1, + 7, + 0 + ], + "text-color": "hsl(0, 0%, 90%)", + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 1%, 0%)" + } + }, + { + "id": "pedestrian_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "match", + [ + "get", + "type" + ], + [ + "platform" + ], + false, + true + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 17, + 10, + 22, + 14 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "hsl(0, 0%, 86%)", + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "street_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 6, + 16, + 10 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "hsl(0, 0%, 86%)", + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "secondary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "secondary_link", + "tertiary_link", + "tertiary", + "trunk_link", + "trunk" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 8, + 16, + 13 + ], + "symbol-spacing": 300, + "text-padding": 25 + }, + "paint": { + "text-color": "hsl(196, 0%, 86%)", + "text-halo-width": 1, + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-blur": 1 + } + }, + { + "id": "primary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "primary_link" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 10, + 18, + 14 + ], + "symbol-spacing": 800, + "text-padding": 50 + }, + "paint": { + "text-color": "hsl(32, 58%, 93%)", + "text-halo-width": 1, + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-optional": true, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-offset": [ + 0, + 0.5 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "top", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "hsl(20, 50%, 65%)", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 65%)", + [ + "bank", + "parking", + "parking-garage" + ], + "hsl(228, 17%, 65%)", + [ + "hospital", + "doctor" + ], + "hsl(359, 22%, 65%)", + "hsl(201, 9%, 80%)" + ], + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_above", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-optional": true, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-offset": [ + 0, + -2 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "bottom", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "hsl(20, 50%, 65%)", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 65%)", + [ + "bank", + "parking", + "parking-garage" + ], + "hsl(228, 17%, 65%)", + [ + "hospital", + "doctor" + ], + "hsl(359, 22%, 65%)", + "hsl(201, 9%, 80%)" + ], + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-justify": "right", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + -1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + -1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "right", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "hsl(20, 50%, 65%)", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 65%)", + [ + "bank", + "parking", + "parking-garage" + ], + "hsl(228, 17%, 65%)", + [ + "hospital", + "doctor" + ], + "hsl(359, 22%, 65%)", + "hsl(201, 9%, 80%)" + ], + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "<=", + [ + "get", + "filterrank" + ], + [ + "/", + [ + "zoom" + ], + 4 + ] + ], + [ + "!", + [ + "all", + [ + "match", + [ + "get", + "maki" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "sizerank" + ], + 10 + ] + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "lodging", + "theatre", + "grocery", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "maki" + ] + ], + [ + "fitness-centre", + "golf", + "campsite", + "bowling-alley", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "stadium", + "dog-park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "parking", + "parking-garage" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "alcohol-shop", + "shop", + "shoe", + "convenience", + "clothing-store", + "jewelry-store" + ], + "poi_generic_blue", + [ + "casino", + "castle", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctor" + ], + "poi_generic_red", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant-noodle", + "fast-food", + "ice-cream" + ], + "poi_restaurant", + "poi_generic" + ], + "text-font": [ + "Roboto Regular", + "Arial Unicode MS Regular" + ], + "text-justify": "left", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + 1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + 1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "left", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "maki" + ], + [ + "museum", + "casino", + "castle", + "theatre", + "art-gallery", + "attraction", + "cinema", + "music", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "lodging" + ], + "#df7db1", + [ + "fitness-centre", + "golf", + "campsite", + "park", + "garden", + "farm", + "picnic-site", + "zoo", + "dog-park", + "stadium", + "bowling-alley", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "restaurant-pizza", + "restaurant-seafood", + "restaurant", + "restaurant-noodle", + "bar", + "cafe", + "fast-food", + "bakery", + "ice-cream" + ], + "hsl(20, 50%, 65%)", + [ + "shop", + "shoe", + "alcohol-shop", + "convenience", + "grocery", + "clothing-store", + "jewelry-store" + ], + "hsl(213, 40%, 65%)", + [ + "bank", + "parking", + "parking-garage" + ], + "hsl(228, 17%, 65%)", + [ + "hospital", + "doctor" + ], + "hsl(359, 22%, 65%)", + "hsl(201, 9%, 80%)" + ], + "text-halo-color": "hsl(0, 1%, 0%)", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + } + ], + "created": "2019-06-28T21:20:23.628Z", + "modified": "2020-09-05T20:08:11.990Z", + "id": "cjxgloted25ap1ct4uex7m6hi", + "owner": "microg", + "visibility": "public", + "protected": false, + "draft": false +} diff --git a/artwork/styles/style-microg-satellite-stadia.json b/artwork/styles/style-microg-satellite-stadia.json new file mode 100644 index 0000000..ed9cc17 --- /dev/null +++ b/artwork/styles/style-microg-satellite-stadia.json @@ -0,0 +1,3632 @@ +{ + "version": 8, + "name": "Mountain View Full", + "metadata": { + "mapbox:origin": "basic-template", + "mapbox:autocomposite": true, + "mapbox:type": "template", + "mapbox:sdk-support": { + "js": "0.50.0", + "android": "6.7.0", + "ios": "4.6.0" + }, + "mapbox:trackposition": false, + "mapbox:groups": { + "f51b507d2a17e572c70a5db74b0fec7e": { + "name": "Base", + "collapsed": false + }, + "3f48b8dc54ff2e6544b9ef9cedbf2990": { + "name": "Streets", + "collapsed": true + }, + "29bb589e8d1b9b402583363648b70302": { + "name": "Buildings", + "collapsed": true + }, + "3c26e9cbc75335c6f0ba8de5439cf1fa": { + "name": "Country borders", + "collapsed": true + }, + "7b44201d7f1682d99f7140188aff23ce": { + "name": "Labels", + "collapsed": true + }, + "24306bdccbff03e2ee08d5d1a4ca7312": { + "name": "Street name", + "collapsed": true + }, + "124a9d7a8e5226775d947c592110dfad": { + "name": "POI", + "collapsed": true + } + }, + "mapbox:uiParadigm": "layers", + "maputnik:renderer": "mbgljs" + }, + "center": [ + 12.819420849458652, + 50.03325860617235 + ], + "zoom": 3.315829104862067, + "bearing": 0, + "pitch": 1.5, + "light": { + "intensity": 0.5, + "color": "hsl(0, 0%, 100%)", + "anchor": "viewport" + }, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://tiles.stadiamaps.com/data/openmaptiles.json" + }, + "satellite": { + "attribution": "© CNES, Distribution Airbus DS, © Airbus DS, © PlanetObserver (Contains Copernicus Data)", + "type": "raster", + "tiles": [ + "https://tiles.stadiamaps.com/data/satellite/{z}/{x}/{y}.jpg" + ], + "minzoom": 0, + "maxzoom": 24 + } + }, + "sprite": "asset://sprites", + "glyphs": "asset://{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "layout": { + "visibility": "visible" + }, + "paint": { + "background-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 4, + "hsl(43, 30%, 91%)", + 5, + "hsl(0, 0%, 96%)", + 8, + "hsl(0, 0%, 96%)", + 9, + "#efeee8", + 16, + "hsl(0, 0%, 95%)", + 18, + "#f8f9fb" + ] + } + }, + { + "id": "satellite", + "type": "raster", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + }, + "source": "satellite" + }, + { + "id": "path", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill", + "maputnik:comment": "unpaved paths" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 14, + "maxzoom": 24, + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "path" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 34%, 66%)", + "line-dasharray": [ + 4, + 2 + ], + "line-opacity": 0.3 + } + }, + { + "id": "steps", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "subclass" + ], + [ + "steps" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsl(118, 5%, 66%)", + "line-dasharray": [ + 1, + 1 + ], + "line-gap-width": 1, + "line-opacity": 0.3 + } + }, + { + "id": "platform", + "type": "fill", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.rail", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "platform" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(2, 20%, 92%)", + 16, + "hsl(2, 95%, 92%)" + ], + "fill-outline-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + "hsl(1, 10%, 76%)", + 16, + "hsl(1, 74%, 76%)" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0, + 16, + 0.3 + ] + } + }, + { + "id": "primary_tunnel", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + true, + false + ] + ], + "layout": {}, + "paint": { + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 4, + 14, + 6, + 16, + 10, + 22, + 64 + ], + "line-color": "hsl(0, 0%, 89%)", + "line-opacity": 0.3 + } + }, + { + "id": "aeroway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)", + "line-opacity": 0.3 + } + }, + { + "id": "service_road", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "service" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "hsla(0, 0%, 0%, 0.1)", + "line-opacity": 0.3 + } + }, + { + "id": "railway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "any", + [ + "match", + [ + "get", + "class" + ], + [ + "rail" + ], + true, + false + ], + [ + "match", + [ + "get", + "subclass" + ], + [ + "light_rail", + "tram" + ], + true, + false + ] + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(220, 4%, 85%)", + "line-opacity": 0.3 + } + }, + { + "id": "pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 1, + 16, + 4, + 22, + 32 + ], + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12.5, + 0, + 13.5, + 0.3 + ] + } + }, + { + "id": "street", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1, + 16, + 6, + 22, + 40 + ], + "line-opacity": 0.3 + } + }, + { + "id": "secondary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffffff", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1, + 17, + 10, + 22, + 48 + ], + "line-opacity": 0.3 + } + }, + { + "id": "primary", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "tunnel" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": [ + "step", + [ + "zoom" + ], + "hsl(50, 100%, 75%)", + 7, + "hsl(50, 100%, 85%)" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 1, + 16, + 8, + 22, + 64 + ], + "line-opacity": 0.3 + } + }, + { + "id": "motorway", + "type": "line", + "metadata": { + "mapbox:group": "3f48b8dc54ff2e6544b9ef9cedbf2990", + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway" + ], + true, + false + ], + "layout": {}, + "paint": { + "line-color": "#ffeba3", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 15.5, + 8, + 22, + 78 + ], + "line-opacity": 0.3 + } + }, + { + "id": "admin_0", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke", + "maputnik:comment": "maritime=false filter could not be ported due to missing attributes in `boundary` layer" + }, + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "match", + [ + "get", + "admin_level" + ], + [ + 2 + ], + true, + false + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + 1 + ], + "hsl(0, 24%, 48%)", + "hsl(200, 0%, 80%)" + ] + } + }, + { + "id": "admin_1", + "type": "line", + "metadata": { + "mapbox:group": "3c26e9cbc75335c6f0ba8de5439cf1fa", + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + }, + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "match", + [ + "get", + "admin_level" + ], + [ + 3, + 4 + ], + true, + false + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "case", + [ + "==", + [ + "get", + "disputed" + ], + 1 + ], + "hsl(0, 24%, 48%)", + "hsl(200, 0%, 80%)" + ], + "line-dasharray": [ + 1, + 1 + ] + } + }, + { + "id": "river_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 13, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "river" + ], + true, + false + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "symbol-placement": "line", + "symbol-spacing": 500, + "text-font": [ + "Roboto Regular" + ] + }, + "paint": { + "text-color": "#5083c1", + "text-halo-color": "#5083c1", + "text-halo-blur": 1 + } + }, + { + "id": "city_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-optional": false, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "left", + "text-offset": [ + 0.5, + 0.1 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "left", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "get", + "rank" + ], + 25 + ] + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 0%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-justify": "right", + "text-offset": [ + -0.5, + 0.1 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "right", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "get", + "rank" + ], + 25 + ] + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 1%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "/", + [ + "zoom" + ], + 3 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + 0, + 0.4 + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": "top", + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "get", + "rank" + ], + 25 + ] + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 0%)", + "icon-opacity": 0.8 + } + }, + { + "id": "city_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "<=", + [ + "get", + "rank" + ], + [ + "*", + [ + "zoom" + ], + 1.5 + ] + ], + [ + "match", + [ + "get", + "class" + ], + [ + "city", + "town", + "village", + "hamlet", + "suburb", + "quarter", + "neighbourhood" + ], + true, + false + ] + ], + "layout": { + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "-", + 14, + [ + "max", + 0, + [ + "-", + [ + "get", + "rank" + ], + 8 + ] + ] + ], + 22, + [ + "-", + 20, + [ + "/", + [ + "get", + "rank" + ], + 4 + ] + ] + ], + "icon-image": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "capital" + ], + [ + 2 + ], + "capital", + "city" + ], + 8, + "" + ], + "text-transform": [ + "step", + [ + "get", + "rank" + ], + "none", + 15, + "uppercase" + ], + "text-font": [ + "step", + [ + "get", + "rank" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + 10, + [ + "literal", + [ + "Roboto Regular" + ] + ] + ], + "text-offset": [ + "step", + [ + "zoom" + ], + [ + "literal", + [ + 0, + -0.2 + ] + ], + 8, + [ + "literal", + [ + 0, + 0 + ] + ] + ], + "icon-size": [ + "/", + 6, + [ + "+", + [ + "get", + "rank" + ], + 7 + ] + ], + "text-anchor": [ + "step", + [ + "zoom" + ], + "bottom", + 8, + "center" + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "get", + "rank" + ], + 0, + 0, + 8, + 0, + 12, + 0.1, + 16, + 0.2 + ], + "visibility": "visible" + }, + "paint": { + "text-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "*", + [ + "get", + "rank" + ], + 2 + ], + 5 + ] + ], + "%)" + ], + 22, + [ + "concat", + "hsl(213, 11%, ", + [ + "-", + 100, + [ + "+", + [ + "get", + "rank" + ], + 25 + ] + ], + "%)" + ] + ], + "text-halo-width": 1, + "text-halo-blur": 1, + "text-halo-color": "hsl(0, 0%, 0%)", + "icon-opacity": 0.8 + } + }, + { + "id": "park_name", + "type": "symbol", + "metadata": { + "mapbox:group": "7b44201d7f1682d99f7140188aff23ce", + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 17, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + "layout": { + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-size": 14 + }, + "paint": { + "text-color": "#297925", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "road-number-shield", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road", + "microg:gms-type-element": "labels.icon" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "ref" + ], + [ + "<=", + [ + "get", + "ref_length" + ], + 6 + ] + ], + "layout": { + "text-size": 9, + "icon-image": [ + "case", + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ], + [ + "concat", + "shield_", + [ + "get", + "network" + ], + "_", + [ + "get", + "ref_length" + ] + ], + [ + "concat", + "shield_rectangle-white_", + [ + "get", + "ref_length" + ] + ] + ], + "icon-rotation-alignment": "viewport", + "text-font": [ + "match", + [ + "get", + "shield_text_color" + ], + [ + "white" + ], + [ + "literal", + [ + "Roboto Bold" + ] + ], + [ + "black" + ], + [ + "literal", + [ + "Roboto Medium" + ] + ], + [ + "literal", + [ + "Roboto Bold" + ] + ] + ], + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "text-offset": [ + 0, + 0.1 + ], + "text-rotation-alignment": "viewport", + "icon-size": 0.75, + "text-field": [ + "get", + "ref" + ], + "text-letter-spacing": 0.05, + "visibility": "visible", + "icon-padding": 10 + }, + "paint": { + "text-color": [ + "case", + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ], + "#ffffff", + "#000000" + ] + } + }, + { + "id": "country_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "country" + ], + true, + false + ], + "layout": { + "text-letter-spacing": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + 0, + 3, + 0.15 + ], + "text-font": [ + "Roboto Medium" + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 1, + 12, + 7, + [ + "/", + 30, + [ + "get", + "rank" + ] + ] + ], + "text-field": [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(0, 0%, 90%)", + "text-halo-color": "hsl(0, 0%, 0%)", + "text-halo-width": 1, + "text-halo-blur": 1, + "text-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 6, + 1, + 7, + 0 + ] + } + }, + { + "id": "pedestrian_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 16, + "filter": [ + "any", + [ + "all", + [ + "match", + [ + "get", + "subclass" + ], + [ + "pedestrian" + ], + true, + false + ], + [ + "==", + [ + "get", + "surface" + ], + "paved" + ] + ], + [ + "match", + [ + "get", + "subclass" + ], + "platform", + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 17, + 10, + 22, + 14 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "hsl(0, 0%, 86%)", + "text-halo-color": "#000000", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "street_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 6, + 16, + 10 + ], + "text-padding": 5 + }, + "paint": { + "text-color": "hsl(0, 0%, 86%)", + "text-halo-color": "#000000", + "text-halo-width": 1, + "text-halo-blur": 1 + } + }, + { + "id": "secondary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 8, + 16, + 13 + ], + "symbol-spacing": 300, + "text-padding": 25 + }, + "paint": { + "text-color": "hsl(0, 0%, 86%)", + "text-halo-width": 1, + "text-halo-color": "#000000", + "text-halo-blur": 1 + } + }, + { + "id": "primary_name", + "type": "symbol", + "metadata": { + "mapbox:group": "24306bdccbff03e2ee08d5d1a4ca7312", + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.text" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary" + ], + true, + false + ] + ], + "layout": { + "text-field": [ + "get", + "name" + ], + "symbol-placement": "line", + "text-font": [ + "Roboto Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 10, + 18, + 14 + ], + "symbol-spacing": 800, + "text-padding": 50 + }, + "paint": { + "text-color": "hsl(32, 58%, 93%)", + "text-halo-width": 1, + "text-halo-color": "#000000", + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_below", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-optional": false, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + 0.5 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "top", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "hsl(228, 17%, 65%)", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "hsl(20, 50%, 65%)", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "hospital", + "doctors" + ], + "hsl(359, 22%, 65%)", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 65%)", + "hsl(201, 9%, 80%)" + ] + ], + "text-halo-color": "#000000", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_above", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-optional": false, + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-offset": [ + 0, + -2 + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "bottom", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "hsl(228, 17%, 65%)", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "hsl(20, 50%, 65%)", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "hospital", + "doctors" + ], + "hsl(359, 22%, 65%)", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 65%)", + "hsl(201, 9%, 80%)" + ] + ], + "text-halo-color": "#000000", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_left", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "right", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + -1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + -1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "right", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "hsl(228, 17%, 65%)", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "hsl(20, 50%, 65%)", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "hospital", + "doctors" + ], + "hsl(359, 22%, 65%)", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 65%)", + "hsl(201, 9%, 80%)" + ] + ], + "text-halo-color": "#000000", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + }, + { + "id": "poi_label_right", + "type": "symbol", + "metadata": { + "mapbox:group": "124a9d7a8e5226775d947c592110dfad", + "microg:gms-type-element": "labels.text", + "microg:gms-type-feature": "poi" + }, + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "has", + "name" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "bus", + "railway" + ], + false, + true + ], + [ + "any", + [ + "!=", + [ + "match", + [ + "get", + "class" + ], + [ + "park", + "cemetery" + ], + true, + false + ], + [ + "<=", + [ + "get", + "rank" + ], + 250 + ] + ], + [ + ">=", + [ + "zoom" + ], + 16 + ] + ] + ], + "layout": { + "text-line-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 15, + 1.2 + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 13, + 15, + 14 + ], + "icon-offset": [ + 0, + -36 + ], + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "museum", + "theatre", + "restaurant" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "poi_generic_green", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "poi_generic_purple", + [ + "bar", + "cafe", + "bakery" + ], + "poi_generic_orange", + [ + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "poi_generic_teal", + [ + "hospital", + "doctors" + ], + "poi_generic_red", + [ + "fast_food", + "ice_cream" + ], + "poi_restaurant", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging", + "grocery" + ], + [ + "concat", + "poi_", + [ + "get", + "class" + ] + ], + [ + "clothing_store", + "shop" + ], + "poi_generic_blue", + "poi_generic" + ] + ], + "text-font": [ + "Roboto Regular" + ], + "text-justify": "left", + "text-offset": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + [ + "literal", + [ + 1.1, + -0.7 + ] + ], + 15, + [ + "literal", + [ + 1.1, + -0.9 + ] + ] + ], + "icon-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 0.25, + 15, + 0.32 + ], + "text-anchor": "left", + "text-field": [ + "to-string", + [ + "get", + "name" + ] + ], + "text-padding": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 30, + 17, + 5 + ] + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "subclass" + ], + [ + "fitness_centre", + "golf_course", + "camp_site", + "bowling_alley", + "park", + "garden", + "farm", + "picnic_site", + "zoo", + "stadium", + "dog_park", + "pitch", + "cemetery" + ], + "hsl(117, 53%, 65%)", + [ + "bank", + "atm", + "parking", + "toilets", + "garages" + ], + "hsl(228, 17%, 65%)", + [ + "bar", + "cafe", + "bakery", + "fast_food", + "restaurant", + "ice_cream" + ], + "hsl(20, 50%, 65%)", + [ + "museum", + "theatre", + "casino", + "castle", + "gallery", + "attraction", + "cinema", + "music_venue", + "monument" + ], + "hsl(186, 78%, 65%)", + [ + "hospital", + "doctors" + ], + "hsl(359, 22%, 65%)", + [ + "match", + [ + "get", + "class" + ], + [ + "lodging" + ], + "#df7db1", + [ + "grocery", + "clothing_store", + "shop" + ], + "hsl(213, 40%, 65%)", + "hsl(201, 9%, 80%)" + ] + ], + "text-halo-color": "#000000", + "text-halo-width": 1, + "icon-translate": [ + 0, + 0 + ], + "text-translate": [ + 0, + 0 + ], + "text-halo-blur": 1 + } + } + ], + "created": "2019-04-15T08:41:40.148Z", + "modified": "2020-09-05T19:42:03.856Z", + "id": "cjui4020201oo1fmca7yuwbor", + "owner": "microg", + "visibility": "public", + "protected": false, + "draft": false +} diff --git a/artwork/styles/style-stadia-outdoors.json b/artwork/styles/style-stadia-outdoors.json new file mode 100644 index 0000000..9fe7498 --- /dev/null +++ b/artwork/styles/style-stadia-outdoors.json @@ -0,0 +1,5912 @@ +{ + "bearing": 0, + "center": [ + 8.542, + 47.372 + ], + "glyphs": "https://tiles.stadiamaps.com/fonts/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "paint": { + "background-color": "#f9f3ea" + }, + "type": "background", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "subclass", + "glacier" + ], + "id": "landcover-glacier", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 0, + 0.9 + ], + [ + 10, + 0.3 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "$type", + "Polygon" + ], + "id": "park", + "paint": { + "fill-color": "#d8e8c8", + "fill-opacity": { + "base": 1.8, + "stops": [ + [ + 6, + 0.5 + ], + [ + 12, + 0.2 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "park", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "cemetery" + ], + "id": "landuse-cemetery", + "paint": { + "fill-color": "#e0e4dd" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "railway" + ], + "id": "landuse-railway", + "paint": { + "fill-color": "hsla(30, 19%, 90%, 0.4)" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "in", + "class", + "public_park", + "national_park", + "nature_reserve" + ], + "id": "landcover-grass-park", + "paint": { + "fill-antialias": { + "base": 1, + "stops": [ + [ + 0, + false + ], + [ + 9, + true + ] + ] + }, + "fill-color": "#d5e8c2", + "fill-outline-color": "hsla(0, 0%, 0%, 0.1)" + }, + "source": "openmaptiles", + "source-layer": "park", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "rock" + ] + ], + "id": "landcover-rock", + "paint": { + "fill-color": "hsla(0, 0%, 85%, 1)", + "fill-opacity": 1, + "fill-outline-color": "hsla(0, 0%, 0%, 0.1)" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "sand" + ] + ], + "id": "landcover-sand", + "paint": { + "fill-color": "hsla(44, 70%, 87%, 1)", + "fill-opacity": 1, + "fill-outline-color": "hsla(0, 0%, 0%, 0.1)" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "wetland" + ], + "id": "landcover-wetland", + "paint": { + "fill-antialias": { + "base": 1, + "stops": [ + [ + 0, + false + ], + [ + 9, + true + ] + ] + }, + "fill-color": "#3D85C6", + "fill-opacity": 0.075, + "fill-outline-color": "hsla(0, 0%, 0%, 0.03)" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "wood" + ], + "id": "landcover-wood", + "paint": { + "fill-antialias": { + "base": 1, + "stops": [ + [ + 0, + false + ], + [ + 9, + true + ] + ] + }, + "fill-color": "#90d86c", + "fill-opacity": 0.15, + "fill-outline-color": "hsla(0, 0%, 0%, 0.2)" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "grass" + ], + "id": "landcover-grass", + "paint": { + "fill-color": "#d8e8c8", + "fill-opacity": 1 + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "!in", + "class", + "canal", + "river", + "stream" + ], + "id": "waterway-other", + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 2 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "waterway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "in", + "class", + "canal", + "stream" + ], + "id": "waterway-stream-canal", + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "waterway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "river" + ], + "id": "waterway-river", + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.8 + ], + [ + 20, + 6 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "waterway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "in", + "admin_level", + 4 + ], + [ + "!=", + "maritime", + 1 + ] + ], + "id": "boundary-land-level-4", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#9e9cab", + "line-dasharray": [ + 4, + 2, + 2, + 2 + ], + "line-opacity": 0.5, + "line-width": { + "base": 1.4, + "stops": [ + [ + 4, + 0.4 + ], + [ + 5, + 0.8 + ], + [ + 12, + 2.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "boundary", + "type": "line", + "metadata": { + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "!=", + "maritime", + 1 + ], + [ + "!=", + "disputed", + 1 + ] + ], + "id": "boundary-land-level-2", + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(248, 7%, 66%)", + "line-width": { + "base": 1, + "stops": [ + [ + 0, + 0.6 + ], + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 4 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "boundary", + "type": "line", + "metadata": { + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "!=", + "maritime", + 1 + ], + [ + "==", + "disputed", + 1 + ] + ], + "id": "boundary-land-disputed", + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(248, 7%, 70%)", + "line-dasharray": [ + 1, + 3 + ], + "line-width": { + "base": 1, + "stops": [ + [ + 0, + 0.6 + ], + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 4 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "boundary", + "type": "line", + "metadata": { + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "==", + "$type", + "Polygon" + ], + "id": "water-offset", + "layout": { + "visibility": "visible" + }, + "maxzoom": 8, + "minzoom": 6, + "paint": { + "fill-color": "#a0c8f0", + "fill-opacity": 1, + "fill-translate": { + "base": 1, + "stops": [ + [ + 6, + [ + 2, + 0 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "water", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "water", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(210, 60%, 80%)" + }, + "source": "openmaptiles", + "source-layer": "water", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "$type", + "Polygon" + ], + "id": "park-outline", + "layout": {}, + "minzoom": 6, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [ + 6, + "hsla(96, 40%, 49%, 0.36)" + ], + [ + 8, + "hsla(96, 40%, 49%, 0.66)" + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + }, + "source": "openmaptiles", + "source-layer": "park", + "type": "line", + "metadata": { + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "==", + "subclass", + "ice_shelf" + ], + "id": "landcover-ice-shelf", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 0, + 0.9 + ], + [ + 10, + 0.3 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "landcover", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "id": "building", + "paint": { + "fill-antialias": true, + "fill-color": { + "base": 1, + "stops": [ + [ + 15.5, + "#f2eae2" + ], + [ + 16, + "#dfdbd7" + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "building", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "id": "building-top", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#f2eae2", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 13, + 0 + ], + [ + 16, + 1 + ] + ] + }, + "fill-outline-color": "#dfdbd7", + "fill-translate": { + "base": 1, + "stops": [ + [ + 14, + [ + 0, + 0 + ] + ], + [ + 16, + [ + -2, + -2 + ] + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "building", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "service", + "track" + ] + ], + "id": "tunnel-service-track-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#cfcdca", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1 + ], + [ + 16, + 4 + ], + [ + 20, + 11 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "minor" + ] + ], + "id": "tunnel-minor-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#cfcdca", + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "id": "tunnel-secondary-tertiary-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 17 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "id": "tunnel-trunk-primary-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "id": "tunnel-motorway-casing", + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "path", + "footway" + ] + ] + ], + "id": "tunnel-path", + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "service", + "track" + ] + ], + "id": "tunnel-service-track", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 2 + ], + [ + 20, + 7.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "minor_road" + ] + ], + "id": "tunnel-minor", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "id": "tunnel-secondary-tertiary", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 10 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "id": "tunnel-trunk-primary", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "id": "tunnel-motorway", + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#ffdaa6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "rail" + ] + ], + "id": "tunnel-railway", + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 2, + 2 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "in", + "class", + "ferry" + ] + ], + "id": "ferry", + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(108, 159, 182, 1)", + "line-dasharray": [ + 2, + 2 + ], + "line-width": 1.1 + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "in", + "class", + "taxiway" + ] + ], + "id": "aeroway-taxiway-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 12, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-opacity": 1, + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 2 + ], + [ + 17, + 12 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "in", + "class", + "runway" + ] + ], + "id": "aeroway-runway-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 12, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-opacity": 1, + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 5 + ], + [ + 17, + 55 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "in", + "class", + "runway", + "taxiway" + ] + ], + "id": "aeroway-area", + "layout": { + "visibility": "visible" + }, + "minzoom": 4, + "paint": { + "fill-color": "rgba(255, 255, 255, 1)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 1 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "in", + "class", + "taxiway" + ], + [ + "==", + "$type", + "LineString" + ] + ], + "id": "aeroway-taxiway", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 4, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 11, + 0 + ], + [ + 12, + 1 + ] + ] + }, + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 1 + ], + [ + 17, + 10 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "in", + "class", + "runway" + ], + [ + "==", + "$type", + "LineString" + ] + ], + "id": "aeroway-runway", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 4, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 11, + 0 + ], + [ + 12, + 1 + ] + ] + }, + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 4 + ], + [ + 17, + 50 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "$type", + "Polygon" + ], + "id": "highway-area", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsla(0, 0%, 89%, 0.56)", + "fill-opacity": 0.9, + "fill-outline-color": "#cfcdca" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "fill", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "id": "highway-motorway-link-casing", + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "minzoom": 12, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "id": "highway-link-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 13, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!=", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "minor", + "service", + "track" + ] + ] + ], + "id": "highway-minor-casing", + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#cfcdca", + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "id": "highway-secondary-tertiary-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 6, + 1.5 + ], + [ + 20, + 17 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary" + ] + ], + "id": "highway-primary-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 5, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.5 + ], + [ + 8, + 0.6 + ], + [ + 9, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "trunk" + ] + ], + "id": "highway-trunk-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 5, + "paint": { + "line-color": "#e9ac77", + "line-opacity": { + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "id": "highway-motorway-casing", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 4, + "paint": { + "line-color": "#e9ac77", + "line-opacity": { + "stops": [ + [ + 4, + 0 + ], + [ + 5, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 4, + 0 + ], + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "path", + "footway" + ] + ] + ], + "id": "highway-path", + "paint": { + "line-color": "#cba", + "line-dasharray": { + "stops": [ + [ + 13, + [ + 1, + 0.5 + ] + ], + [ + 14, + [ + 2, + 1 + ] + ], + [ + 20, + [ + 3, + 1 + ] + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 13, + 1 + ], + [ + 14, + 2 + ], + [ + 20, + 4 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "id": "highway-motorway-link", + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "minzoom": 12, + "paint": { + "line-color": "#e5b87e", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "id": "highway-link", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 13, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "in", + "class", + "downhill", + "nordic" + ], + [ + "==", + "$type", + "LineString" + ] + ], + "id": "ski-slopes-line", + "minzoom": 11, + "paint": { + "line-blur": 0.5, + "line-color": "rgba(75, 122, 195, 1)", + "line-dasharray": [ + 3, + 2 + ], + "line-width": { + "stops": [ + [ + 10, + 1 + ], + [ + 13, + 1.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "piste", + "type": "line", + "metadata": { + "microg:gms-type-feature": "poi.sports_complex", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!=", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "minor", + "service", + "track" + ] + ] + ], + "id": "highway-minor", + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "id": "highway-secondary-tertiary", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 8, + 0.5 + ], + [ + 20, + 13 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary" + ] + ] + ], + "id": "highway-primary", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.1 + ], + [ + 9, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "trunk" + ] + ] + ], + "id": "highway-trunk", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ] + ], + "id": "highway-motorway", + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "minzoom": 5, + "paint": { + "line-color": "#e5b87e", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 10 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "transit" + ], + [ + "!in", + "brunnel", + "tunnel" + ] + ] + ], + "id": "railway-transit", + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 20, + 1 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "transit" + ], + [ + "!in", + "brunnel", + "tunnel" + ] + ] + ], + "id": "railway-transit-hatching", + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 2 + ], + [ + 20, + 6 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "rail" + ], + [ + "has", + "service" + ] + ] + ], + "id": "railway-service", + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 20, + 1 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "rail" + ], + [ + "has", + "service" + ] + ] + ], + "id": "railway-service-hatching", + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 2 + ], + [ + 20, + 6 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!has", + "service" + ], + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "rail" + ] + ] + ], + "id": "railway", + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!has", + "service" + ], + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "rail" + ] + ] + ], + "id": "railway-hatching", + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "id": "bridge-motorway-link-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "id": "bridge-link-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "id": "bridge-secondary-tertiary-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 28 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "id": "bridge-trunk-primary-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(28, 76%, 67%)", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 26 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway" + ] + ], + "id": "bridge-motorway-casing", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "path", + "footway" + ] + ] + ], + "id": "bridge-path-casing", + "paint": { + "line-color": "#f8f4f0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.stroke" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "path", + "footway" + ] + ] + ], + "id": "bridge-path", + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "id": "bridge-motorway-link", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e5b87e", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "id": "bridge-link", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "id": "bridge-secondary-tertiary", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 20 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "id": "bridge-trunk-primary", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e5d7a0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway" + ] + ], + "id": "bridge-motorway", + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e5b87e", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "road.arterial", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "rail" + ] + ], + "id": "bridge-railway", + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "rail" + ] + ], + "id": "bridge-railway-hatching", + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "landscape.man_made", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "cable_car" + ], + "id": "cablecar", + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "minzoom": 11, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-width": { + "base": 1, + "stops": [ + [ + 11, + 1 + ], + [ + 19, + 2.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "==", + "class", + "cable_car" + ], + "id": "cablecar-dash", + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "minzoom": 11, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-dasharray": [ + 2, + 3 + ], + "line-width": { + "base": 1, + "stops": [ + [ + 11, + 3 + ], + [ + 19, + 5.5 + ] + ] + } + }, + "source": "openmaptiles", + "source-layer": "transportation", + "type": "line", + "metadata": { + "microg:gms-type-feature": "transit.line", + "microg:gms-type-element": "geometry.fill" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "has", + "name" + ], + [ + "!=", + "name", + "" + ] + ], + "id": "waterway-name", + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + " ", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Italic" + ], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-pitch-alignment": "viewport", + "text-rotation-alignment": "map", + "text-size": 14 + }, + "minzoom": 13, + "paint": { + "text-color": "#115AA7" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "!in", + "class", + "ocean" + ] + ], + "id": "water-name-other", + "layout": { + "symbol-placement": "point", + "symbol-spacing": 150, + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Italic" + ], + "text-letter-spacing": 0.2, + "text-line-height": 1.55, + "text-max-width": 5, + "text-size": { + "stops": [ + [ + 0, + 10 + ], + [ + 6, + 14 + ] + ] + }, + "visibility": "visible" + }, + "minzoom": 1, + "paint": { + "text-color": "#115AA7" + }, + "source": "openmaptiles", + "source-layer": "water_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "class", + "ocean" + ] + ], + "id": "water-name-ocean", + "layout": { + "symbol-avoid-edges": true, + "symbol-placement": "point", + "symbol-spacing": 350, + "text-field": "{name:latin}", + "text-font": [ + "Stadia Italic" + ], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-size": 14 + }, + "paint": { + "text-color": "#115AA7" + }, + "source": "openmaptiles", + "source-layer": "water_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + ">=", + "rank", + 25 + ] + ], + "id": "poi-level-3", + "layout": { + "icon-image": "{class}_11", + "symbol-avoid-edges": true, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Semibold" + ], + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-padding": 2, + "text-size": 12 + }, + "minzoom": 16, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "poi", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "<=", + "rank", + 24 + ], + [ + ">=", + "rank", + 15 + ] + ], + "id": "poi-level-2", + "layout": { + "icon-image": "{class}_11", + "symbol-avoid-edges": true, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Semibold" + ], + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-padding": 2, + "text-size": 12 + }, + "minzoom": 15, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "poi", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "<=", + "rank", + 14 + ], + [ + "has", + "name" + ], + [ + "!=", + "name", + "" + ] + ], + "id": "poi-level-1", + "layout": { + "icon-image": "{class}_11", + "symbol-avoid-edges": true, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Semibold" + ], + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-padding": 2, + "text-size": 12 + }, + "minzoom": 14, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "poi", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "poi", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "has", + "name" + ], + [ + "!=", + "name", + "" + ], + [ + "==", + "class", + "railway" + ], + [ + "==", + "subclass", + "station" + ] + ], + "id": "poi-railway", + "layout": { + "icon-allow-overlap": false, + "icon-ignore-placement": false, + "icon-image": "{class}_11", + "icon-optional": false, + "symbol-avoid-edges": true, + "text-allow-overlap": false, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-ignore-placement": false, + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-optional": true, + "text-padding": 2, + "text-size": 12 + }, + "minzoom": 13, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "poi", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "transit.station", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "in", + "class", + "path", + "footway" + ], + "id": "highway-name-path", + "layout": { + "symbol-placement": "line", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + " ", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-pitch-alignment": "viewport", + "text-rotation-alignment": "map", + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + } + }, + "minzoom": 15.5, + "paint": { + "text-color": "hsl(30, 23%, 62%)", + "text-halo-color": "#f8f4f0", + "text-halo-width": 0.5 + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + } + }, + { + "id": "ski-slopes-label", + "layout": { + "icon-pitch-alignment": "auto", + "symbol-placement": "line-center", + "text-anchor": "bottom", + "text-field": "{name}", + "text-font": [ + "Stadia Regular" + ], + "text-keep-upright": true, + "text-size": 12 + }, + "minzoom": 13, + "paint": { + "text-color": "rgba(75, 122, 195, 1)", + "text-halo-blur": 0.5, + "text-halo-color": "rgba(255, 255, 255, 1)", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "piste", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "poi.sports_complex", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "class", + "minor", + "service", + "track" + ] + ], + "id": "highway-name-minor", + "layout": { + "symbol-placement": "line", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + " ", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-pitch-alignment": "viewport", + "text-rotation-alignment": "map", + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + } + }, + "minzoom": 15, + "paint": { + "text-color": "#765", + "text-halo-blur": 0.5, + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "road.local", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "in", + "class", + "primary", + "secondary", + "tertiary", + "trunk" + ], + "id": "highway-name-major", + "layout": { + "symbol-placement": "line", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + " ", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-pitch-alignment": "viewport", + "text-rotation-alignment": "map", + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + } + }, + "minzoom": 12.2, + "paint": { + "text-color": "#765", + "text-halo-blur": 0.5, + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "<=", + "ref_length", + 6 + ], + [ + "==", + "$type", + "LineString" + ], + [ + "!in", + "network", + "us-interstate", + "us-highway", + "us-state" + ] + ], + "id": "highway-shield-other", + "layout": { + "icon-image": "road_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-avoid-edges": true, + "symbol-placement": { + "base": 1, + "stops": [ + [ + 10, + "point" + ], + [ + 11, + "line" + ] + ] + }, + "text-field": "{ref}", + "text-font": [ + "Stadia Semibold" + ], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "minzoom": 8, + "paint": {}, + "source": "openmaptiles", + "source-layer": "transportation_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.icon" + } + }, + { + "filter": [ + "all", + [ + "<=", + "ref_length", + 6 + ], + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "network", + "us-interstate" + ] + ], + "id": "highway-shield-us-interstate", + "layout": { + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-avoid-edges": true, + "symbol-placement": { + "base": 1, + "stops": [ + [ + 7, + "point" + ], + [ + 7, + "line" + ], + [ + 8, + "line" + ] + ] + }, + "text-field": "{ref}", + "text-font": [ + "Stadia Semibold" + ], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "minzoom": 7, + "paint": { + "text-color": "rgba(0, 0, 0, 1)" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.icon" + } + }, + { + "filter": [ + "all", + [ + "<=", + "ref_length", + 6 + ], + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "network", + "us-highway", + "us-state" + ] + ], + "id": "highway-shield-us-other", + "layout": { + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-avoid-edges": true, + "symbol-placement": { + "base": 1, + "stops": [ + [ + 10, + "point" + ], + [ + 11, + "line" + ] + ] + }, + "text-field": "{ref}", + "text-font": [ + "Stadia Semibold" + ], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "minzoom": 9, + "paint": { + "text-color": "rgba(0, 0, 0, 1)" + }, + "source": "openmaptiles", + "source-layer": "transportation_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "road.highway", + "microg:gms-type-element": "labels.icon" + } + }, + { + "filter": [ + "all", + [ + "has", + "iata" + ] + ], + "id": "airport-label-major", + "layout": { + "icon-image": "airport_11", + "icon-size": 1, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-optional": true, + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "minzoom": 10, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "aerodrome_label", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "transit.station.airport", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "!in", + "class", + "city", + "town", + "village", + "country", + "continent" + ], + "id": "place-other", + "layout": { + "symbol-avoid-edges": true, + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Semibold" + ], + "text-letter-spacing": 0.1, + "text-line-height": 1.55, + "text-max-width": 9, + "text-size": { + "base": 1.2, + "stops": [ + [ + 12, + 10 + ], + [ + 15, + 14 + ] + ] + }, + "text-transform": "uppercase", + "visibility": "visible" + }, + "minzoom": 12, + "paint": { + "text-color": "#633", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.neighborhood", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "==", + "class", + "village" + ], + "id": "place-village", + "layout": { + "symbol-avoid-edges": true, + "symbol-spacing": 350, + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-line-height": 1.55, + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [ + 10, + 12 + ], + [ + 15, + 22 + ] + ] + }, + "visibility": "visible" + }, + "minzoom": 11, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.neighborhood", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "<=", + "rank", + 2 + ], + [ + "has", + "name" + ], + [ + "!=", + "name", + "" + ] + ], + "id": "mountain-peaks", + "layout": { + "icon-image": "mountain_11", + "symbol-avoid-edges": true, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ], + "\n", + [ + "to-string", + [ + "get", + "ele" + ] + ], + " m" + ], + "text-font": [ + "Stadia Regular" + ], + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-padding": 2, + "text-size": 12 + }, + "minzoom": 9, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "mountain_peak", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + ">=", + "ele", + 2500 + ], + [ + "has", + "name" + ], + [ + "!=", + "name", + "" + ], + [ + "<=", + "rank", + 1 + ] + ], + "id": "mountain-peaks-important", + "layout": { + "icon-image": "mountain_11", + "symbol-avoid-edges": true, + "text-anchor": "top", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ], + "\n", + [ + "to-string", + [ + "get", + "ele" + ] + ], + " m" + ], + "text-font": [ + "Stadia Semibold" + ], + "text-line-height": 1.55, + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-padding": 2, + "text-size": 12 + }, + "maxzoom": 9, + "minzoom": 7, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "mountain_peak", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "landscape.natural.landcover", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "==", + "class", + "town" + ], + "id": "place-town", + "layout": { + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Regular" + ], + "text-line-height": 1.55, + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [ + 10, + 14 + ], + [ + 15, + 22 + ] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "nature_reserve", + "protected_area" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "Point" + ], + [ + "==", + [ + "get", + "rank" + ], + 1 + ], + [ + "!", + [ + "any", + [ + "in", + "Open Access Land", + [ + "get", + "name" + ] + ], + [ + "in", + "State Game Land", + [ + "get", + "name" + ] + ] + ] + ] + ], + "id": "park-reserve", + "layout": { + "symbol-avoid-edges": true, + "symbol-placement": "point", + "text-anchor": "center", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Italic" + ], + "text-justify": "center", + "text-line-height": 1.55, + "text-max-width": 10, + "text-padding": 2, + "text-size": { + "base": 1.2, + "stops": [ + [ + 8, + 12 + ], + [ + 13, + 14 + ] + ] + }, + "visibility": "visible" + }, + "minzoom": 8, + "paint": { + "text-color": "rgba(102, 51, 1, 1)", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "park", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "national_park" + ], + [ + "==", + "$type", + "Point" + ], + [ + "==", + "rank", + 1 + ] + ], + "id": "park-national", + "layout": { + "symbol-avoid-edges": true, + "symbol-placement": "point", + "text-anchor": "center", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Italic" + ], + "text-justify": "center", + "text-line-height": 1.55, + "text-max-width": 10, + "text-padding": 2, + "text-size": { + "base": 1.2, + "stops": [ + [ + 6, + 12 + ], + [ + 8, + 14 + ], + [ + 12, + 16 + ] + ] + }, + "visibility": "visible" + }, + "minzoom": 6, + "paint": { + "text-color": "rgba(102, 51, 1, 1)", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1 + }, + "source": "openmaptiles", + "source-layer": "park", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "poi.park", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "==", + "$type", + "LineString" + ], + "id": "water-name-lakeline", + "layout": { + "symbol-placement": "line", + "symbol-spacing": 250, + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + " ", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Italic" + ], + "text-letter-spacing": 0.2, + "text-line-height": 1.55, + "text-max-width": 5, + "text-pitch-alignment": "viewport", + "text-rotation-alignment": "map", + "text-size": { + "base": 1.2, + "stops": [ + [ + 0, + 10 + ], + [ + 14, + 14 + ] + ] + } + }, + "paint": { + "text-color": "#115AA7" + }, + "source": "openmaptiles", + "source-layer": "water_name", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "water", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "!=", + "capital", + 2 + ], + [ + "==", + "class", + "city" + ] + ], + "id": "place-city", + "layout": { + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Semibold" + ], + "text-line-height": 1.55, + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [ + 7, + 14 + ], + [ + 11, + 24 + ] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "capital", + 2 + ], + [ + "==", + "class", + "city" + ] + ], + "id": "place-city-capital", + "layout": { + "icon-image": "star_11", + "icon-size": 0.8, + "text-anchor": "left", + "text-field": [ + "concat", + [ + "get", + "name:latin" + ], + [ + "case", + [ + "all", + [ + "has", + "name:nonlatin" + ], + [ + "is-supported-script", + [ + "get", + "name:nonlatin" + ] + ] + ], + [ + "concat", + "\n", + [ + "get", + "name:nonlatin" + ] + ], + "" + ] + ], + "text-font": [ + "Stadia Semibold" + ], + "text-line-height": 1.55, + "text-max-width": 8, + "text-offset": [ + 0.4, + 0 + ], + "text-size": { + "base": 1.2, + "stops": [ + [ + 7, + 14 + ], + [ + 11, + 24 + ] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.locality", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + ">=", + "rank", + 3 + ], + [ + "!has", + "iso_a2" + ] + ], + "id": "place-country-other", + "layout": { + "symbol-avoid-edges": true, + "text-field": "{name:latin}", + "text-font": [ + "Stadia Italic" + ], + "text-max-width": 6.25, + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 7, + 17 + ] + ] + }, + "text-transform": "uppercase", + "visibility": "visible" + }, + "minzoom": 1, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + ">=", + "rank", + 3 + ], + [ + "has", + "iso_a2" + ] + ], + "id": "place-country-3", + "layout": { + "text-field": "{name:latin}", + "text-font": [ + "Stadia Bold" + ], + "text-max-width": 6.25, + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 7, + 17 + ] + ] + }, + "text-transform": "uppercase", + "visibility": "visible" + }, + "minzoom": 1, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + "==", + "rank", + 2 + ], + [ + "has", + "iso_a2" + ] + ], + "id": "place-country-2", + "layout": { + "text-field": "{name:latin}", + "text-font": [ + "Stadia Bold" + ], + "text-max-width": 6.25, + "text-size": { + "stops": [ + [ + 2, + 11 + ], + [ + 5, + 17 + ] + ] + }, + "text-transform": "uppercase", + "visibility": "visible" + }, + "minzoom": 1, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.province", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + "==", + "rank", + 1 + ], + [ + "has", + "iso_a2" + ] + ], + "id": "place-country-1", + "layout": { + "text-field": "{name:latin}", + "text-font": [ + "Stadia Bold" + ], + "text-max-width": 6.25, + "text-size": { + "stops": [ + [ + 1, + 11 + ], + [ + 4, + 17 + ] + ] + }, + "text-transform": "uppercase", + "visibility": "visible" + }, + "minzoom": 1, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.country", + "microg:gms-type-element": "labels.text" + } + }, + { + "filter": [ + "==", + "class", + "continent" + ], + "id": "place-continent", + "layout": { + "text-field": "{name:latin}", + "text-font": [ + "Stadia Bold" + ], + "text-max-width": 6.25, + "text-size": 14, + "text-transform": "uppercase", + "visibility": "visible" + }, + "maxzoom": 1, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + }, + "source": "openmaptiles", + "source-layer": "place", + "type": "symbol", + "metadata": { + "microg:gms-type-feature": "administrative.land_parcel", + "microg:gms-type-element": "labels.text" + } + } + ], + "metadata": { + "mapbox:autocomposite": false, + "openmaptiles:version": "3.x" + }, + "name": "Outdoors", + "pitch": 0, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://tiles.stadiamaps.com/data/openmaptiles.json" + } + }, + "sprite": "https://tiles.stadiamaps.com/styles/outdoors/sprite", + "version": 8, + "zoom": 11.6 +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..ae1cd09 --- /dev/null +++ b/build.gradle @@ -0,0 +1,125 @@ +/* + * SPDX-FileCopyrightText: 2013 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +buildscript { + ext.cronetVersion = '102.5005.125' + ext.wearableVersion = '0.1.1' + + ext.kotlinVersion = '1.9.22' + ext.coroutineVersion = '1.7.3' + + ext.annotationVersion = '1.7.1' + ext.appcompatVersion = '1.6.1' + ext.biometricVersion = '1.1.0' + ext.coreVersion = '1.12.0' + ext.fragmentVersion = '1.6.2' + ext.lifecycleVersion = '2.7.0' + ext.loaderVersion = '1.1.0' + ext.materialVersion = '1.11.0' + ext.mediarouterVersion = '1.6.0' + ext.multidexVersion = '2.0.1' + ext.navigationVersion = '2.7.7' + ext.preferenceVersion = '1.2.0' + ext.recyclerviewVersion = '1.3.2' + ext.webkitVersion = '1.10.0' + + ext.slf4jVersion = '1.7.36' + ext.volleyVersion = '1.2.1' + ext.okHttpVersion = '4.12.0' + ext.ktorVersion = '2.3.12' + ext.wireVersion = '4.9.9' + ext.tinkVersion = '1.13.0' + + ext.androidBuildGradleVersion = '8.2.2' + + ext.androidBuildVersionTools = '34.0.0' + + ext.androidMinSdk = 19 + ext.androidTargetSdk = 29 + ext.androidCompileSdk = 35 + + ext.localProperties = new Properties() + + try { + var stream = rootProject.file('local.properties').newDataInputStream() + ext.localProperties.load(stream) + stream.close() + } catch (ignored) { + // Ignore + } + + ext.hasModule = (String name, boolean enabledByDefault) -> { + return ext.localProperties.getProperty("modules." + name, enabledByDefault.toString()).toBoolean() + } + + repositories { + mavenCentral() + google() + } + + dependencies { + classpath "com.android.tools.build:gradle:$androidBuildGradleVersion" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" + classpath "com.squareup.wire:wire-gradle-plugin:$wireVersion" + } +} + +def execResult(... args) { + providers.exec { commandLine args }.standardOutput.asText.get() +} + +def ignoreGit = providers.environmentVariable('GRADLE_MICROG_VERSION_WITHOUT_GIT').getOrElse('0') == '1' +def gmsVersion = "25.09.32" +def gmsVersionCode = Integer.parseInt(gmsVersion.replaceAll('\\.', '')) +def vendingVersion = "40.2.26" +def vendingVersionCode = Integer.parseInt(vendingVersion.replaceAll('\\.', '')) +def gitVersionBase = !ignoreGit ? execResult('git', 'describe', '--tags', '--abbrev=0', '--match=v[0-9]*').trim().substring(1) : "v0.0.0.$gmsVersionCode" +def gitCommitCount = !ignoreGit ? Integer.parseInt(execResult('git', 'rev-list', '--count', "v$gitVersionBase..HEAD").trim()) : 0 +def gitCommitId = !ignoreGit ? execResult('git', 'show-ref', '--abbrev=7', '--head', 'HEAD').trim().split(' ')[0] : '0000000' +def gitDirty = false +if (!ignoreGit) { + execResult('git', 'status', '--porcelain').lines().each { stat -> + def status = stat.substring(0,2) + def file = stat.substring(3) + if (status == '??') { + if (subprojects.any { p -> file.startsWith(p.name + '/') }) { + logger.lifecycle('Dirty file: {} (untracked)', file) + gitDirty = true + } else { + logger.info('New file outside module: {} (ignored for dirty check)', file) + } + } else { + logger.lifecycle('Dirty file: {} (changed)', file) + gitDirty = true + } + } +} +def ourVersionBase = gitVersionBase.substring(0, gitVersionBase.lastIndexOf('.')) +def ourVersionMinor = Integer.parseInt(ourVersionBase.substring(ourVersionBase.lastIndexOf('.') + 1)) +def ourGmsVersionCode = gmsVersionCode * 1000 + ourVersionMinor * 2 + (gitCommitCount > 0 || gitDirty ? 1 : 0) +def ourGmsVersionName = "$ourVersionBase.$gmsVersionCode" + (gitCommitCount > 0 && !gitDirty ? "-$gitCommitCount" : "") + (gitDirty ? "-dirty" : "") + (gitCommitCount > 0 && !gitDirty ? " ($gitCommitId)" : "") +def ourVendingVersionCode = 80000000 + vendingVersionCode * 100 + ourVersionMinor * 2 + (gitCommitCount > 0 || gitDirty ? 1 : 0) +def ourVendingVersionName = "$ourVersionBase.$vendingVersionCode" + (gitCommitCount > 0 && !gitDirty ? "-$gitCommitCount" : "") + (gitDirty ? "-dirty" : "") + (gitCommitCount > 0 && !gitDirty ? " ($gitCommitId)" : "") +logger.lifecycle('Starting build for GMS version {} ({})...', ourGmsVersionName, ourGmsVersionCode) + +allprojects { + apply plugin: 'idea' + + group = 'org.microg.gms' + version = ourGmsVersionName + ext.vendingAppVersionName = ourVendingVersionName + ext.vendingAppVersionCode = ourVendingVersionCode + ext.appVersionCode = ourGmsVersionCode + ext.isReleaseVersion = false +} + +subprojects { + repositories { + mavenCentral() + google() + if (hasModule("hms", false)) maven {url 'https://developer.huawei.com/repo/'} + } +} + diff --git a/fake-signature/build.gradle b/fake-signature/build.gradle new file mode 100644 index 0000000..e0aaecb --- /dev/null +++ b/fake-signature/build.gradle @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' + +android { + namespace 'org.microg.signature.fake' + compileSdk androidCompileSdk + + defaultConfig { + minSdk androidMinSdk + targetSdk androidTargetSdk + } + + flavorDimensions = ['target'] + productFlavors { + "default" { + dimension 'target' + } + "huawei" { + dimension 'target' + } + } + + buildFeatures { + aidl = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { +} \ No newline at end of file diff --git a/fake-signature/src/huawei/AndroidManifest.xml b/fake-signature/src/huawei/AndroidManifest.xml new file mode 100644 index 0000000..9fa87a0 --- /dev/null +++ b/fake-signature/src/huawei/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fake-signature/src/huawei/aidl/com/huawei/signature/diff/ISignatureService.aidl b/fake-signature/src/huawei/aidl/com/huawei/signature/diff/ISignatureService.aidl new file mode 100644 index 0000000..e3cf04e --- /dev/null +++ b/fake-signature/src/huawei/aidl/com/huawei/signature/diff/ISignatureService.aidl @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.huawei.signature.diff; + +/** + * Interface for Huawei Differentiated Signature Capability + * See https://forums.developer.huawei.com/forumPortal/en/topic/0202128603315033024 + */ +interface ISignatureService { + String[] querySignature(String packageName, boolean suggested); +} \ No newline at end of file diff --git a/fake-signature/src/huawei/java/com/huawei/signature/diff/AppListDatabaseOpenHelper.java b/fake-signature/src/huawei/java/com/huawei/signature/diff/AppListDatabaseOpenHelper.java new file mode 100644 index 0000000..f7e2d26 --- /dev/null +++ b/fake-signature/src/huawei/java/com/huawei/signature/diff/AppListDatabaseOpenHelper.java @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.huawei.signature.diff; + +import android.content.ContentValues; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; +import org.microg.signature.fake.R; + +public class AppListDatabaseOpenHelper extends SQLiteOpenHelper { + private static final String TAG = AppListDatabaseOpenHelper.class.getSimpleName(); + private static final String DATABASE_NAME = "app_list.db"; + public static final String TABLE_APPLIST = "applist"; + public static final String COLUMN_NAME = "name"; + public static final String COLUMN_FAKE = "fake"; + private static final int DATABASE_VERSION = 3; + private static final String DROP_APP_LIST_TABLE = "DROP TABLE IF EXISTS " + TABLE_APPLIST; + private static final String CREATE_APP_LIST_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_APPLIST + "(" + + COLUMN_NAME + " VARCHAR(255) PRIMARY KEY, " + + COLUMN_FAKE + " INTEGER CHECK(" + COLUMN_FAKE + " >= 0 and " + COLUMN_FAKE + " <= 1)" + + ")"; + private final Context context; + + public AppListDatabaseOpenHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + this.context = context; + } + + @Override + public void onCreate(SQLiteDatabase db) { + Log.d(TAG, "onCreate"); + db.execSQL(DROP_APP_LIST_TABLE); + db.execSQL(CREATE_APP_LIST_TABLE); + initData(db); + } + + @Override + public void onOpen(SQLiteDatabase db) { + super.onOpen(db); + if (!db.isReadOnly()) { + initData(db); + } + } + + private void initData(SQLiteDatabase db) { + String[] wantFakeApps = context.getResources().getStringArray(R.array.signature_want_fake); + String[] neverFakeApps = context.getResources().getStringArray(R.array.signature_never_fake); + if (wantFakeApps.length == 0 && neverFakeApps.length == 0) { + return; + } + for (String app : wantFakeApps) { + db.insertWithOnConflict(TABLE_APPLIST, null, generateValues(app, true), SQLiteDatabase.CONFLICT_REPLACE); + } + for (String app : neverFakeApps) { + db.insertWithOnConflict(TABLE_APPLIST, null, generateValues(app, false), SQLiteDatabase.CONFLICT_REPLACE); + } + } + + private ContentValues generateValues(String packageName, boolean fake) { + ContentValues contentValues = new ContentValues(); + contentValues.put(COLUMN_NAME, packageName); + contentValues.put(COLUMN_FAKE, fake ? 1 : 0); + return contentValues; + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + onCreate(db); + } +} \ No newline at end of file diff --git a/fake-signature/src/huawei/java/com/huawei/signature/diff/InitProvider.java b/fake-signature/src/huawei/java/com/huawei/signature/diff/InitProvider.java new file mode 100644 index 0000000..8d420a9 --- /dev/null +++ b/fake-signature/src/huawei/java/com/huawei/signature/diff/InitProvider.java @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.huawei.signature.diff; + +import android.app.ActivityManager; +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; +import java.util.List; + +public class InitProvider extends ContentProvider { + private static final String TAG = "InitProvider"; + + @Override + public boolean onCreate() { + Log.d(TAG, "onCreate"); + if (!isServiceRunning(getContext(), getContext().getPackageName(), SignatureService.class.getName())) { + Intent intent = new Intent(getContext(), SignatureService.class); + try { + getContext().startService(intent); + } catch (Exception ignored) { + } + } + return false; + } + + private boolean isServiceRunning(Context context, String packageName, String serviceName) { + ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + List serviceInfoList = manager.getRunningServices(Integer.MAX_VALUE); + if (serviceInfoList == null) { + return false; + } + for (ActivityManager.RunningServiceInfo info : serviceInfoList) { + if (info.service.getPackageName().equals(packageName) && info.service.getClassName().equals(serviceName)) { + return true; + } + } + return false; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + return null; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } +} \ No newline at end of file diff --git a/fake-signature/src/huawei/java/com/huawei/signature/diff/InitReceiver.java b/fake-signature/src/huawei/java/com/huawei/signature/diff/InitReceiver.java new file mode 100644 index 0000000..657cba2 --- /dev/null +++ b/fake-signature/src/huawei/java/com/huawei/signature/diff/InitReceiver.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.huawei.signature.diff; + +import android.annotation.SuppressLint; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +/** + * This is to make sure the process is initialized at boot. + */ +public class InitReceiver extends BroadcastReceiver { + private static final String TAG = "InitReceiver"; + + @SuppressLint("UnsafeProtectedBroadcastReceiver") + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "onReceive"); + try { + context.startService(new Intent(context, SignatureService.class)); + } catch (Exception ignored) { + } + } +} diff --git a/fake-signature/src/huawei/java/com/huawei/signature/diff/SignatureService.java b/fake-signature/src/huawei/java/com/huawei/signature/diff/SignatureService.java new file mode 100644 index 0000000..ca6d654 --- /dev/null +++ b/fake-signature/src/huawei/java/com/huawei/signature/diff/SignatureService.java @@ -0,0 +1,106 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.huawei.signature.diff; + +import static com.huawei.signature.diff.AppListDatabaseOpenHelper.COLUMN_NAME; +import static com.huawei.signature.diff.AppListDatabaseOpenHelper.TABLE_APPLIST; + +import android.app.Service; +import android.content.Intent; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.Binder; +import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; +import android.util.Log; +import org.microg.signature.fake.R; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.Date; + +public class SignatureService extends Service { + private static final String TAG = "SignatureService"; + private SQLiteDatabase database; + private AppListDatabaseOpenHelper openHelper; + private long start; + + @Override + public void onCreate() { + super.onCreate(); + this.openHelper = new AppListDatabaseOpenHelper(this); + this.database = openHelper.getWritableDatabase(); + this.start = System.currentTimeMillis(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.i(TAG, "onStartCommand"); + return START_STICKY; + } + + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + @Override + public void onDestroy() { + this.openHelper.close(); + super.onDestroy(); + } + + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + writer.println("Started: " + new Date(start)); + } + + private final ISignatureService.Stub binder = new ISignatureService.Stub() { + + @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { + if (Binder.getCallingUid() > 10000) { + Log.w(TAG, "Illegal access from app"); + reply.writeException(new UnsupportedOperationException("Illegal")); + return true; + } + return super.onTransact(code, data, reply, flags); + } + + @Override + public String[] querySignature(String packageName, boolean suggested) throws RemoteException { + try (Cursor cursor = database.query(TABLE_APPLIST, null, COLUMN_NAME + "=?", + new String[]{packageName}, null, null, null)) { + switch (cursor.getCount()) { + case 0: + return getResult(suggested); + case 1: + if (cursor.moveToFirst()) { + int shouldFake = cursor.getInt(1); + return getResult(shouldFake == 1); + } + break; + default: + throw new IllegalArgumentException("result size: " + cursor.getCount()); + } + + } catch (Exception e) { + Log.w(TAG, e); + } + return getResult(false); + } + + private String[] getResult(boolean useFakeSignature) { + if (useFakeSignature) { + return new String[]{getString(R.string.fake_signature),}; + } else { + return new String[]{getString(R.string.real_signature),}; + } + } + }; +} \ No newline at end of file diff --git a/fake-signature/src/main/AndroidManifest.xml b/fake-signature/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1b3ae15 --- /dev/null +++ b/fake-signature/src/main/AndroidManifest.xml @@ -0,0 +1,1159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fake-signature/src/main/res/values/arrays.xml b/fake-signature/src/main/res/values/arrays.xml new file mode 100644 index 0000000..4f3118d --- /dev/null +++ b/fake-signature/src/main/res/values/arrays.xml @@ -0,0 +1,39 @@ + + + + + com.google.android.gms + com.android.vending + com.spotify.music + com.getir + com.pozitron.iscep + com.widgetable.theme.android + pro.huobi + com.tarparos.phigaea + com.artem.scotepio + com.sabah.deprembs + com.boynergrup.hopi + com.belbim.istanbulkart + com.a101.plus + com.widgetable.theme.android + net.wargaming.wot.blitz + com.litatom.app + com.ataexpress.tiklagelsin + tr.com.petrolofisi + com.mobisoft.beymen + com.unilever.algida + com.mobisoft.morhipo + com.zzkko + com.didilabs.kaavefali + com.airbnb.android + com.mobillium.papara + co.com.fincaraiz.app + com.frisby.frisby + + + com.truecaller + + \ No newline at end of file diff --git a/fake-signature/src/main/res/values/signature.xml b/fake-signature/src/main/res/values/signature.xml new file mode 100644 index 0000000..282e0dc --- /dev/null +++ b/fake-signature/src/main/res/values/signature.xml @@ -0,0 +1,14 @@ + + + + + + 308204433082032ba003020102020900c2e08746644a308d300d06092a864886f70d01010405003074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964301e170d3038303832313233313333345a170d3336303130373233313333345a3074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f696430820120300d06092a864886f70d01010105000382010d00308201080282010100ab562e00d83ba208ae0a966f124e29da11f2ab56d08f58e2cca91303e9b754d372f640a71b1dcb130967624e4656a7776a92193db2e5bfb724a91e77188b0e6a47a43b33d9609b77183145ccdf7b2e586674c9e1565b1f4c6a5955bff251a63dabf9c55c27222252e875e4f8154a645f897168c0b1bfc612eabf785769bb34aa7984dc7e2ea2764cae8307d8c17154d7ee5f64a51a44a602c249054157dc02cd5f5c0e55fbef8519fbe327f0b1511692c5a06f19d18385f5c4dbc2d6b93f68cc2979c70e18ab93866b3bd5db8999552a0e3b4c99df58fb918bedc182ba35e003c1b4b10dd244a8ee24fffd333872ab5221985edab0fc0d0b145b6aa192858e79020103a381d93081d6301d0603551d0e04160414c77d8cc2211756259a7fd382df6be398e4d786a53081a60603551d2304819e30819b8014c77d8cc2211756259a7fd382df6be398e4d786a5a178a4763074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964820900c2e08746644a308d300c0603551d13040530030101ff300d06092a864886f70d010104050003820101006dd252ceef85302c360aaace939bcff2cca904bb5d7a1661f8ae46b2994204d0ff4a68c7ed1a531ec4595a623ce60763b167297a7ae35712c407f208f0cb109429124d7b106219c084ca3eb3f9ad5fb871ef92269a8be28bf16d44c8d9a08e6cb2f005bb3fe2cb96447e868e731076ad45b33f6009ea19c161e62641aa99271dfd5228c5c587875ddb7f452758d661f6cc0cccb7352e424cc4365c523532f7325137593c4ae341f4db41edda0d0b1071a7c440f0fe9ea01cb627ca674369d084bd2fd911ff06cdbf2cfa10dc0f893ae35762919048c7efc64c7144178342f70581c9de573af55b390dd7fdb9418631895d5f759f30112687ff621410c069308a + + + 308202ed308201d5a003020102020426ffa009300d06092a864886f70d01010b05003027310b300906035504061302444531183016060355040a130f4e4f47415050532050726f6a656374301e170d3132313030363132303533325a170d3337303933303132303533325a3027310b300906035504061302444531183016060355040a130f4e4f47415050532050726f6a65637430820122300d06092a864886f70d01010105000382010f003082010a02820101009a8d2a5336b0eaaad89ce447828c7753b157459b79e3215dc962ca48f58c2cd7650df67d2dd7bda0880c682791f32b35c504e43e77b43c3e4e541f86e35a8293a54fb46e6b16af54d3a4eda458f1a7c8bc1b7479861ca7043337180e40079d9cdccb7e051ada9b6c88c9ec635541e2ebf0842521c3024c826f6fd6db6fd117c74e859d5af4db04448965ab5469b71ce719939a06ef30580f50febf96c474a7d265bb63f86a822ff7b643de6b76e966a18553c2858416cf3309dd24278374bdd82b4404ef6f7f122cec93859351fc6e5ea947e3ceb9d67374fe970e593e5cd05c905e1d24f5a5484f4aadef766e498adf64f7cf04bddd602ae8137b6eea40722d0203010001a321301f301d0603551d0e04160414110b7aa9ebc840b20399f69a431f4dba6ac42a64300d06092a864886f70d01010b0500038201010007c32ad893349cf86952fb5a49cfdc9b13f5e3c800aece77b2e7e0e9c83e34052f140f357ec7e6f4b432dc1ed542218a14835acd2df2deea7efd3fd5e8f1c34e1fb39ec6a427c6e6f4178b609b369040ac1f8844b789f3694dc640de06e44b247afed11637173f36f5886170fafd74954049858c6096308fc93c1bc4dd5685fa7a1f982a422f2a3b36baa8c9500474cf2af91c39cbec1bc898d10194d368aa5e91f1137ec115087c31962d8f76cd120d28c249cf76f4c70f5baa08c70a7234ce4123be080cee789477401965cfe537b924ef36747e8caca62dfefdd1a6288dcb1c4fd2aaa6131a7ad254e9742022cfd597d2ca5c660ce9e41ff537e5a4041e37 + + \ No newline at end of file diff --git a/firebase-auth/build.gradle b/firebase-auth/build.gradle new file mode 100644 index 0000000..d44f986 --- /dev/null +++ b/firebase-auth/build.gradle @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' + +android { + namespace 'com.google.firebase.auth' + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } +} + +dependencies { + api project(':play-services-basement') + + annotationProcessor project(':safe-parcel-processor') +} diff --git a/firebase-auth/core/build.gradle b/firebase-auth/core/build.gradle new file mode 100644 index 0000000..974e386 --- /dev/null +++ b/firebase-auth/core/build.gradle @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +dependencies { + api project(':firebase-auth') + + implementation "androidx.lifecycle:lifecycle-service:$lifecycleVersion" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion" + + implementation "androidx.appcompat:appcompat:$appcompatVersion" + + implementation project(':play-services-base-core') + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutineVersion" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion" + + implementation "com.android.volley:volley:$volleyVersion" +} + +android { + namespace "org.microg.gms.firebase.auth.core" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } +} diff --git a/firebase-auth/core/src/main/AndroidManifest.xml b/firebase-auth/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..89a122f --- /dev/null +++ b/firebase-auth/core/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/firebase-auth/core/src/main/assets/recaptcha.html b/firebase-auth/core/src/main/assets/recaptcha.html new file mode 100644 index 0000000..3da22b3 --- /dev/null +++ b/firebase-auth/core/src/main/assets/recaptcha.html @@ -0,0 +1,54 @@ + + + + +

+
+ + + + + + + + + + + + + + +
+ + + + + + + + diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt new file mode 100644 index 0000000..afcb0d4 --- /dev/null +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt @@ -0,0 +1,663 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.firebase.auth + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build.VERSION.SDK_INT +import android.os.Handler +import android.os.Parcel +import android.provider.Telephony +import android.telephony.SmsMessage +import android.util.Log +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import com.google.firebase.auth.ActionCodeSettings +import com.google.firebase.auth.EmailAuthCredential +import com.google.firebase.auth.PhoneAuthCredential +import com.google.firebase.auth.UserProfileChangeRequest +import com.google.firebase.auth.api.internal.* +import org.json.JSONArray +import org.json.JSONObject +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.common.PackageUtils +import org.microg.gms.utils.digest +import org.microg.gms.utils.getCertificates + +private const val TAG = "GmsFirebaseAuth" + +fun JSONObject.getStringOrNull(key: String) = if (has(key)) getString(key) else null +fun JSONObject.getJSONArrayOrNull(key: String) = if (has(key)) getJSONArray(key) else null +fun JSONArray?.orEmpty() = this ?: JSONArray() +fun JSONObject.getJSONArrayLength(key: String) = getJSONArrayOrNull(key).orEmpty().length() + +private val ActionCodeSettings.requestTypeAsString: String + get() = when (requestType) { + 1 -> "PASSWORD_RESET" + 2 -> "OLD_EMAIL_AGREE" + 3 -> "NEW_EMAIL_ACCEPT" + 4 -> "VERIFY_EMAIL" + 5 -> "RECOVER_EMAIL" + 6 -> "EMAIL_SIGNIN" + 7 -> "VERIFY_AND_CHANGE_EMAIL" + 8 -> "REVERT_SECOND_FACTOR_ADDITION" + else -> "OOB_REQ_TYPE_UNSPECIFIED" + } + +private val UserProfileChangeRequest.deleteAttributeList: List + get() { + val list = arrayListOf() + if (shouldRemoveDisplayName) list.add("DISPLAY_NAME") + if (shouldRemovePhotoUri) list.add("PHOTO_URL") + return list + } + +private fun Intent.getSmsMessages(): Array { + return if (SDK_INT >= 19) { + Telephony.Sms.Intents.getMessagesFromIntent(this) + } else { + (getSerializableExtra("pdus") as? Array)?.map { SmsMessage.createFromPdu(it) }.orEmpty().toTypedArray() + } +} + +class FirebaseAuthService : BaseService(TAG, GmsService.FIREBASE_AUTH) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService?) { + PackageUtils.getAndCheckCallingPackage(this, request.packageName) + val apiKey = request.extras?.getString(Constants.EXTRA_API_KEY) + val libraryVersion = request.extras?.getString(Constants.EXTRA_LIBRARY_VERSION) + if (apiKey == null) { + callback.onPostInitComplete(CommonStatusCodes.DEVELOPER_ERROR, null, null) + } else { + callback.onPostInitComplete(0, FirebaseAuthServiceImpl(this, lifecycle, request.packageName, libraryVersion, apiKey).asBinder(), null) + } + } +} + +class FirebaseAuthServiceImpl(private val context: Context, override val lifecycle: Lifecycle, private val packageName: String, private val libraryVersion: String?, private val apiKey: String) : IFirebaseAuthService.Stub(), LifecycleOwner { + private val client by lazy { IdentityToolkitClient(context, apiKey, packageName, context.packageManager.getCertificates(packageName).firstOrNull()?.digest("SHA1")) } + private var authorizedDomain: String? = null + + private suspend fun getAuthorizedDomain(): String { + authorizedDomain?.let { return it } + val authorizedDomain = try { + client.getProjectConfig().getJSONArray("authorizedDomains").getString(0) + } catch (e: Exception) { + Log.w(TAG, e) + "localhost" + } + this.authorizedDomain = authorizedDomain + return authorizedDomain + } + + private suspend fun refreshTokenResponse(cachedState: String): GetTokenResponse { + var tokenResponse = GetTokenResponse.parseJson(cachedState) + if (System.currentTimeMillis() + 300000L < tokenResponse.issuedAt + tokenResponse.expiresIn * 1000) { + return tokenResponse + } + return client.getTokenByRefreshToken(tokenResponse.refreshToken).toGetTokenResponse() + } + + private fun JSONObject.toGetTokenResponse() = GetTokenResponse().apply { + refreshToken = getStringOrNull("refresh_token") + accessToken = getStringOrNull("access_token") + expiresIn = getStringOrNull("expires_in")?.toLong() + tokenType = getStringOrNull("token_type") + } + + private fun JSONObject.toGetAccountInfoUser(): GetAccountInfoUser = GetAccountInfoUser().apply { + localId = getStringOrNull("localId") + email = getStringOrNull("email") + isEmailVerified = optBoolean("emailVerified") + displayName = getStringOrNull("displayName") + photoUrl = getStringOrNull("photoUrl") + for (i in 0 until getJSONArrayLength("providerUserInfo")) { + getJSONArray("providerUserInfo").getJSONObject(i).run { + providerInfoList.providerUserInfos.add(ProviderUserInfo().apply { + federatedId = getStringOrNull("federatedId") + displayName = getStringOrNull("displayName") + photoUrl = getStringOrNull("photoUrl") + providerId = getStringOrNull("providerId") + phoneNumber = getStringOrNull("phoneNumber") + email = getStringOrNull("email") + rawUserInfo = this@run.toString() + }) + } + } + password = getStringOrNull("rawPassword") + phoneNumber = getStringOrNull("phoneNumber") + creationTimestamp = getStringOrNull("createdAt")?.toLong() ?: 0L + lastSignInTimestamp = getStringOrNull("lastLoginAt")?.toLong() ?: 0L + } + + private fun JSONObject.toCreateAuthUriResponse(): CreateAuthUriResponse = CreateAuthUriResponse().apply { + authUri = getStringOrNull("authUri") + isRegistered = optBoolean("registered") + providerId = getStringOrNull("providerId") + isForExistingProvider = optBoolean("forExistingProvider") + for (i in 0 until getJSONArrayLength("allProviders")) { + stringList.values.add(getJSONArray("allProviders").getString(i)) + } + for (i in 0 until getJSONArrayLength("signinMethods")) { + signInMethods.add(getJSONArray("signinMethods").getString(i)) + } + } + + override fun applyActionCode(request: ApplyActionCodeAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: applyActionCode") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun applyActionCodeCompat(code: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: applyActionCodeCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun changeEmail(request: ChangeEmailAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: changeEmail") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun changeEmailCompat(cachedState: String?, email: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: changeEmailCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun changePassword(request: ChangePasswordAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: changePassword") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun changePasswordCompat(cachedState: String?, password: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: changePasswordCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun checkActionCode(request: CheckActionCodeAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: checkActionCode") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun checkActionCodeCompat(code: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: checkActionCodeCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun confirmPasswordReset(request: ConfirmPasswordResetAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: confirmPasswordReset") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun confirmPasswordResetCompat(code: String?, newPassword: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: confirmPasswordResetCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun createUserWithEmailAndPassword(request: CreateUserWithEmailAndPasswordAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "createUserWithEmailAndPassword") + try { + val tokenResult = client.signupNewUser(email = request.email, password = request.password, tenantId = request.tenantId) + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken = idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser().apply { this.isNewUser = true } + Log.d(TAG, "callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun createUserWithEmailAndPasswordCompat(email: String?, password: String?, callbacks: IFirebaseAuthCallbacks) { + createUserWithEmailAndPassword(CreateUserWithEmailAndPasswordAidlRequest().apply { this.email = email; this.password = password }, callbacks) + } + + override fun delete(request: DeleteAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: delete") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun deleteCompat(cachedState: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: deleteCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun finalizeMfaEnrollment(request: FinalizeMfaEnrollmentAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: finalizeMfaEnrollment") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun finalizeMfaSignIn(request: FinalizeMfaSignInAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: finalizeMfaSignIn") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun getAccessToken(request: GetAccessTokenAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "getAccessToken") + try { + callbacks.onGetTokenResponse(client.getTokenByRefreshToken(request.refreshToken).toGetTokenResponse()) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun getAccessTokenCompat(refreshToken: String?, callbacks: IFirebaseAuthCallbacks) { + getAccessToken(GetAccessTokenAidlRequest().apply { this.refreshToken = refreshToken }, callbacks) + } + + override fun getProvidersForEmail(request: GetProvidersForEmailAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "getProvidersForEmail") + try { + callbacks.onCreateAuthUriResponse(client.createAuthUri(identifier = request.email, tenantId = request.tenantId).toCreateAuthUriResponse()) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun getProvidersForEmailCompat(email: String?, callbacks: IFirebaseAuthCallbacks) { + getProvidersForEmail(GetProvidersForEmailAidlRequest().apply { this.email = email }, callbacks) + } + + override fun linkEmailAuthCredential(request: LinkEmailAuthCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "linkEmailAuthCredential") + try { + val getTokenResponse = refreshTokenResponse(request.cachedState) + val accountInfoResult = client.getAccountInfo(idToken = getTokenResponse.accessToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser() + val setAccountInfo = client.setAccountInfo(idToken = getTokenResponse.accessToken, localId = accountInfoResult.localId, email = request.email, password = request.password).toGetAccountInfoUser() + accountInfoResult.email = setAccountInfo.email + accountInfoResult.isEmailVerified = setAccountInfo.isEmailVerified + accountInfoResult.providerInfoList = setAccountInfo.providerInfoList + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun linkEmailAuthCredentialCompat(email: String?, password: String?, cachedState: String?, callbacks: IFirebaseAuthCallbacks) { + linkEmailAuthCredential(LinkEmailAuthCredentialAidlRequest().apply { this.email = email; this.password = password; this.cachedState = cachedState }, callbacks) + } + + override fun linkFederatedCredential(request: LinkFederatedCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: linkFederatedCredential") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun linkFederatedCredentialCompat(cachedState: String?, verifyAssertionRequest: VerifyAssertionRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: linkFederatedCredentialCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun linkPhoneAuthCredential(request: LinkPhoneAuthCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: linkPhoneAuthCredential") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun linkPhoneAuthCredentialCompat(cachedState: String?, credential: PhoneAuthCredential?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: linkPhoneAuthCredentialCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun reload(request: ReloadAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + try { + Log.d(TAG, "reload") + val getTokenResponse = refreshTokenResponse(request.cachedState) + val accountInfoResult = client.getAccountInfo(idToken = getTokenResponse.accessToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser() + Log.d(TAG, "callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun reloadCompat(cachedState: String?, callbacks: IFirebaseAuthCallbacks) { + reload(ReloadAidlRequest().apply { this.cachedState = cachedState }, callbacks) + } + + override fun sendEmailVerification(request: SendEmailVerificationWithSettingsAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + try { + Log.d(TAG, "sendEmailVerification") + client.getOobConfirmationCode( + requestType = "VERIFY_EMAIL", + idToken = request.token, + iOSBundleId = request.settings?.iOSBundle, + iOSAppStoreId = request.settings?.iOSAppStoreId, + continueUrl = request.settings?.url, + androidInstallApp = request.settings?.androidInstallApp, + androidMinimumVersion = request.settings?.androidMinimumVersion, + androidPackageName = request.settings?.androidPackageName, + canHandleCodeInApp = request.settings?.handleCodeInApp + ) + callbacks.onEmailVerificationResponse() + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun sendEmailVerificationCompat(token: String?, actionCodeSettings: ActionCodeSettings?, callbacks: IFirebaseAuthCallbacks) { + sendEmailVerification(SendEmailVerificationWithSettingsAidlRequest().apply { this.token = token; this.settings = actionCodeSettings }, callbacks) + } + + override fun sendVerificationCode(request: SendVerificationCodeAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + try { + Log.d(TAG, "sendVerificationCode") + val reCaptchaToken = when { + request.request.recaptchaToken != null -> request.request.recaptchaToken + ReCaptchaOverlayService.isSupported(context) -> ReCaptchaOverlayService.awaitToken(context, apiKey, getAuthorizedDomain()) + ReCaptchaActivity.isSupported(context) -> ReCaptchaActivity.awaitToken(context, apiKey, getAuthorizedDomain()) + else -> throw RuntimeException("No recaptcha token available") + } + var sessionInfo: String? = null + var registered = true + val receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + var smsCode: String? = null + for (message in intent.getSmsMessages()) { + smsCode = Regex("\\b([0-9]{6})\\b").find(message.messageBody)?.groups?.get(1)?.value + ?: continue + Log.d(TAG, "Received SMS verification code: $smsCode") + break + } + if (smsCode == null) return + registered = false + context.unregisterReceiver(this) + try { + callbacks.onVerificationCompletedResponse(PhoneAuthCredential().apply { + this.phoneNumber = request.request.phoneNumber + this.sessionInfo = sessionInfo + this.smsCode = smsCode + }) + Log.d(TAG, "callback: onVerificationCompletedResponse") + } catch (e: Exception) { + Log.w(TAG, e) + } + } + } + context.registerReceiver(receiver, IntentFilter("android.provider.Telephony.SMS_RECEIVED")) + var timeout = request.request.timeoutInSeconds * 1000L + if (timeout <= 0L) timeout = 120000L + Handler().postDelayed({ + if (registered) { + Log.d(TAG, "Waited ${timeout}ms for verification code SMS, timeout.") + context.unregisterReceiver(receiver) + callbacks.onVerificationAutoTimeOut(sessionInfo) + Log.d(TAG, "callback: onVerificationAutoTimeOut") + } + }, timeout) + sessionInfo = client.sendVerificationCode(phoneNumber = request.request.phoneNumber, reCaptchaToken = reCaptchaToken).getString("sessionInfo") + callbacks.onSendVerificationCodeResponse(sessionInfo) + Log.d(TAG, "callback: onSendVerificationCodeResponse") + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun sendVerificationCodeCompat(request: SendVerificationCodeRequest, callbacks: IFirebaseAuthCallbacks) { + sendVerificationCode(SendVerificationCodeAidlRequest().apply { this.request = request }, callbacks) + } + + override fun sendGetOobConfirmationCodeEmail(request: SendGetOobConfirmationCodeEmailAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + try { + Log.d(TAG, "sendGetOobConfirmationCodeEmail") + client.getOobConfirmationCode( + requestType = request.settings?.requestTypeAsString ?: "OOB_REQ_TYPE_UNSPECIFIED", + email = request.email, + iOSBundleId = request.settings?.iOSBundle, + iOSAppStoreId = request.settings?.iOSAppStoreId, + continueUrl = request.settings?.url, + androidInstallApp = request.settings?.androidInstallApp, + androidMinimumVersion = request.settings?.androidMinimumVersion, + androidPackageName = request.settings?.androidPackageName, + canHandleCodeInApp = request.settings?.handleCodeInApp + ) + Log.d(TAG, "callback: onResetPasswordResponse") + callbacks.onResetPasswordResponse(null) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun sendGetOobConfirmationCodeEmailCompat(email: String?, actionCodeSettings: ActionCodeSettings?, callbacks: IFirebaseAuthCallbacks) { + sendGetOobConfirmationCodeEmail(SendGetOobConfirmationCodeEmailAidlRequest().apply { this.email = email; this.settings = actionCodeSettings }, callbacks) + } + + override fun setFirebaseUiVersion(request: SetFirebaseUiVersionAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: setFirebaseUiVersion") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun setFirebaseUIVersionCompat(firebaseUiVersion: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: setFirebaseUIVersionCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun signInAnonymously(request: SignInAnonymouslyAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "signInAnonymously") + try { + val tokenResult = client.signupNewUser(tenantId = request.tenantId) + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken = idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser().apply { this.isNewUser = true } + Log.d(TAG, "callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun signInAnonymouslyCompat(callbacks: IFirebaseAuthCallbacks) { + signInAnonymously(SignInAnonymouslyAidlRequest(), callbacks) + } + + override fun signInWithCredential(request: SignInWithCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "signInWithCredential request: ${request.request}") + try { + val tokenResult = client.verifyAssertion(request.request.requestUri, request.request.postBody, request.request.returnSecureToken, request.request.returnIdpCredential) + Log.d(TAG, "signInWithCredential callback: $tokenResult ") + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken = idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser() + Log.d(TAG, "signInWithCredential callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "signInWithCredential callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun signInWithCredentialCompat(verifyAssertionRequest: VerifyAssertionRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "signInWithCredentialCompat verifyAssertionRequest: $verifyAssertionRequest") + signInWithCredential(SignInWithCredentialAidlRequest(verifyAssertionRequest), callbacks) + } + + override fun signInWithCustomToken(request: SignInWithCustomTokenAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "signInWithCustomToken") + try { + val tokenResult = client.verifyCustomToken(token = request.token) + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val isNewUser = tokenResult.optBoolean("isNewUser") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken = idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser().apply { this.isNewUser = isNewUser } + Log.d(TAG, "callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun signInWithCustomTokenCompat(token: String, callbacks: IFirebaseAuthCallbacks) { + signInWithCustomToken(SignInWithCustomTokenAidlRequest().apply { this.token = token }, callbacks) + } + + override fun signInWithEmailAndPassword(request: SignInWithEmailAndPasswordAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "signInWithEmailAndPassword") + try { + val tokenResult = client.verifyPassword(email = request.email, password = request.password, tenantId = request.tenantId) + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken = idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser() + Log.d(TAG, "callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun signInWithEmailAndPasswordCompat(email: String?, password: String?, callbacks: IFirebaseAuthCallbacks) { + signInWithEmailAndPassword(SignInWithEmailAndPasswordAidlRequest().apply { this.email = email; this.password = password }, callbacks) + } + + override fun signInWithEmailLink(request: SignInWithEmailLinkAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: signInWithEmailLink") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun signInWithEmailLinkCompat(credential: EmailAuthCredential?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: signInWithEmailLinkCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun signInWithPhoneNumber(request: SignInWithPhoneNumberAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "signInWithPhoneNumber") + try { + val tokenResult = client.verifyPhoneNumber( + phoneNumber = request.credential.phoneNumber, + temporaryProof = request.credential.temporaryProof, + sessionInfo = request.credential.sessionInfo, + code = request.credential.smsCode + ) + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val isNewUser = tokenResult.optBoolean("isNewUser") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser().apply { this.isNewUser = isNewUser } + Log.d(TAG, "callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun signInWithPhoneNumberCompat(credential: PhoneAuthCredential?, callbacks: IFirebaseAuthCallbacks) { + signInWithPhoneNumber(SignInWithPhoneNumberAidlRequest().apply { this.credential = credential }, callbacks) + } + + override fun startMfaEnrollmentWithPhoneNumber(request: StartMfaPhoneNumberEnrollmentAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: startMfaEnrollmentWithPhoneNumber") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun startMfaSignInWithPhoneNumber(request: StartMfaPhoneNumberSignInAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: startMfaSignInWithPhoneNumber") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun unenrollMfa(request: UnenrollMfaAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: unenrollMfa") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun unlinkEmailCredential(request: UnlinkEmailCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: unlinkEmailCredential") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun unlinkEmailCredentialCompat(cachedState: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: unlinkEmailCredentialCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun unlinkFederatedCredential(request: UnlinkFederatedCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: unlinkFederatedCredential") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun unlinkFederatedCredentialCompat(provider: String?, cachedState: String?, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: unlinkFederatedCredentialCompat") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + override fun updateProfile(request: UpdateProfileAidlRequest, callbacks: IFirebaseAuthCallbacks) { + lifecycleScope.launchWhenStarted { + Log.d(TAG, "updateProfile") + try { + val getTokenResponse = refreshTokenResponse(request.cachedState) + val accountInfoResult = client.getAccountInfo(idToken = getTokenResponse.accessToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser() + val setAccountInfo = client.setAccountInfo(idToken = getTokenResponse.accessToken, localId = accountInfoResult.localId, displayName = request.request.displayName, photoUrl = request.request.photoUrl, deleteAttribute = request.request.deleteAttributeList).toGetAccountInfoUser() + accountInfoResult.photoUrl = setAccountInfo.photoUrl + accountInfoResult.displayName = setAccountInfo.displayName + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } + } + + override fun updateProfileCompat(cachedState: String?, userProfileChangeRequest: UserProfileChangeRequest, callbacks: IFirebaseAuthCallbacks) { + updateProfile(UpdateProfileAidlRequest().apply { this.cachedState = cachedState; this.request = userProfileChangeRequest}, callbacks) + } + + override fun verifyBeforeUpdateEmail(request: VerifyBeforeUpdateEmailAidlRequest, callbacks: IFirebaseAuthCallbacks) { + Log.d(TAG, "Not yet implemented: verifyBeforeUpdateEmail") + callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + } + + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean { + if (super.onTransact(code, data, reply, flags)) return true + Log.d(TAG, "onTransact: $code, $data, $flags") + return false + } +} diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt new file mode 100644 index 0000000..072d4d9 --- /dev/null +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt @@ -0,0 +1,155 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.firebase.auth + +import android.content.Context +import android.util.Log +import com.android.volley.NetworkResponse +import com.android.volley.ParseError +import com.android.volley.Request.Method.GET +import com.android.volley.Request.Method.POST +import com.android.volley.Response +import com.android.volley.VolleyError +import com.android.volley.toolbox.HttpHeaderParser +import com.android.volley.toolbox.JsonObjectRequest +import com.android.volley.toolbox.JsonRequest +import com.android.volley.toolbox.Volley +import org.json.JSONArray +import org.json.JSONException +import org.json.JSONObject +import org.microg.gms.utils.singleInstanceOf +import org.microg.gms.utils.toHexString +import java.io.UnsupportedEncodingException +import java.lang.RuntimeException +import java.nio.charset.Charset +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +private const val TAG = "GmsFirebaseAuthClient" + +class IdentityToolkitClient(context: Context, private val apiKey: String, private val packageName: String? = null, private val certSha1Hash: ByteArray? = null) { + private val queue = singleInstanceOf { Volley.newRequestQueue(context.applicationContext) } + + private fun buildRelyingPartyUrl(method: String) = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/$method?key=$apiKey" + private fun buildStsUrl(method: String) = "https://securetoken.googleapis.com/v1/$method?key=$apiKey" + + private fun getRequestHeaders(): Map = hashMapOf().apply { + if (packageName != null) put("X-Android-Package", packageName) + if (certSha1Hash != null) put("X-Android-Cert", certSha1Hash.toHexString().uppercase()) + } + + private suspend fun request(method: String, data: JSONObject): JSONObject = suspendCoroutine { continuation -> + queue.add(object : JsonObjectRequest(POST, buildRelyingPartyUrl(method), data, { + continuation.resume(it) + }, { + Log.d(TAG, "Error: ${it.networkResponse?.data?.decodeToString() ?: it.message}") + continuation.resumeWithException(RuntimeException(it)) + }) { + override fun getHeaders(): Map = getRequestHeaders() + }) + } + + suspend fun createAuthUri(identifier: String? = null, tenantId: String? = null, continueUri: String? = "http://localhost"): JSONObject = + request("createAuthUri", JSONObject() + .put("identifier", identifier) + .put("tenantId", tenantId) + .put("continueUri", continueUri)) + + suspend fun getAccountInfo(idToken: String? = null): JSONObject = + request("getAccountInfo", JSONObject() + .put("idToken", idToken)) + + suspend fun getProjectConfig(): JSONObject = suspendCoroutine { continuation -> + queue.add(JsonObjectRequest(GET, buildRelyingPartyUrl("getProjectConfig"), null, { continuation.resume(it) }, { continuation.resumeWithException(RuntimeException(it)) })) + } + + suspend fun getOobConfirmationCode(requestType: String, email: String? = null, newEmail: String? = null, continueUrl: String? = null, idToken: String? = null, iOSBundleId: String? = null, iOSAppStoreId: String? = null, androidMinimumVersion: String? = null, androidInstallApp: Boolean? = null, androidPackageName: String? = null, canHandleCodeInApp: Boolean? = null): JSONObject = + request("getOobConfirmationCode", JSONObject() + .put("kind", "identitytoolkit#relyingparty") + .put("requestType", requestType) + .put("email", email) + .put("newEmail", newEmail) + .put("continueUrl", continueUrl) + .put("idToken", idToken) + .put("iOSBundleId", iOSBundleId) + .put("iOSAppStoreId", iOSAppStoreId) + .put("androidMinimumVersion", androidMinimumVersion) + .put("androidInstallApp", androidInstallApp) + .put("androidPackageName", androidPackageName) + .put("canHandleCodeInApp", canHandleCodeInApp)) + + + suspend fun sendVerificationCode(phoneNumber: String? = null, reCaptchaToken: String? = null): JSONObject = + request("sendVerificationCode", JSONObject() + .put("phoneNumber", phoneNumber) + .put("recaptchaToken", reCaptchaToken)) + + suspend fun setAccountInfo(idToken: String? = null, localId: String? = null, email: String? = null, password: String? = null, displayName: String? = null, photoUrl: String? = null, deleteAttribute: List = emptyList()): JSONObject = + request("setAccountInfo", JSONObject() + .put("idToken", idToken) + .put("localId", localId) + .put("email", email) + .put("password", password) + .put("displayName", displayName) + .put("photoUrl", photoUrl) + .put("deleteAttribute", JSONArray().apply { deleteAttribute.map { put(it) } })) + + suspend fun signupNewUser(email: String? = null, password: String? = null, tenantId: String? = null): JSONObject = + request("signupNewUser", JSONObject() + .put("email", email) + .put("password", password) + .put("tenantId", tenantId)) + + suspend fun verifyCustomToken(token: String? = null, returnSecureToken: Boolean = true): JSONObject = + request("verifyCustomToken", JSONObject() + .put("token", token) + .put("returnSecureToken", returnSecureToken)) + + suspend fun verifyAssertion(requestUri: String? = null, postBody: String? = null, returnSecureToken: Boolean = true, returnIdpCredential: Boolean = true): JSONObject = + request("verifyAssertion", JSONObject() + .put("requestUri", requestUri) + .put("postBody", postBody) + .put("returnSecureToken", returnSecureToken) + .put("returnIdpCredential", returnIdpCredential)) + + suspend fun verifyPassword(email: String? = null, password: String? = null, tenantId: String? = null, returnSecureToken: Boolean = true): JSONObject = + request("verifyPassword", JSONObject() + .put("email", email) + .put("password", password) + .put("tenantId", tenantId) + .put("returnSecureToken", returnSecureToken)) + + suspend fun verifyPhoneNumber(phoneNumber: String? = null, sessionInfo: String? = null, code: String? = null, idToken: String? = null, verificationProof: String? = null, temporaryProof: String? = null): JSONObject = + request("verifyPhoneNumber", JSONObject() + .put("verificationProof", verificationProof) + .put("code", code) + .put("idToken", idToken) + .put("temporaryProof", temporaryProof) + .put("phoneNumber", phoneNumber) + .put("sessionInfo", sessionInfo)) + + suspend fun getTokenByRefreshToken(refreshToken: String): JSONObject = suspendCoroutine { continuation -> + queue.add(object : JsonRequest(POST, buildStsUrl("token"), "grant_type=refresh_token&refresh_token=$refreshToken", { continuation.resume(it) }, { continuation.resumeWithException(RuntimeException(it)) }) { + override fun parseNetworkResponse(response: NetworkResponse): Response { + return try { + val jsonString = String(response.data, Charset.forName(HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET))) + Response.success(JSONObject(jsonString), null) + } catch (e: UnsupportedEncodingException) { + Response.error(ParseError(e)) + } catch (je: JSONException) { + Response.error(ParseError(je)) + } + } + + override fun getBodyContentType(): String { + return "application/x-www-form-urlencoded" + } + + override fun getHeaders(): Map = getRequestHeaders() + }) + } +} \ No newline at end of file diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaActivity.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaActivity.kt new file mode 100644 index 0000000..4311eb3 --- /dev/null +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaActivity.kt @@ -0,0 +1,104 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.firebase.auth + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.Intent.* +import android.os.Bundle +import android.os.ResultReceiver +import android.util.Log +import android.webkit.JavascriptInterface +import android.webkit.WebSettings +import android.webkit.WebView +import androidx.appcompat.app.AppCompatActivity +import org.microg.gms.firebase.auth.core.R +import org.microg.gms.profile.Build +import org.microg.gms.profile.ProfileManager +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +private const val TAG = "GmsFirebaseAuthCaptcha" + +class ReCaptchaActivity : AppCompatActivity() { + private val receiver: ResultReceiver? + get() = intent.getParcelableExtra(EXTRA_RESULT_RECEIVER) + private val hostname: String + get() = intent.getStringExtra(EXTRA_HOSTNAME) ?: "localhost:5000" + private var finished = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + openWebsite() + } + + @SuppressLint("SetJavaScriptEnabled", "AddJavascriptInterface") + private fun openWebsite() { + val apiKey = intent.getStringExtra(EXTRA_API_KEY) ?: return finishResult(Activity.RESULT_CANCELED) + setContentView(R.layout.activity_recaptcha) + val view = findViewById(R.id.web) + val settings = view.settings + settings.javaScriptEnabled = true + settings.useWideViewPort = false + settings.setSupportZoom(false) + settings.displayZoomControls = false + settings.cacheMode = WebSettings.LOAD_NO_CACHE + ProfileManager.ensureInitialized(this) + settings.userAgentString = Build.generateWebViewUserAgentString(settings.userAgentString) + view.addJavascriptInterface(ReCaptchaCallback(this), "MyCallback") + val captcha = assets.open("recaptcha.html").bufferedReader().readText().replace("%apikey%", apiKey) + view.loadDataWithBaseURL("https://$hostname/", captcha, null, null, "https://$hostname/") + } + + fun finishResult(resultCode: Int, token: String? = null) { + finished = true + setResult(resultCode, token?.let { Intent().apply { putExtra(EXTRA_TOKEN, it) } }) + receiver?.send(resultCode, token?.let { Bundle().apply { putString(EXTRA_TOKEN, it) } }) + finish() + } + + override fun onDestroy() { + super.onDestroy() + if (!finished) receiver?.send(Activity.RESULT_CANCELED, null) + } + + companion object { + class ReCaptchaCallback(val activity: ReCaptchaActivity) { + @JavascriptInterface + fun onReCaptchaToken(token: String) { + Log.d(TAG, "onReCaptchaToken: $token") + activity.finishResult(Activity.RESULT_OK, token) + } + } + + fun isSupported(context: Context): Boolean = true + + suspend fun awaitToken(context: Context, apiKey: String, hostname: String? = null) = suspendCoroutine { continuation -> + val intent = Intent(context, ReCaptchaActivity::class.java) + val resultReceiver = object : ResultReceiver(null) { + override fun onReceiveResult(resultCode: Int, resultData: Bundle?) { + try { + if (resultCode == Activity.RESULT_OK) { + continuation.resume(resultData?.getString(EXTRA_TOKEN)!!) + } + } catch (e: Exception) { + continuation.resumeWithException(e) + } + } + } + intent.putExtra(EXTRA_API_KEY, apiKey) + intent.putExtra(EXTRA_RESULT_RECEIVER, resultReceiver) + intent.putExtra(EXTRA_HOSTNAME, hostname) + intent.addFlags(FLAG_ACTIVITY_NEW_TASK) + intent.addFlags(FLAG_ACTIVITY_REORDER_TO_FRONT) + intent.addFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + context.startActivity(intent) + } + } +} diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaOverlayService.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaOverlayService.kt new file mode 100644 index 0000000..b04ac1c --- /dev/null +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/ReCaptchaOverlayService.kt @@ -0,0 +1,173 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.firebase.auth + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.Service +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.graphics.PixelFormat +import android.os.Bundle +import android.os.IBinder +import android.os.ResultReceiver +import android.provider.Settings +import android.util.DisplayMetrics +import android.util.Log +import android.view.* +import android.webkit.JavascriptInterface +import android.webkit.WebSettings +import android.webkit.WebView +import android.widget.FrameLayout +import org.microg.gms.firebase.auth.core.R +import org.microg.gms.profile.Build +import org.microg.gms.profile.ProfileManager +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +private const val TAG = "GmsFirebaseAuthCaptcha" + +class ReCaptchaOverlayService : Service() { + + private var receiver: ResultReceiver? = null + private var hostname: String? = null + private var apiKey: String? = null + + private var finished = false + private var container: View? = null + private var windowManager: WindowManager? = null + + override fun onBind(intent: Intent): IBinder? { + init(intent) + return null + } + + override fun onUnbind(intent: Intent?): Boolean { + finishResult(Activity.RESULT_CANCELED) + return super.onUnbind(intent) + } + + private fun init(intent: Intent) { + apiKey = intent.getStringExtra(EXTRA_API_KEY) ?: return finishResult(Activity.RESULT_CANCELED) + receiver = intent.getParcelableExtra(EXTRA_RESULT_RECEIVER) + hostname = intent.getStringExtra(EXTRA_HOSTNAME) ?: "localhost:5000" + windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager + show() + } + + @SuppressLint("SetJavaScriptEnabled", "AddJavascriptInterface") + private fun show() { + val layoutParamsType = if (android.os.Build.VERSION.SDK_INT >= 26) { + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY + } else { + WindowManager.LayoutParams.TYPE_SYSTEM_ALERT + } + + val params = WindowManager.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT, + layoutParamsType, + 0, + PixelFormat.TRANSLUCENT) + + params.gravity = Gravity.CENTER or Gravity.START + params.x = 0 + params.y = 0 + + val interceptorLayout: FrameLayout = object : FrameLayout(this) { + override fun dispatchKeyEvent(event: KeyEvent): Boolean { + if (event.action == KeyEvent.ACTION_DOWN) { + if (event.keyCode == KeyEvent.KEYCODE_BACK || event.keyCode == KeyEvent.KEYCODE_HOME) { + finishResult(Activity.RESULT_CANCELED) + return true + } + } + return super.dispatchKeyEvent(event) + } + } + + val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater? + if (inflater != null) { + val container = inflater.inflate(R.layout.activity_recaptcha, interceptorLayout) + this.container = container + container.setBackgroundResource(androidx.appcompat.R.drawable.abc_dialog_material_background) + val pad = (5.0 * (resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)).toInt() + container.setOnTouchListener { v, _ -> + v.performClick() + finishResult(Activity.RESULT_CANCELED) + return@setOnTouchListener true + } + val view = container.findViewById(R.id.web) + view.setPadding(pad, pad, pad, pad) + val settings = view.settings + settings.javaScriptEnabled = true + settings.useWideViewPort = false + settings.setSupportZoom(false) + settings.displayZoomControls = false + settings.cacheMode = WebSettings.LOAD_NO_CACHE + ProfileManager.ensureInitialized(this) + settings.userAgentString = Build.generateWebViewUserAgentString(settings.userAgentString) + view.addJavascriptInterface(ReCaptchaCallback(this), "MyCallback") + val captcha = assets.open("recaptcha.html").bufferedReader().readText().replace("%apikey%", apiKey!!) + view.loadDataWithBaseURL("https://$hostname/", captcha, null, null, "https://$hostname/") + windowManager?.addView(container, params) + } + } + + fun finishResult(resultCode: Int, token: String? = null) { + if (!finished) { + finished = true + receiver?.send(resultCode, token?.let { Bundle().apply { putString(EXTRA_TOKEN, it) } }) + } + container?.let { windowManager?.removeView(it) } + } + + companion object { + + private val recaptchaServiceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { + Log.d(TAG, "onReCaptchaToken: onServiceConnected: $name") + } + + override fun onServiceDisconnected(name: ComponentName?) { + Log.d(TAG, "onReCaptchaToken: onServiceDisconnected: $name") + } + } + + class ReCaptchaCallback(private val overlay: ReCaptchaOverlayService) { + @JavascriptInterface + fun onReCaptchaToken(token: String) { + Log.d(TAG, "onReCaptchaToken: $token") + overlay.finishResult(Activity.RESULT_OK, token) + } + } + + fun isSupported(context: Context): Boolean = android.os.Build.VERSION.SDK_INT < 23 || Settings.canDrawOverlays(context) + + suspend fun awaitToken(context: Context, apiKey: String, hostname: String? = null) = suspendCoroutine { continuation -> + val intent = Intent(context, ReCaptchaOverlayService::class.java) + val resultReceiver = object : ResultReceiver(null) { + override fun onReceiveResult(resultCode: Int, resultData: Bundle?) { + context.unbindService(recaptchaServiceConnection) + try { + if (resultCode == Activity.RESULT_OK) { + continuation.resume(resultData?.getString(EXTRA_TOKEN)!!) + } + } catch (e: Exception) { + continuation.resumeWithException(e) + } + } + } + intent.putExtra(EXTRA_API_KEY, apiKey) + intent.putExtra(EXTRA_RESULT_RECEIVER, resultReceiver) + intent.putExtra(EXTRA_HOSTNAME, hostname) + context.bindService(intent, recaptchaServiceConnection, BIND_AUTO_CREATE) + } + } +} diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/extensions.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/extensions.kt new file mode 100644 index 0000000..66fd1b1 --- /dev/null +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/extensions.kt @@ -0,0 +1,11 @@ +/** + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.firebase.auth + +const val EXTRA_TOKEN = "token" +const val EXTRA_API_KEY = "api_key" +const val EXTRA_HOSTNAME = "hostname" +const val EXTRA_RESULT_RECEIVER = "receiver" \ No newline at end of file diff --git a/firebase-auth/core/src/main/res/layout/activity_recaptcha.xml b/firebase-auth/core/src/main/res/layout/activity_recaptcha.xml new file mode 100644 index 0000000..36ea80b --- /dev/null +++ b/firebase-auth/core/src/main/res/layout/activity_recaptcha.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/firebase-auth/src/main/AndroidManifest.xml b/firebase-auth/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c256eb4 --- /dev/null +++ b/firebase-auth/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/ActionCodeSettings.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/ActionCodeSettings.aidl new file mode 100644 index 0000000..adedd19 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/ActionCodeSettings.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth; + +parcelable ActionCodeSettings; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/EmailAuthCredential.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/EmailAuthCredential.aidl new file mode 100644 index 0000000..20cabbd --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/EmailAuthCredential.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth; + +parcelable EmailAuthCredential; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/PhoneAuthCredential.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/PhoneAuthCredential.aidl new file mode 100644 index 0000000..b3d6abb --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/PhoneAuthCredential.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth; + +parcelable PhoneAuthCredential; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/UserProfileChangeRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/UserProfileChangeRequest.aidl new file mode 100644 index 0000000..123af80 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/UserProfileChangeRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth; + +parcelable UserProfileChangeRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.aidl new file mode 100644 index 0000000..9e0520b --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable ApplyActionCodeAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.aidl new file mode 100644 index 0000000..e95043a --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable ChangeEmailAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.aidl new file mode 100644 index 0000000..55457b4 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable ChangePasswordAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.aidl new file mode 100644 index 0000000..6d4afa8 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable CheckActionCodeAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.aidl new file mode 100644 index 0000000..12f79de --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable ConfirmPasswordResetAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateAuthUriResponse.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateAuthUriResponse.aidl new file mode 100644 index 0000000..fae4215 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateAuthUriResponse.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable CreateAuthUriResponse; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.aidl new file mode 100644 index 0000000..9191617 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable CreateUserWithEmailAndPasswordAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/DeleteAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/DeleteAidlRequest.aidl new file mode 100644 index 0000000..d45bda0 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/DeleteAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable DeleteAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.aidl new file mode 100644 index 0000000..50bfa3b --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable FinalizeMfaEnrollmentAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.aidl new file mode 100644 index 0000000..2453bd6 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable FinalizeMfaSignInAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.aidl new file mode 100644 index 0000000..cc44192 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable GetAccessTokenAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccountInfoUser.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccountInfoUser.aidl new file mode 100644 index 0000000..50c3316 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetAccountInfoUser.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable GetAccountInfoUser; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.aidl new file mode 100644 index 0000000..0760f59 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable GetProvidersForEmailAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetTokenResponse.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetTokenResponse.aidl new file mode 100644 index 0000000..b6838f6 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/GetTokenResponse.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable GetTokenResponse; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl new file mode 100644 index 0000000..cd2ea94 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl @@ -0,0 +1,22 @@ +package com.google.firebase.auth.api.internal; + +import com.google.android.gms.common.api.Status; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.api.internal.CreateAuthUriResponse; +import com.google.firebase.auth.api.internal.GetAccountInfoUser; +import com.google.firebase.auth.api.internal.GetTokenResponse; +import com.google.firebase.auth.api.internal.ResetPasswordResponse; + +interface IFirebaseAuthCallbacks { + oneway void onGetTokenResponse(in GetTokenResponse response) = 0; + oneway void onGetTokenResponseAndUser(in GetTokenResponse response, in GetAccountInfoUser user) = 1; + oneway void onCreateAuthUriResponse(in CreateAuthUriResponse response) = 2; + oneway void onResetPasswordResponse(in ResetPasswordResponse response) = 3; + oneway void onFailure(in Status status) = 4; + oneway void onDeleteAccountResponse() = 5; + oneway void onEmailVerificationResponse() = 6; + //oneway void onSetAccountInfo(String s) = 7 + oneway void onSendVerificationCodeResponse(String sessionInfo) = 8; + oneway void onVerificationCompletedResponse(in PhoneAuthCredential credential) = 9; + oneway void onVerificationAutoTimeOut(String sessionInfo) = 10; +} diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthService.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthService.aidl new file mode 100644 index 0000000..0714492 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthService.aidl @@ -0,0 +1,108 @@ +package com.google.firebase.auth.api.internal; + +import com.google.firebase.auth.api.internal.ApplyActionCodeAidlRequest; +import com.google.firebase.auth.api.internal.ChangeEmailAidlRequest; +import com.google.firebase.auth.api.internal.ChangePasswordAidlRequest; +import com.google.firebase.auth.api.internal.CheckActionCodeAidlRequest; +import com.google.firebase.auth.api.internal.ConfirmPasswordResetAidlRequest; +import com.google.firebase.auth.api.internal.CreateUserWithEmailAndPasswordAidlRequest; +import com.google.firebase.auth.api.internal.DeleteAidlRequest; +import com.google.firebase.auth.api.internal.FinalizeMfaEnrollmentAidlRequest; +import com.google.firebase.auth.api.internal.FinalizeMfaSignInAidlRequest; +import com.google.firebase.auth.api.internal.GetAccessTokenAidlRequest; +import com.google.firebase.auth.api.internal.GetProvidersForEmailAidlRequest; +import com.google.firebase.auth.api.internal.IFirebaseAuthCallbacks; +import com.google.firebase.auth.api.internal.LinkEmailAuthCredentialAidlRequest; +import com.google.firebase.auth.api.internal.LinkFederatedCredentialAidlRequest; +import com.google.firebase.auth.api.internal.LinkPhoneAuthCredentialAidlRequest; +import com.google.firebase.auth.api.internal.ReloadAidlRequest; +import com.google.firebase.auth.api.internal.SendEmailVerificationWithSettingsAidlRequest; +import com.google.firebase.auth.api.internal.SendGetOobConfirmationCodeEmailAidlRequest; +import com.google.firebase.auth.api.internal.SendVerificationCodeAidlRequest; +import com.google.firebase.auth.api.internal.SendVerificationCodeRequest; +import com.google.firebase.auth.api.internal.SetFirebaseUiVersionAidlRequest; +import com.google.firebase.auth.api.internal.SignInAnonymouslyAidlRequest; +import com.google.firebase.auth.api.internal.SignInWithCredentialAidlRequest; +import com.google.firebase.auth.api.internal.SignInWithCustomTokenAidlRequest; +import com.google.firebase.auth.api.internal.SignInWithEmailAndPasswordAidlRequest; +import com.google.firebase.auth.api.internal.SignInWithEmailLinkAidlRequest; +import com.google.firebase.auth.api.internal.SignInWithPhoneNumberAidlRequest; +import com.google.firebase.auth.api.internal.StartMfaPhoneNumberEnrollmentAidlRequest; +import com.google.firebase.auth.api.internal.StartMfaPhoneNumberSignInAidlRequest; +import com.google.firebase.auth.api.internal.UnenrollMfaAidlRequest; +import com.google.firebase.auth.api.internal.UnlinkEmailCredentialAidlRequest; +import com.google.firebase.auth.api.internal.UnlinkFederatedCredentialAidlRequest; +import com.google.firebase.auth.api.internal.UpdateProfileAidlRequest; +import com.google.firebase.auth.api.internal.VerifyAssertionRequest; +import com.google.firebase.auth.api.internal.VerifyBeforeUpdateEmailAidlRequest; +import com.google.firebase.auth.ActionCodeSettings; +import com.google.firebase.auth.EmailAuthCredential; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.UserProfileChangeRequest; + +interface IFirebaseAuthService { + void getAccessTokenCompat(String refreshToken, IFirebaseAuthCallbacks callbacks) = 0; + void signInWithCustomTokenCompat(String token, IFirebaseAuthCallbacks callbacks) = 1; + void signInWithCredentialCompat(in VerifyAssertionRequest verifyAssertionRequest, IFirebaseAuthCallbacks callbacks) = 2; + void updateProfileCompat(String cachedState, in UserProfileChangeRequest userProfileChangeRequest, IFirebaseAuthCallbacks callbacks) = 3; + void changeEmailCompat(String cachedState, String email, IFirebaseAuthCallbacks callbacks) = 4; + void changePasswordCompat(String cachedState, String password, IFirebaseAuthCallbacks callbacks) = 5; + void createUserWithEmailAndPasswordCompat(String email, String password, IFirebaseAuthCallbacks callbacks) = 6; + void signInWithEmailAndPasswordCompat(String email, String password, IFirebaseAuthCallbacks callbacks) = 7; + void getProvidersForEmailCompat(String email, IFirebaseAuthCallbacks callbacks) = 8; + + void linkEmailAuthCredentialCompat(String email, String password, String cachedState, IFirebaseAuthCallbacks callbacks) = 10; + void linkFederatedCredentialCompat(String cachedState, in VerifyAssertionRequest verifyAssertionRequest, IFirebaseAuthCallbacks callbacks) = 11; + void unlinkEmailCredentialCompat(String cachedState, IFirebaseAuthCallbacks callbacks) = 12; + void unlinkFederatedCredentialCompat(String provider, String cachedState, IFirebaseAuthCallbacks callbacks) = 13; + void reloadCompat(String cachedState, IFirebaseAuthCallbacks callbacks) = 14; + void signInAnonymouslyCompat(IFirebaseAuthCallbacks callbacks) = 15; + void deleteCompat(String cachedState, IFirebaseAuthCallbacks callbacks) = 16; + void checkActionCodeCompat(String code, IFirebaseAuthCallbacks callbacks) = 18; + void applyActionCodeCompat(String code, IFirebaseAuthCallbacks callbacks) = 19; + void confirmPasswordResetCompat(String code, String newPassword, IFirebaseAuthCallbacks callbacks) = 20; + void sendVerificationCodeCompat(in SendVerificationCodeRequest request, IFirebaseAuthCallbacks callbacks) = 21; + void signInWithPhoneNumberCompat(in PhoneAuthCredential credential, IFirebaseAuthCallbacks callbacks) = 22; + void linkPhoneAuthCredentialCompat(String cachedState, in PhoneAuthCredential credential, IFirebaseAuthCallbacks callbacks) = 23; + + void sendEmailVerificationCompat(String token, in ActionCodeSettings actionCodeSettings, IFirebaseAuthCallbacks callbacks) = 25; + void setFirebaseUIVersionCompat(String firebaseUiVersion, IFirebaseAuthCallbacks callbacks) = 26; + void sendGetOobConfirmationCodeEmailCompat(String email, in ActionCodeSettings actionCodeSettings, IFirebaseAuthCallbacks callbacks) = 27; + void signInWithEmailLinkCompat(in EmailAuthCredential credential, IFirebaseAuthCallbacks callbacks) = 28; + + void getAccessToken(in GetAccessTokenAidlRequest request, IFirebaseAuthCallbacks callbacks) = 100; + void signInWithCustomToken(in SignInWithCustomTokenAidlRequest request, IFirebaseAuthCallbacks callbacks) = 101; + void signInWithCredential(in SignInWithCredentialAidlRequest request, IFirebaseAuthCallbacks callbacks) = 102; + void updateProfile(in UpdateProfileAidlRequest request, IFirebaseAuthCallbacks callbacks) = 103; + void changeEmail(in ChangeEmailAidlRequest request, IFirebaseAuthCallbacks callbacks) = 104; + void changePassword(in ChangePasswordAidlRequest request, IFirebaseAuthCallbacks callbacks) = 105; + void createUserWithEmailAndPassword(in CreateUserWithEmailAndPasswordAidlRequest request, IFirebaseAuthCallbacks callbacks) = 106; + void signInWithEmailAndPassword(in SignInWithEmailAndPasswordAidlRequest request, IFirebaseAuthCallbacks callbacks) = 107; + void getProvidersForEmail(in GetProvidersForEmailAidlRequest request, IFirebaseAuthCallbacks callbacks) = 108; + + void linkEmailAuthCredential(in LinkEmailAuthCredentialAidlRequest request, IFirebaseAuthCallbacks callbacks) = 110; + void linkFederatedCredential(in LinkFederatedCredentialAidlRequest request, IFirebaseAuthCallbacks callbacks) = 111; + void unlinkEmailCredential(in UnlinkEmailCredentialAidlRequest request, IFirebaseAuthCallbacks callbacks) = 112; + void unlinkFederatedCredential(in UnlinkFederatedCredentialAidlRequest request, IFirebaseAuthCallbacks callbacks) = 113; + void reload(in ReloadAidlRequest request, IFirebaseAuthCallbacks callbacks) = 114; + void signInAnonymously(in SignInAnonymouslyAidlRequest request, IFirebaseAuthCallbacks callbacks) = 115; + void delete(in DeleteAidlRequest request, IFirebaseAuthCallbacks callbacks) = 116; + void checkActionCode(in CheckActionCodeAidlRequest request, IFirebaseAuthCallbacks callbacks) = 118; + void applyActionCode(in ApplyActionCodeAidlRequest request, IFirebaseAuthCallbacks callbacks) = 119; + void confirmPasswordReset(in ConfirmPasswordResetAidlRequest request, IFirebaseAuthCallbacks callbacks) = 120; + void sendVerificationCode(in SendVerificationCodeAidlRequest request, IFirebaseAuthCallbacks callbacks) = 121; + void signInWithPhoneNumber(in SignInWithPhoneNumberAidlRequest request, IFirebaseAuthCallbacks callbacks) = 122; + void linkPhoneAuthCredential(in LinkPhoneAuthCredentialAidlRequest request, IFirebaseAuthCallbacks callbacks) = 123; + + void sendEmailVerification(in SendEmailVerificationWithSettingsAidlRequest request, IFirebaseAuthCallbacks callbacks) = 125; + void setFirebaseUiVersion(in SetFirebaseUiVersionAidlRequest request, IFirebaseAuthCallbacks callbacks) = 126; + void sendGetOobConfirmationCodeEmail(in SendGetOobConfirmationCodeEmailAidlRequest request, IFirebaseAuthCallbacks callbacks) = 127; + void signInWithEmailLink(in SignInWithEmailLinkAidlRequest request, IFirebaseAuthCallbacks callbacks) = 128; + + void startMfaEnrollmentWithPhoneNumber(in StartMfaPhoneNumberEnrollmentAidlRequest request, IFirebaseAuthCallbacks callbacks) = 129; + void unenrollMfa(in UnenrollMfaAidlRequest request, IFirebaseAuthCallbacks callbacks) = 130; + void finalizeMfaEnrollment(in FinalizeMfaEnrollmentAidlRequest request, IFirebaseAuthCallbacks callbacks) = 131; + void startMfaSignInWithPhoneNumber(in StartMfaPhoneNumberSignInAidlRequest request, IFirebaseAuthCallbacks callbacks) = 132; + void finalizeMfaSignIn(in FinalizeMfaSignInAidlRequest request, IFirebaseAuthCallbacks callbacks) = 133; + void verifyBeforeUpdateEmail(in VerifyBeforeUpdateEmailAidlRequest request, IFirebaseAuthCallbacks callbacks) = 134; +} diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.aidl new file mode 100644 index 0000000..bee0011 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable LinkEmailAuthCredentialAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.aidl new file mode 100644 index 0000000..3894901 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable LinkFederatedCredentialAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.aidl new file mode 100644 index 0000000..62caaf6 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable LinkPhoneAuthCredentialAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ReloadAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ReloadAidlRequest.aidl new file mode 100644 index 0000000..5057e2e --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ReloadAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable ReloadAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ResetPasswordResponse.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ResetPasswordResponse.aidl new file mode 100644 index 0000000..572587f --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/ResetPasswordResponse.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable ResetPasswordResponse; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.aidl new file mode 100644 index 0000000..6db47c5 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SendEmailVerificationWithSettingsAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.aidl new file mode 100644 index 0000000..5e1e519 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SendGetOobConfirmationCodeEmailAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.aidl new file mode 100644 index 0000000..21b4971 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SendVerificationCodeAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.aidl new file mode 100644 index 0000000..3f797f5 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SendVerificationCodeRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.aidl new file mode 100644 index 0000000..39ff41a --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SetFirebaseUiVersionAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.aidl new file mode 100644 index 0000000..2b4c21f --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SignInAnonymouslyAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.aidl new file mode 100644 index 0000000..acda7af --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SignInWithCredentialAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.aidl new file mode 100644 index 0000000..047489e --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SignInWithCustomTokenAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.aidl new file mode 100644 index 0000000..77a277d --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SignInWithEmailAndPasswordAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.aidl new file mode 100644 index 0000000..1bb2d32 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SignInWithEmailLinkAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.aidl new file mode 100644 index 0000000..270d342 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable SignInWithPhoneNumberAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.aidl new file mode 100644 index 0000000..630a4c9 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable StartMfaPhoneNumberEnrollmentAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.aidl new file mode 100644 index 0000000..65c8063 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable StartMfaPhoneNumberSignInAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StringList.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StringList.aidl new file mode 100644 index 0000000..6244601 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/StringList.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable StringList; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.aidl new file mode 100644 index 0000000..5ce470b --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable UnenrollMfaAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.aidl new file mode 100644 index 0000000..735a319 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable UnlinkEmailCredentialAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.aidl new file mode 100644 index 0000000..eb47391 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable UnlinkFederatedCredentialAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.aidl new file mode 100644 index 0000000..db6603c --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable UpdateProfileAidlRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyAssertionRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyAssertionRequest.aidl new file mode 100644 index 0000000..7f4787f --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyAssertionRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable VerifyAssertionRequest; diff --git a/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.aidl b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.aidl new file mode 100644 index 0000000..7929892 --- /dev/null +++ b/firebase-auth/src/main/aidl/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.auth.api.internal; + +parcelable VerifyBeforeUpdateEmailAidlRequest; diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/ActionCodeSettings.java b/firebase-auth/src/main/java/com/google/firebase/auth/ActionCodeSettings.java new file mode 100644 index 0000000..df07dd6 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/ActionCodeSettings.java @@ -0,0 +1,182 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import org.microg.gms.common.PublicApi; +import org.microg.safeparcel.AutoSafeParcelable; + +/** + * Structure that contains the required continue/state URL with optional Android and iOS bundle identifiers. + * The stateUrl used to initialize this class is the link/deep link/fallback url used while constructing the Firebase dynamic link. + */ +@PublicApi +public class ActionCodeSettings extends AutoSafeParcelable { + @Field(1) + @PublicApi(exclude = true) + public String url; + @Field(2) + @PublicApi(exclude = true) + public String iOSBundle; + @Field(3) + @PublicApi(exclude = true) + public String iOSAppStoreId; + @Field(4) + @PublicApi(exclude = true) + public String androidPackageName; + @Field(5) + @PublicApi(exclude = true) + public boolean androidInstallApp; + @Field(6) + @PublicApi(exclude = true) + public String androidMinimumVersion; + @Field(7) + @PublicApi(exclude = true) + public boolean handleCodeInApp; + @Field(8) + @PublicApi(exclude = true) + public String localeHeader; + @Field(9) + @PublicApi(exclude = true) + public int requestType; + @Field(10) + @PublicApi(exclude = true) + public String dynamicLinkDomain; + + private ActionCodeSettings() { + } + + /** + * @return whether the oob code should be handled by the app. See {@link Builder#setHandleCodeInApp(boolean)} + */ + public boolean canHandleCodeInApp() { + return handleCodeInApp; + } + + /** + * @return the preference for whether to attempt to install the app if it is not present. See {@link Builder#setAndroidPackageName(String, boolean, String)} + */ + public boolean getAndroidInstallApp() { + return androidInstallApp; + } + + /** + * @return the minimum Android app version. See {@link Builder#setAndroidPackageName(String, boolean, String)} + */ + public String getAndroidMinimumVersion() { + return androidMinimumVersion; + } + + /** + * @return the Android Package Name. See {@link Builder#setAndroidPackageName(String, boolean, String)} + */ + public String getAndroidPackageName() { + return androidPackageName; + } + + /** + * @return the iOS Bundle. See {@link Builder#setIOSBundleId(String)} + */ + public String getIOSBundle() { + return iOSBundle; + } + + /** + * @return the URL. See {@link Builder#setUrl(String)} + */ + public String getUrl() { + return url; + } + + /** + * @return a new instance of {@link ActionCodeSettings.Builder}. + */ + public static Builder newBuilder() { + return new Builder(); + } + + /** + * A Builder class for {@link ActionCodeSettings}. Get an instance of this Builder using {@link #newBuilder()}. + */ + public static class Builder { + private String url; + private String iOSBundleId; + private String androidPackageName; + private boolean androidInstallApp; + private String androidMinimumVersion; + private boolean canHandleCodeInApp; + private String dynamicLinkDomain; + + public ActionCodeSettings build() { + ActionCodeSettings settings = new ActionCodeSettings(); + settings.url = url; + settings.iOSBundle = iOSBundleId; + settings.androidPackageName = androidPackageName; + settings.androidInstallApp = androidInstallApp; + settings.handleCodeInApp = canHandleCodeInApp; + settings.dynamicLinkDomain = dynamicLinkDomain; + return settings; + } + + /** + * Sets the Android package name and returns the current builder instance. + * If {@code installIfNotAvailable} is set to true and the link is opened on an android device, it will try to install the app if not already available. + * Otherwise the web URL is used. + *

+ * A minimum version string is also available. If the installed app is an older version, the user is taken to the Play Store to upgrade the app. + */ + public Builder setAndroidPackageName(String androidPackageName, boolean installIfNotAvailable, String minimumVersion) { + this.androidPackageName = androidPackageName; + this.androidInstallApp = installIfNotAvailable; + this.androidMinimumVersion = minimumVersion; + return this; + } + + /** + * Sets the optional FDL domain, overriding the default FDL domain that would be used. + * Must be one of the 5 domains configured in the Firebase console. + */ + public Builder setDynamicLinkDomain(String dynamicLinkDomain) { + this.dynamicLinkDomain = dynamicLinkDomain; + return this; + } + + /** + * The default is false. When set to true, the action code link will be sent as a universal link and will be open by the app if installed. + * In the false case, the code will be sent to the web widget first and then on continue will redirect to the app if installed. + */ + public Builder setHandleCodeInApp(boolean status) { + this.canHandleCodeInApp = status; + return this; + } + + /** + * To be used if the email link that is sent might be opened on an iOS device. + *

+ * Sets the iOS bundle Id and returns the current {@link ActionCodeSettings.Builder} instance. + */ + public Builder setIOSBundleId(String iOSBundleId) { + this.iOSBundleId = iOSBundleId; + return this; + } + + /** + * Sets the URL, which has different meanings in different contexts. For email actions, this is the state/continue URL. + * When the app is not installed, this is the web continue URL with any developer provided state appended (the continueURL query parameter). + * When the app is installed, this is contained in the Firebase dynamic link payload. + * In the case where the code is sent directly to the app and the app is installed, this is the continueURL query parameter in the dynamic link payload. + * Otherwise, when the code is handled by the widget itself, it is the payload itself. + */ + public Builder setUrl(String url) { + this.url = url; + return this; + } + } + + public static final Creator CREATOR = new AutoCreator<>(ActionCodeSettings.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/AuthCredential.java b/firebase-auth/src/main/java/com/google/firebase/auth/AuthCredential.java new file mode 100644 index 0000000..bf3b7e6 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/AuthCredential.java @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import org.microg.gms.common.PublicApi; +import org.microg.safeparcel.AutoSafeParcelable; + +/** + * Represents a credential that the Firebase Authentication server can use to authenticate a user. + */ +@PublicApi +public abstract class AuthCredential extends AutoSafeParcelable { + /** + * Returns the unique string identifier for the provider type with which the credential is associated. + */ + public abstract String getProvider(); + + /** + * Returns the unique string identifier for the sign in method with which the credential is associated. Should match that returned by {@link FirebaseAuth#fetchSignInMethodsForEmail(String)} after this user has signed in with this type of credential. + */ + public abstract String getSignInMethod(); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/DefaultOAuthCredential.java b/firebase-auth/src/main/java/com/google/firebase/auth/DefaultOAuthCredential.java new file mode 100644 index 0000000..f224434 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/DefaultOAuthCredential.java @@ -0,0 +1,66 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import com.google.firebase.auth.api.internal.VerifyAssertionRequest; + +import org.microg.gms.common.PublicApi; + +@PublicApi +public class DefaultOAuthCredential extends OAuthCredential { + @Field(1) + @PublicApi(exclude = true) + public String provider; + @Field(2) + @PublicApi(exclude = true) + public String idToken; + @Field(3) + @PublicApi(exclude = true) + public String accessToken; + @Field(4) + @PublicApi(exclude = true) + public VerifyAssertionRequest webSignInToken; + @Field(5) + @PublicApi(exclude = true) + public String pendingToken; + @Field(6) + @PublicApi(exclude = true) + public String secret; + @Field(7) + @PublicApi(exclude = true) + public String rawNonce; + + + @Override + public String getAccessToken() { + return accessToken; + } + + @Override + public String getIdToken() { + return idToken; + } + + @Override + public String getSecret() { + return secret; + } + + @Override + public String getProvider() { + return provider; + } + + @Override + public String getSignInMethod() { + return provider; + } + + public static final Creator CREATOR = new AutoCreator<>(DefaultOAuthCredential.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/EmailAuthCredential.java b/firebase-auth/src/main/java/com/google/firebase/auth/EmailAuthCredential.java new file mode 100644 index 0000000..d6adfd2 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/EmailAuthCredential.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import org.microg.gms.common.PublicApi; + +/** + * Wraps an email and password tuple for authentication purposes. + */ +@PublicApi +public class EmailAuthCredential extends AuthCredential { + @Field(1) + @PublicApi(exclude = true) + public String email; + @Field(2) + @PublicApi(exclude = true) + public String password; + @Field(3) + @PublicApi(exclude = true) + public String signInLink; + @Field(4) + @PublicApi(exclude = true) + public String cachedState; + @Field(5) + @PublicApi(exclude = true) + public boolean isForLinking; + + /** + * Returns the unique string identifier for the provider type with which the credential is associated. + */ + @Override + public String getProvider() { + return "password"; + } + + /** + * Returns either {@link EmailAuthProvider#EMAIL_LINK_SIGN_IN_METHOD} for a credential generated with {@link EmailAuthProvider#getCredentialWithLink(String, String)} or {@link EmailAuthProvider#EMAIL_PASSWORD_SIGN_IN_METHOD} for a credential generated with {@link EmailAuthProvider#getCredential(String, String)}. + */ + @Override + public String getSignInMethod() { + if (password != null && !password.isEmpty()) { + return "password"; + } + return "emailLink"; + } + + public static final Creator CREATOR = new AutoCreator<>(EmailAuthCredential.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/OAuthCredential.java b/firebase-auth/src/main/java/com/google/firebase/auth/OAuthCredential.java new file mode 100644 index 0000000..772a456 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/OAuthCredential.java @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import org.microg.gms.common.PublicApi; + +/** + * Holds credentials generated by a sign-in with a credential to an IDP that uses OAuth + */ +@PublicApi +public abstract class OAuthCredential extends AuthCredential { + /** + * Returns the OAuth access token associated with this credential. + */ + public abstract String getAccessToken(); + + /** + * Returns the OAuth ID token associated with this credential. + */ + public abstract String getIdToken(); + + /** + * Returns the OAuth secret associated with this credential. This will be null for OAuth 2.0 providers. + */ + public abstract String getSecret(); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/PhoneAuthCredential.java b/firebase-auth/src/main/java/com/google/firebase/auth/PhoneAuthCredential.java new file mode 100644 index 0000000..1798a30 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/PhoneAuthCredential.java @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import org.microg.gms.common.PublicApi; + +/** + * Wraps phone number and verification information for authentication purposes. + */ +@PublicApi +public class PhoneAuthCredential extends AuthCredential { + @Field(1) + @PublicApi(exclude = true) + public String sessionInfo; + @Field(2) + @PublicApi(exclude = true) + public String smsCode; + @Field(3) + @PublicApi(exclude = true) + public boolean hasVerificationCode; + @Field(4) + @PublicApi(exclude = true) + public String phoneNumber; + @Field(5) + @PublicApi(exclude = true) + public boolean autoCreate; + @Field(6) + @PublicApi(exclude = true) + public String temporaryProof; + @Field(7) + @PublicApi(exclude = true) + public String mfaEnrollmentId; + + /** + * Returns the unique string identifier for the provider type with which the credential is associated. + */ + @Override + public String getProvider() { + return "phone"; + } + + /** + * Returns the unique string identifier for the sign in method with which the credential is associated. Should match that returned by {@link FirebaseAuth#fetchSignInMethodsForEmail(String)} after this user has signed in with this type of credential. + */ + @Override + public String getSignInMethod() { + return "phone"; + } + + /** + * Gets the auto-retrieved SMS verification code if applicable. When SMS verification is used, you will be called back first via onCodeSent(String, PhoneAuthProvider.ForceResendingToken), and later onVerificationCompleted(PhoneAuthCredential) with a {@link PhoneAuthCredential} containing a non-null SMS code if auto-retrieval succeeded. If Firebase used another approach to verify the phone number and triggers a callback via onVerificationCompleted(PhoneAuthCredential), then SMS code can be null. + */ + public String getSmsCode() { + return smsCode; + } + + public static final Creator CREATOR = new AutoCreator<>(PhoneAuthCredential.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/UserProfileChangeRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/UserProfileChangeRequest.java new file mode 100644 index 0000000..a86c21d --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/UserProfileChangeRequest.java @@ -0,0 +1,88 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.auth; + +import android.net.Uri; + +import org.microg.gms.common.PublicApi; +import org.microg.safeparcel.AutoSafeParcelable; + +/** + * Request used to update user profile information. + */ +@PublicApi +public class UserProfileChangeRequest extends AutoSafeParcelable { + @Field(1) + @PublicApi(exclude = true) + public String displayName; + @Field(2) + @PublicApi(exclude = true) + public String photoUrl; + @Field(3) + @PublicApi(exclude = true) + public boolean shouldRemoveDisplayName; + @Field(4) + @PublicApi(exclude = true) + public boolean shouldRemovePhotoUri; + + private UserProfileChangeRequest() { + } + + public String getDisplayName() { + return displayName; + } + + public Uri getPhotoUri() { + return Uri.parse(photoUrl); + } + + /** + * The request builder. + */ + public static class Builder { + private String displayName; + private Uri photoUri; + private boolean shouldRemoveDisplayName; + private boolean shouldRemovePhotoUri; + + /** + * Sets the updated display name. + * @return the {@link UserProfileChangeRequest.Builder} for chaining + */ + public Builder setDisplayName(String displayName) { + this.displayName = displayName; + shouldRemoveDisplayName = displayName == null; + return this; + } + + /** + * Sets the updated photo {@link Uri}. + * @return the {@link UserProfileChangeRequest.Builder} for chaining + */ + public Builder setPhotoUri(Uri photoUri) { + this.photoUri = photoUri; + shouldRemovePhotoUri = photoUri == null; + return this; + } + + /** + * Returns a {@link UserProfileChangeRequest} instance + */ + public UserProfileChangeRequest build() { + UserProfileChangeRequest request = new UserProfileChangeRequest(); + request.displayName = displayName; + request.photoUrl = photoUri.toString(); + request.shouldRemoveDisplayName = shouldRemoveDisplayName; + request.shouldRemovePhotoUri = shouldRemovePhotoUri; + return request; + } + } + + public static final Creator CREATOR = new AutoCreator<>(UserProfileChangeRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.java new file mode 100644 index 0000000..d68ed77 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ApplyActionCodeAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ApplyActionCodeAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ApplyActionCodeAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.java new file mode 100644 index 0000000..70b4e10 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangeEmailAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ChangeEmailAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ChangeEmailAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.java new file mode 100644 index 0000000..70823da --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ChangePasswordAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ChangePasswordAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ChangePasswordAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.java new file mode 100644 index 0000000..57f3f94 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CheckActionCodeAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class CheckActionCodeAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(CheckActionCodeAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.java new file mode 100644 index 0000000..f9505ed --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ConfirmPasswordResetAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ConfirmPasswordResetAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ConfirmPasswordResetAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateAuthUriResponse.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateAuthUriResponse.java new file mode 100644 index 0000000..e32735a --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateAuthUriResponse.java @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.List; + +public class CreateAuthUriResponse extends AutoSafeParcelable { + @Field(2) + public String authUri; + @Field(3) + public boolean isRegistered; + @Field(4) + public String providerId; + @Field(5) + public boolean isForExistingProvider; + @Field(6) + public StringList stringList = new StringList(); + @Field(7) + public List signInMethods = new ArrayList<>(); + public static final Creator CREATOR = new AutoCreator<>(CreateAuthUriResponse.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.java new file mode 100644 index 0000000..a1eb8b9 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/CreateUserWithEmailAndPasswordAidlRequest.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class CreateUserWithEmailAndPasswordAidlRequest extends AutoSafeParcelable { + @Field(1) + public String email; + @Field(2) + public String password; + @Field(3) + public String tenantId; + + public static final Creator CREATOR = new AutoCreator<>(CreateUserWithEmailAndPasswordAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/DeleteAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/DeleteAidlRequest.java new file mode 100644 index 0000000..3d815a6 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/DeleteAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class DeleteAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(DeleteAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.java new file mode 100644 index 0000000..d76ac82 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaEnrollmentAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class FinalizeMfaEnrollmentAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(FinalizeMfaEnrollmentAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.java new file mode 100644 index 0000000..f578a74 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/FinalizeMfaSignInAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class FinalizeMfaSignInAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(FinalizeMfaSignInAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.java new file mode 100644 index 0000000..6b7d9e9 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccessTokenAidlRequest.java @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class GetAccessTokenAidlRequest extends AutoSafeParcelable { + @Field(1) + public String refreshToken; + + public static final Creator CREATOR = new AutoCreator<>(GetAccessTokenAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccountInfoUser.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccountInfoUser.java new file mode 100644 index 0000000..6113649 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetAccountInfoUser.java @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import com.google.firebase.auth.DefaultOAuthCredential; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.List; + +public class GetAccountInfoUser extends AutoSafeParcelable { + @Field(2) + public String localId; + @Field(3) + public String email; + @Field(4) + public boolean isEmailVerified; + @Field(5) + public String displayName; + @Field(6) + public String photoUrl; + @Field(7) + public ProviderUserInfoList providerInfoList = new ProviderUserInfoList(); + @Field(8) + public String password; + @Field(9) + public String phoneNumber; + @Field(10) + public long creationTimestamp; + @Field(11) + public long lastSignInTimestamp; + @Field(12) + public boolean isNewUser; + @Field(13) + public DefaultOAuthCredential defaultOAuthCredential; + @Field(14) + public List mfaInfoList; + + public static final Creator CREATOR = new AutoCreator<>(GetAccountInfoUser.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.java new file mode 100644 index 0000000..393bf11 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetProvidersForEmailAidlRequest.java @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class GetProvidersForEmailAidlRequest extends AutoSafeParcelable { + @Field(1) + public String email; + @Field(2) + public String tenantId; + public static final Creator CREATOR = new AutoCreator<>(GetProvidersForEmailAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetTokenResponse.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetTokenResponse.java new file mode 100644 index 0000000..66e786f --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/GetTokenResponse.java @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.json.JSONException; +import org.json.JSONObject; +import org.microg.safeparcel.AutoSafeParcelable; + +public class GetTokenResponse extends AutoSafeParcelable { + @Field(2) + public String refreshToken; + @Field(3) + public String accessToken; + @Field(4) + public Long expiresIn; + @Field(5) + public String tokenType; + @Field(6) + public Long issuedAt; + + public GetTokenResponse() { + issuedAt = System.currentTimeMillis(); + } + + public static GetTokenResponse parseJson(String json) { + try { + JSONObject object = new JSONObject(json); + GetTokenResponse response = new GetTokenResponse(); + response.refreshToken = object.optString("refresh_token", null); + response.accessToken = object.optString("access_token", null); + response.tokenType = object.optString("token_type", null); + response.expiresIn = object.optLong("expires_in"); + response.issuedAt = object.optLong("issued_at"); + return response; + } catch (JSONException e) { + throw new RuntimeException(e); + } + } + + public static final Creator CREATOR = new AutoCreator<>(GetTokenResponse.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.java new file mode 100644 index 0000000..f80f2ce --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkEmailAuthCredentialAidlRequest.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LinkEmailAuthCredentialAidlRequest extends AutoSafeParcelable { + @Field(1) + public String email; + @Field(2) + public String password; + @Field(3) + public String cachedState; + public static final Creator CREATOR = new AutoCreator<>(LinkEmailAuthCredentialAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.java new file mode 100644 index 0000000..6fd8122 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkFederatedCredentialAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LinkFederatedCredentialAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(LinkFederatedCredentialAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.java new file mode 100644 index 0000000..afc653b --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/LinkPhoneAuthCredentialAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LinkPhoneAuthCredentialAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(LinkPhoneAuthCredentialAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/MfaInfo.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/MfaInfo.java new file mode 100644 index 0000000..1e2ddaf --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/MfaInfo.java @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class MfaInfo extends AutoSafeParcelable { + + + public static final Creator CREATOR = new AutoCreator<>(MfaInfo.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfo.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfo.java new file mode 100644 index 0000000..1f7a19b --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfo.java @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ProviderUserInfo extends AutoSafeParcelable { + @Field(2) + public String federatedId; + @Field(3) + public String displayName; + @Field(4) + public String photoUrl; + @Field(5) + public String providerId; + @Field(6) + public String rawUserInfo; + @Field(7) + public String phoneNumber; + @Field(8) + public String email; + + public static final Creator CREATOR = new AutoCreator<>(ProviderUserInfo.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfoList.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfoList.java new file mode 100644 index 0000000..ff99d31 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ProviderUserInfoList.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.List; + +public class ProviderUserInfoList extends AutoSafeParcelable { + @Field(2) + public List providerUserInfos = new ArrayList<>(); + + + public static final Creator CREATOR = new AutoCreator<>(ProviderUserInfoList.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ReloadAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ReloadAidlRequest.java new file mode 100644 index 0000000..de609f7 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ReloadAidlRequest.java @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ReloadAidlRequest extends AutoSafeParcelable { + @Field(1) + public String cachedState; + public static final Creator CREATOR = new AutoCreator<>(ReloadAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ResetPasswordResponse.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ResetPasswordResponse.java new file mode 100644 index 0000000..06af063 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/ResetPasswordResponse.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ResetPasswordResponse extends AutoSafeParcelable { + @Field(2) + public String email; + @Field(3) + public String newEmail; + @Field(4) + public String requestType; + @Field(5) + public MfaInfo mfaInfo; + public static final Creator CREATOR = new AutoCreator<>(ResetPasswordResponse.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.java new file mode 100644 index 0000000..9bda971 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendEmailVerificationWithSettingsAidlRequest.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import com.google.firebase.auth.ActionCodeSettings; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SendEmailVerificationWithSettingsAidlRequest extends AutoSafeParcelable { + @Field(1) + public String token; + @Field(2) + public ActionCodeSettings settings; + public static final Creator CREATOR = new AutoCreator<>(SendEmailVerificationWithSettingsAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.java new file mode 100644 index 0000000..04dd49c --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendGetOobConfirmationCodeEmailAidlRequest.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import com.google.firebase.auth.ActionCodeSettings; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SendGetOobConfirmationCodeEmailAidlRequest extends AutoSafeParcelable { + @Field(1) + public String email; + @Field(2) + public ActionCodeSettings settings; + @Field(3) + public String tenantId; + public static final Creator CREATOR = new AutoCreator<>(SendGetOobConfirmationCodeEmailAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.java new file mode 100644 index 0000000..9b3eccd --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeAidlRequest.java @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SendVerificationCodeAidlRequest extends AutoSafeParcelable { + @Field(1) + public SendVerificationCodeRequest request; + public static final Creator CREATOR = new AutoCreator<>(SendVerificationCodeAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.java new file mode 100644 index 0000000..971d6fa --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SendVerificationCodeRequest.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SendVerificationCodeRequest extends AutoSafeParcelable { + @Field(1) + public String phoneNumber; + @Field(2) + public Long timeoutInSeconds; + @Field(3) + public boolean forceNewSmsVerificationSession; + @Field(4) + public String languageHeader; + @Field(5) + public String tenantId; + @Field(6) + public String recaptchaToken; + + public static final Creator CREATOR = new AutoCreator<>(SendVerificationCodeRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.java new file mode 100644 index 0000000..964382e --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SetFirebaseUiVersionAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SetFirebaseUiVersionAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(SetFirebaseUiVersionAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.java new file mode 100644 index 0000000..2549412 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInAnonymouslyAidlRequest.java @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SignInAnonymouslyAidlRequest extends AutoSafeParcelable { + @Field(1) + public String tenantId; + public static final Creator CREATOR = new AutoCreator<>(SignInAnonymouslyAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java new file mode 100644 index 0000000..8e45a2d --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class SignInWithCredentialAidlRequest extends AbstractSafeParcelable { + + @Field(1) + public VerifyAssertionRequest request; + + public SignInWithCredentialAidlRequest(VerifyAssertionRequest request) { + this.request = request; + } + + public SignInWithCredentialAidlRequest() { + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(SignInWithCredentialAidlRequest.class); + +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.java new file mode 100644 index 0000000..0f7f107 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCustomTokenAidlRequest.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SignInWithCustomTokenAidlRequest extends AutoSafeParcelable { + @Field(1) + public String token; + @Field(2) + public String tenantId; + + public static final Creator CREATOR = new AutoCreator<>(SignInWithCustomTokenAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.java new file mode 100644 index 0000000..c8aa04d --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailAndPasswordAidlRequest.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SignInWithEmailAndPasswordAidlRequest extends AutoSafeParcelable { + @Field(1) + public String email; + @Field(2) + public String password; + @Field(3) + public String tenantId; + public static final Creator CREATOR = new AutoCreator<>(SignInWithEmailAndPasswordAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.java new file mode 100644 index 0000000..71028fa --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithEmailLinkAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SignInWithEmailLinkAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(SignInWithEmailLinkAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.java new file mode 100644 index 0000000..d076cf3 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithPhoneNumberAidlRequest.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import com.google.firebase.auth.PhoneAuthCredential; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SignInWithPhoneNumberAidlRequest extends AutoSafeParcelable { + @Field(1) + public PhoneAuthCredential credential; + @Field(2) + public String tenantId; + + public static final Creator CREATOR = new AutoCreator<>(SignInWithPhoneNumberAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.java new file mode 100644 index 0000000..b4a93b6 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberEnrollmentAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class StartMfaPhoneNumberEnrollmentAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(StartMfaPhoneNumberEnrollmentAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.java new file mode 100644 index 0000000..151d4e6 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StartMfaPhoneNumberSignInAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class StartMfaPhoneNumberSignInAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(StartMfaPhoneNumberSignInAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StringList.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StringList.java new file mode 100644 index 0000000..8c72245 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/StringList.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.List; + +public class StringList extends AutoSafeParcelable { + @Field(1) + public int versionCode = 1; + @Field(2) + public List values = new ArrayList<>(); + public static final Creator CREATOR = new AutoCreator<>(StringList.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.java new file mode 100644 index 0000000..49c4b0f --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnenrollMfaAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UnenrollMfaAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(UnenrollMfaAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.java new file mode 100644 index 0000000..55770dd --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkEmailCredentialAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UnlinkEmailCredentialAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(UnlinkEmailCredentialAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.java new file mode 100644 index 0000000..1533997 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UnlinkFederatedCredentialAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UnlinkFederatedCredentialAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(UnlinkFederatedCredentialAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.java new file mode 100644 index 0000000..25d4020 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/UpdateProfileAidlRequest.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import com.google.firebase.auth.UserProfileChangeRequest; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UpdateProfileAidlRequest extends AutoSafeParcelable { + @Field(1) + public UserProfileChangeRequest request; + @Field(2) + public String cachedState; + public static final Creator CREATOR = new AutoCreator<>(UpdateProfileAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java new file mode 100644 index 0000000..0a0b130 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java @@ -0,0 +1,59 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class VerifyAssertionRequest extends AbstractSafeParcelable { + + @Field(2) + public String requestUri; + @Field(3) + public String accessToken; + @Field(4) + public String idToken; + @Field(5) + public String instanceId; + @Field(6) + public String providerId; + @Field(7) + public String pendingIdToken; + @Field(8) + public String postBody; + @Field(9) + public String localId; + @Field(10) + public boolean returnIdpCredential; + @Field(11) + public boolean returnSecureToken; + @Field(12) + public String delegatedProjectNumber; + @Field(13) + public String sessionId; + @Field(14) + public String queryParameter; + @Field(15) + public String tenantId; + @Field(16) + public boolean returnRefreshToken; + @Field(17) + public String tenantProjectNumber; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(VerifyAssertionRequest.class); + +} diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.java new file mode 100644 index 0000000..d6d5c12 --- /dev/null +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyBeforeUpdateEmailAidlRequest.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.auth.api.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class VerifyBeforeUpdateEmailAidlRequest extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(VerifyBeforeUpdateEmailAidlRequest.class); +} diff --git a/firebase-auth/src/main/java/org/microg/gms/firebase/auth/Constants.java b/firebase-auth/src/main/java/org/microg/gms/firebase/auth/Constants.java new file mode 100644 index 0000000..0f83c9f --- /dev/null +++ b/firebase-auth/src/main/java/org/microg/gms/firebase/auth/Constants.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.firebase.auth; + +public class Constants { + public static final String EXTRA_API_KEY = "com.google.firebase.auth.API_KEY"; + public static final String EXTRA_LIBRARY_VERSION = "com.google.firebase.auth.LIBRARY_VERSION"; +} diff --git a/firebase-dynamic-links/build.gradle b/firebase-dynamic-links/build.gradle new file mode 100644 index 0000000..7e10a72 --- /dev/null +++ b/firebase-dynamic-links/build.gradle @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2019 e Foundation + * SPDX-FileCopyrightText: 2020 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +android { + namespace "com.google.firebase.dynamiclinks" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } +} + +dependencies { + // Dependencies from firebase-dynamic-links:21.2.0 + api 'androidx.annotation:annotation:1.2.0' + api project(':play-services-base') + api project(':play-services-basement') + api project(':play-services-tasks') +// api project(':firebase-auth-interop') +// api project(':firebase-measurement-connector') +// api project(':firebase-common') +// api project(':firebase-common-ktx') +// api project(':firebase-components') + api 'org.jetbrains.kotlin:kotlin-stdlib:1.7.10' + annotationProcessor project(':safe-parcel-processor') +} + +apply from: '../gradle/publish-android.gradle' + +description = 'microG API for firebase-dynamic-links' + diff --git a/firebase-dynamic-links/src/main/AndroidManifest.xml b/firebase-dynamic-links/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b6845e5 --- /dev/null +++ b/firebase-dynamic-links/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl new file mode 100644 index 0000000..978e72c --- /dev/null +++ b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +parcelable DynamicLinkData; diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl new file mode 100644 index 0000000..d13b9f2 --- /dev/null +++ b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +import com.google.android.gms.common.api.Status; +import com.google.firebase.dynamiclinks.internal.DynamicLinkData; +import com.google.firebase.dynamiclinks.internal.ShortDynamicLinkImpl; + +interface IDynamicLinksCallbacks { + void onStatusDynamicLinkData(in Status status, in DynamicLinkData dldata) = 0; + void onStatusShortDynamicLink(in Status status, in ShortDynamicLinkImpl sdlink) = 1; +} diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl new file mode 100644 index 0000000..b5d4e52 --- /dev/null +++ b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +import com.google.firebase.dynamiclinks.internal.IDynamicLinksCallbacks; +import android.os.Bundle; + +interface IDynamicLinksService { + void getDynamicLink(IDynamicLinksCallbacks callback, String link) = 0; + void createShortDynamicLink(IDynamicLinksCallbacks callback, in Bundle extras) = 1; +} diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl new file mode 100644 index 0000000..cfca953 --- /dev/null +++ b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +parcelable ShortDynamicLinkImpl; diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl new file mode 100644 index 0000000..fbdb3f8 --- /dev/null +++ b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +parcelable WarningImpl; diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java new file mode 100644 index 0000000..f613347 --- /dev/null +++ b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.firebase.dynamiclinks; + +import android.net.Uri; + +import org.microg.gms.common.PublicApi; + +import java.util.List; + +/** + * Response from {@link DynamicLink.Builder#buildShortDynamicLink()} that returns the shortened Dynamic Link, link flow chart, and warnings from the requested Dynamic Link. + */ +@PublicApi +public interface ShortDynamicLink { + /** + * Gets the preview link to show the link flow chart. + */ + Uri getPreviewLink(); + + /** + * Gets the short Dynamic Link value. + */ + Uri getShortLink(); + + /** + * Gets information about potential warnings on link creation. + */ + List getWarnings(); + + /** + * Path generation option for short Dynamic Link length + */ + @interface Suffix { + /** + * Shorten the path to an unguessable string. Such strings are created by base62-encoding randomly generated + * 96-bit numbers, and consist of 17 alphanumeric characters. Use unguessable strings to prevent your Dynamic + * Links from being crawled, which can potentially expose sensitive information. + */ + int UNGUESSABLE = 1; + /** + * Shorten the path to a string that is only as long as needed to be unique, with a minimum length of 4 + * characters. Use this method if sensitive information would not be exposed if a short Dynamic Link URL were + * guessed. + */ + int SHORT = 2; + } + + /** + * Information about potential warnings on short Dynamic Link creation. + */ + interface Warning { + /** + * Gets the warning code. + * + * @deprecated See {@link #getMessage()} for more information on this warning and how to correct it. + */ + @Deprecated + String getCode(); + + /** + * Gets the warning message to help developers improve their requests. + */ + String getMessage(); + } +} diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java new file mode 100644 index 0000000..a2b0e42 --- /dev/null +++ b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +import android.os.Parcel; +import androidx.annotation.NonNull; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import android.os.Bundle; +import android.net.Uri; +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class DynamicLinkData extends AbstractSafeParcelable { + @Field(1) + public final String dynamicLink; + + @Field(2) + public final String deepLink; + + @Field(3) + public final int minVersion; + + @Field(4) + public final long clickTimestamp; + + @Field(5) + public final Bundle extensionBundle; + + @Field(6) + public final Uri redirectUrl; + + @Constructor + public DynamicLinkData(@Param(1) String dynamicLink, @Param(2) String deepLink, @Param(3) int minVersion, @Param(4) long clickTimestamp, @Param(5) Bundle extensionBundle, @Param(6) Uri redirectUrl) { + this.dynamicLink = dynamicLink; + this.deepLink = deepLink; + this.minVersion = minVersion; + this.clickTimestamp = clickTimestamp; + this.extensionBundle = extensionBundle; + this.redirectUrl = redirectUrl; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("DynamicLinkData") + .field("dynamicLink", dynamicLink) + .field("deepLink", deepLink) + .field("minVersion", minVersion) + .field("clickTimestamp", clickTimestamp) + .field("extensionBundle", extensionBundle) + .field("redirectUrl", redirectUrl) + .end(); + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(DynamicLinkData.class); +} diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java new file mode 100644 index 0000000..350b34d --- /dev/null +++ b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2019, e Foundation + * SPDX-FileCopyrightText: 2021, Google LLC + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +import android.net.Uri; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.List; + + +public class ShortDynamicLinkImpl extends AutoSafeParcelable { + @Field(1) + public final Uri shortLink; + + @Field(2) + public final Uri previewLink; + + @Field(3) + public final List warnings; + + + public ShortDynamicLinkImpl() { + shortLink = Uri.EMPTY; + previewLink = Uri.EMPTY; + + warnings = new ArrayList<>(); + } + + public ShortDynamicLinkImpl(Uri shortLink, Uri previewLink, List warnings) { + this.shortLink = shortLink; + this.previewLink = previewLink; + this.warnings = warnings; + } + + public static final Creator CREATOR = new AutoCreator(ShortDynamicLinkImpl.class); +} diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java new file mode 100644 index 0000000..ae8e9e1 --- /dev/null +++ b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.firebase.dynamiclinks.internal; + +import com.google.firebase.dynamiclinks.ShortDynamicLink; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class WarningImpl extends AutoSafeParcelable implements ShortDynamicLink.Warning { + @Field(1) + @Deprecated + private int code = 1; + + @Field(2) + private final String message; + + private WarningImpl() { + this.message = null; + } + + public WarningImpl(String message) { + this.message = message; + } + + @Override + public String getCode() { + return null; + } + + @Override + public String getMessage() { + return message; + } + + public static final Creator CREATOR = new AutoCreator(WarningImpl.class); +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1c50760 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +android.useAndroidX=true +org.gradle.configuration-cache=true +org.gradle.caching=true +org.gradle.jvmargs=-Xmx4096m -XX:+UseParallelGC --add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED diff --git a/gradle/publish-android.gradle b/gradle/publish-android.gradle new file mode 100644 index 0000000..46c6e63 --- /dev/null +++ b/gradle/publish-android.gradle @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +android { + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } +} + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + pom { + name = project.name + description = project.description + url = 'https://github.com/microg/GmsCore' + licenses { + license { + name = 'The Apache Software License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id = 'microg' + name = 'microG Team' + } + } + scm { + url = 'https://github.com/microg/GmsCore' + connection = 'scm:git:https://github.com/microg/GmsCore.git' + developerConnection = 'scm:git:ssh://github.com/microg/GmsCore.git' + } + } + + from components.release + } + } + if (project.hasProperty('sonatype.username')) { + repositories { + maven { + name = 'sonatype' + url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username project.getProperty('sonatype.username') + password project.getProperty('sonatype.password') + } + } + } + } + } + if (project.hasProperty('signing.keyId')) { + signing { + sign publishing.publications + } + } + tasks.getByPath("sourceReleaseJar").duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} diff --git a/gradle/publish-java.gradle b/gradle/publish-java.gradle new file mode 100644 index 0000000..95d9ad9 --- /dev/null +++ b/gradle/publish-java.gradle @@ -0,0 +1,76 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +task javaSourcesJar(type: Jar) { + archiveClassifier.set("sources") + from sourceSets.main.allJava +} + +javadoc { + classpath = configurations.compileClasspath + source = sourceSets.main.allJava +} + +task javaJavadocsJar(type: Jar) { + archiveClassifier.set("javadoc") + from javadoc +} + +artifacts { + archives javaSourcesJar + archives javaJavadocsJar +} + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + pom { + name = project.name + description = project.description + url = 'https://github.com/microg/GmsCore' + licenses { + license { + name = 'The Apache Software License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id = 'microg' + name = 'microG Team' + } + } + scm { + url = 'https://github.com/microg/GmsCore' + connection = 'scm:git:https://github.com/microg/GmsCore.git' + developerConnection = 'scm:git:ssh://github.com/microg/GmsCore.git' + } + } + + from components.java + artifact javaSourcesJar + artifact javaJavadocsJar + } + } + if (project.hasProperty('sonatype.username')) { + repositories { + maven { + name = 'sonatype' + url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username project.getProperty('sonatype.username') + password project.getProperty('sonatype.password') + } + } + } + } + } + if (project.hasProperty('signing.keyId')) { + signing { + sign publishing.publications + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..00277a3 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2015, microG Project Team +# SPDX-License-Identifier: CC0-1.0 + +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..9b42019 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/play-services-ads-base/build.gradle b/play-services-ads-base/build.gradle new file mode 100644 index 0000000..bb5ae3d --- /dev/null +++ b/play-services-ads-base/build.gradle @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +android { + namespace "com.google.android.gms.ads_base" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +apply from: '../gradle/publish-android.gradle' + +description = 'microG implementation of play-services-ads-base' + +dependencies { + api project(':play-services-basement') +} diff --git a/play-services-ads-base/src/main/AndroidManifest.xml b/play-services-ads-base/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7f3bbf2 --- /dev/null +++ b/play-services-ads-base/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/play-services-ads-identifier/build.gradle b/play-services-ads-identifier/build.gradle new file mode 100644 index 0000000..9c5a4d8 --- /dev/null +++ b/play-services-ads-identifier/build.gradle @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +android { + namespace "com.google.android.gms.ads.identifier" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +apply from: '../gradle/publish-android.gradle' + +description = 'microG implementation of play-services-ads-identifier' + +dependencies { + api project(':play-services-basement') +} diff --git a/play-services-ads-identifier/core/build.gradle b/play-services-ads-identifier/core/build.gradle new file mode 100644 index 0000000..5b63bd5 --- /dev/null +++ b/play-services-ads-identifier/core/build.gradle @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +dependencies { + api project(':play-services-ads-identifier') + implementation project(':play-services-base-core') +} + +android { + namespace "org.microg.gms.ads.identifier" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } + + lintOptions { + disable 'MissingTranslation', 'GetLocales' + } +} diff --git a/play-services-ads-identifier/core/src/main/AndroidManifest.xml b/play-services-ads-identifier/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b97bc37 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/AndroidManifest.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt b/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt new file mode 100644 index 0000000..0c4f96d --- /dev/null +++ b/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt @@ -0,0 +1,139 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package org.microg.gms.ads.identifier + +import android.app.Service +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Binder +import android.os.Bundle +import android.os.IBinder +import android.util.Log +import androidx.core.os.bundleOf +import com.google.android.gms.ads.identifier.internal.IAdvertisingIdService +import org.microg.gms.common.GooglePackagePermission +import org.microg.gms.common.PackageUtils +import java.util.UUID + +const val TAG = "AdvertisingId" +const val EMPTY_AD_ID = "00000000-0000-0000-0000-000000000000" + +class AdvertisingIdService : Service() { + override fun onBind(intent: Intent): IBinder? { + return AdvertisingIdServiceImpl(this).asBinder() + } +} + +class MemoryAdvertisingIdConfiguration(context: Context) : AdvertisingIdConfiguration(context) { + override val adTrackingLimitedPerApp: MutableMap = hashMapOf() + override var adTrackingLimitedGlobally: Boolean = true + override var debugLogging: Boolean = false + override var adId: String = EMPTY_AD_ID + override var debugAdId: String = EMPTY_AD_ID + + init { + resetAdvertisingId() + } +} + +abstract class AdvertisingIdConfiguration(private val context: Context) { + abstract val adTrackingLimitedPerApp: MutableMap + abstract var adTrackingLimitedGlobally: Boolean + abstract var debugLogging: Boolean + abstract var adId: String + abstract var debugAdId: String + + fun isAdTrackingLimitedForApp(uid: Int): Boolean { + if (adTrackingLimitedGlobally) return true + return adTrackingLimitedPerApp[uid] ?: false + } + + fun resetAdvertisingId(): String { + adId = UUID.randomUUID().toString() + debugAdId = UUID.randomUUID().toString().dropLast(12) + "10ca1ad1abe1" + return if (debugLogging) debugAdId else adId + } + + fun getAdvertisingIdForApp(uid: Int): String { + if (isAdTrackingLimitedForApp(uid)) return EMPTY_AD_ID + try { + val packageNames = context.packageManager.getPackagesForUid(uid) ?: return EMPTY_AD_ID + for (packageName in packageNames) { + val applicationInfo = context.packageManager.getApplicationInfo(packageName, 0) + if (applicationInfo.targetSdkVersion > 33) { + if (context.packageManager.checkPermission("com.google.android.gms.permission.AD_ID", packageName) == PackageManager.PERMISSION_DENIED) { + throw SecurityException("Permission not granted") + } + } + } + } catch (e: Exception) { + Log.w(TAG, "Permission check failed", e) + return EMPTY_AD_ID + } + val adId = if (debugLogging) debugAdId else adId + return adId.ifEmpty { resetAdvertisingId() } + } +} + +class AdvertisingIdServiceImpl(private val context: Context) : IAdvertisingIdService.Stub() { + private val configuration = MemoryAdvertisingIdConfiguration(context) + + override fun getAdvertisingId(): String { + return configuration.getAdvertisingIdForApp(Binder.getCallingUid()) + } + + override fun isAdTrackingLimited(ignored: Boolean): Boolean { + return configuration.isAdTrackingLimitedForApp(Binder.getCallingUid()) + } + + override fun resetAdvertisingId(packageName: String): String { + PackageUtils.checkPackageUid(context, packageName, getCallingUid()) + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + return configuration.resetAdvertisingId() + } + + override fun setAdTrackingLimitedGlobally(packageName: String, limited: Boolean) { + PackageUtils.checkPackageUid(context, packageName, getCallingUid()) + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + configuration.adTrackingLimitedGlobally = limited + } + + override fun setDebugLoggingEnabled(packageName: String, enabled: Boolean): String { + PackageUtils.checkPackageUid(context, packageName, getCallingUid()) + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + configuration.debugLogging = enabled + return advertisingId + } + + override fun isDebugLoggingEnabled(): Boolean { + return configuration.debugLogging + } + + override fun isAdTrackingLimitedGlobally(): Boolean { + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + return configuration.adTrackingLimitedGlobally + } + + override fun setAdTrackingLimitedForApp(uid: Int, limited: Boolean) { + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + configuration.adTrackingLimitedPerApp[uid] = limited + } + + override fun resetAdTrackingLimitedForApp(uid: Int) { + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + configuration.adTrackingLimitedPerApp.remove(uid) + } + + override fun getAllAppsLimitedAdTrackingConfiguration(): Bundle { + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + return bundleOf(*configuration.adTrackingLimitedPerApp.map { it.key.toString() to it.value }.toTypedArray()) + } + + override fun getAdvertisingIdForApp(uid: Int): String { + PackageUtils.assertGooglePackagePermission(context, GooglePackagePermission.AD_ID) + return configuration.getAdvertisingIdForApp(uid) + } +} diff --git a/play-services-ads-identifier/core/src/main/res/values-ar/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..7d308cd --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ar/strings.xml @@ -0,0 +1,7 @@ + + + إشعار مُعَرِّف الإعلان + إذن مُعَرِّف الإعلان + يتيح للتطبيق تلقي إشعار عند تحديث مُعَرِّف الإعلان أو تحديد تفضيلات تتبع الإعلانات للمستخدم. + يتيح لتطبيق الناشر بالوصول إلى مُعَرِّف إعلان صالح بشكل مباشر أو غير مباشر. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ast/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ast/strings.xml new file mode 100644 index 0000000..faf5aa5 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ast/strings.xml @@ -0,0 +1,7 @@ + + + Permite qu\'una aplicación reciba un avisu al anovar la ID de publicidá o al llendar la preferencia de rastrexu publicitariu del usuariu. + Avisu d\'ID de publicidá + Permite que l\'aplicación d\'un espublizador acceda in/direutamente a una ID de publicidá. + Permisu d\'ID de publicidá + diff --git a/play-services-ads-identifier/core/src/main/res/values-az/strings.xml b/play-services-ads-identifier/core/src/main/res/values-az/strings.xml new file mode 100644 index 0000000..5209fd0 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-az/strings.xml @@ -0,0 +1,7 @@ + + + Reklam ID İcazəsi + Dərc edici tətbiq birbaşa və ya dolayı yolla etibarlı reklam ID-ə keçid icazəsi verir. + Reklam ID bildirişi + İstifadəçinin reklam ID-i və ya reklam izləmə seçiminin məhdudlaşdırılması yeniləndikdə, tətbiqə bildiriş almaq icazəsi verir. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-be/strings.xml b/play-services-ads-identifier/core/src/main/res/values-be/strings.xml new file mode 100644 index 0000000..0648bca --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-be/strings.xml @@ -0,0 +1,7 @@ + + + Дазвол рэкламнага ідэнтыфікатара + Дазваляе выдаўцу дадатку прама ці ўскосна атрымліваць доступ да рэкламнага ідэнтыфікатара. + Апавяшчэнне рэкламнага ідэнтыфікатара + Дазваляе дадаткам атрымліваць апавяшчэнне калі рэкламны ідэнтыфікатар або перавага аб ліміце рэкламнай сачэння карыстальніка абноўленыя. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-cs/strings.xml b/play-services-ads-identifier/core/src/main/res/values-cs/strings.xml new file mode 100644 index 0000000..846d2d0 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-cs/strings.xml @@ -0,0 +1,7 @@ + + + Oprávnění k reklamnímu ID + Umožní vydavatelské aplikaci přímý nebo nepřímý přístup k platnému reklamnímu ID. + Oznámení o reklamním ID + Umožní aplikaci obdržet oznámení při aktualizaci reklamního ID nebo uživatelské předvolby omezení reklamního sledování. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-de/strings.xml b/play-services-ads-identifier/core/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..f565613 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-de/strings.xml @@ -0,0 +1,7 @@ + + + Erlaubt einer App, eine Benachrichtigung zu erhalten, wenn sich die Werbe-ID ändert oder der Nutzer das Tracking einschränkt. + Werbe-ID-Benachrichtigung + Erlaubt einer App, direkt oder indirekt, auf die Werbe-ID zuzugreifen. + Werbe-ID-Berechtigung + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-eo/strings.xml b/play-services-ads-identifier/core/src/main/res/values-eo/strings.xml new file mode 100644 index 0000000..a6b3dae --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-eo/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-es/strings.xml b/play-services-ads-identifier/core/src/main/res/values-es/strings.xml new file mode 100644 index 0000000..90c47f7 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-es/strings.xml @@ -0,0 +1,7 @@ + + + Permiso de identificación publicitaria + Permite que una aplicación de editor acceda directa o indirectamente a un ID de publicidad válido. + Notificación del ID de publicidad + Permite que una aplicación reciba una notificación cuando se actualiza el ID de publicidad o la preferencia de limitar el seguimiento de anuncios del usuario. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-fa/strings.xml b/play-services-ads-identifier/core/src/main/res/values-fa/strings.xml new file mode 100644 index 0000000..2239807 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-fa/strings.xml @@ -0,0 +1,7 @@ + + + مجوز شناسه آگهی + به یک برنامه ناشر اجازه می‌دهد تا به شیوه مستقیم یا غیرمستقیم به یک شناسه آگهی معتبر دسترسی پیدا کند. + آگاه‌ساز شناسه آگهی + به یک برنامه اجازه می‌دهد تا هنگام به‌روزرسانی شناسه آگهی یا تنظیمات ردیابی محدود آگهی کاربر، آگاه‌ساز دریافت کند. + diff --git a/play-services-ads-identifier/core/src/main/res/values-fi/strings.xml b/play-services-ads-identifier/core/src/main/res/values-fi/strings.xml new file mode 100644 index 0000000..eca968d --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-fi/strings.xml @@ -0,0 +1,7 @@ + + + Sallii sovelluksen vastaanottaa ilmoituksen, kun käyttäjän mainostunnus tai mainonnan seurantaa rajoittava asetus päivitetään. + Mainostunnuslupa + Mainostunnusilmoitus + Mahdollistaa julkaisijasovellukselle pääsyn voimassa olevaan mainostunnukseen suoraan tai välillisesti. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-fil/strings.xml b/play-services-ads-identifier/core/src/main/res/values-fil/strings.xml new file mode 100644 index 0000000..c00c7dc --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-fil/strings.xml @@ -0,0 +1,7 @@ + + + Pahintulot ng Advertising ID + Nagbibigay-daan sa isang publisher app na mag-access ng wastong advertising ID nang direkta o hindi direkta. + Notification ng Advertising ID + Nagbibigay-daan sa isang app na makatanggap ng notification kapag na-update ang advertising ID o limitahan ang kagustuhan sa pagsubaybay sa ad ng user. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-fr/strings.xml b/play-services-ads-identifier/core/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..c82f144 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-fr/strings.xml @@ -0,0 +1,7 @@ + + + Permission de l\'identifiant publicitaire + Autorise une application affichant de la publicité à accéder directement ou indirectement à un identifiant publicitaire valide. + Notification de l\'identifiant publicitaire + Autorise une application à être notifiée de la modification de l\'identifiant publicitaire ou de la limitation du suivi publicitaire de l\'utilisateur. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ga/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ga/strings.xml new file mode 100644 index 0000000..51d2e13 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ga/strings.xml @@ -0,0 +1,7 @@ + + + Ligeann sé d’aip fógra a fháil nuair a nuashonraítear an t-aitheantas fógraíochta nó an rogha rianaithe teorann atá ag an úsáideoir. + Fógra aitheantais fógraíochta + Cead ID Fógraíochta + Ligeann sé d’aip foilsitheora rochtain a fháil ar aitheantas bailí fógraíochta go díreach nó go hindíreach. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-in/strings.xml b/play-services-ads-identifier/core/src/main/res/values-in/strings.xml new file mode 100644 index 0000000..0570563 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-in/strings.xml @@ -0,0 +1,7 @@ + + + Memungkinkan aplikasi penerbit mengakses ID periklanan yang valid secara langsung atau tidak langsung. + Izin ID Periklanan + Pemberitahuan ID periklanan + Memungkinkan aplikasi menerima notifikasi ketika ID periklanan atau batas preferensi pelacakan iklan pengguna diperbarui. + diff --git a/play-services-ads-identifier/core/src/main/res/values-is/strings.xml b/play-services-ads-identifier/core/src/main/res/values-is/strings.xml new file mode 100644 index 0000000..a6b3dae --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-is/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-it/strings.xml b/play-services-ads-identifier/core/src/main/res/values-it/strings.xml new file mode 100644 index 0000000..ab94b6f --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-it/strings.xml @@ -0,0 +1,7 @@ + + + Consente a un\'app di ricevere una notifica in caso di aggiornamento dell\'ID pubblicità o della preferenza dell\'utente relativa alla limitazione del tracciamento degli annunci. + Notifica sull\'ID pubblicità + Consente a un\'app dell\'autore di accedere direttamente o indirettamente a un ID pubblicità valido. + Autorizzazione accesso all\'ID pubblicità + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ja/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ja/strings.xml new file mode 100644 index 0000000..c3499ac --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ja/strings.xml @@ -0,0 +1,7 @@ + + + ユーザーの広告 ID またはトラッキング拒否設定が更新されたときに、アプリが通知を受信できるようにします。 + 広告 ID の通知 + 外部アプリが有効な広告 ID に直接的または間接的にアクセスできるようにします。 + 広告 ID の許可 + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ko/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ko/strings.xml new file mode 100644 index 0000000..2593e7a --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ko/strings.xml @@ -0,0 +1,7 @@ + + + 광고 ID 권한 + 퍼블리셔 앱이 유효한 광고 ID에 직접 또는 간접적으로 접근할 수 있도록 합니다. + 광고 ID 알림 + 사용자의 광고 ID 또는 광고 추적 제한 설정이 변경되면 앱이 알림을 받을 수 있습니다. + diff --git a/play-services-ads-identifier/core/src/main/res/values-lv/strings.xml b/play-services-ads-identifier/core/src/main/res/values-lv/strings.xml new file mode 100644 index 0000000..53ee814 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-lv/strings.xml @@ -0,0 +1,7 @@ + + + Reklāmas identifikatora atļauja + Ļauj lietotnes izdevējam tieši vai netieši piekļūt derīgam reklāmas identifikatoram. + Reklāmas identifikatora paziņojums + Ļauj informēt lietotni, ja mainās reklāmas identifikators vai lietotāja ierobežotie, iestatītie reklāmu izsekošanas iestatījumi. + diff --git a/play-services-ads-identifier/core/src/main/res/values-lzh/strings.xml b/play-services-ads-identifier/core/src/main/res/values-lzh/strings.xml new file mode 100644 index 0000000..a6b3dae --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-lzh/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ml/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ml/strings.xml new file mode 100644 index 0000000..28a8ba2 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ml/strings.xml @@ -0,0 +1,7 @@ + + + പരസ്യ ഐഡി അനുമതി + ഒരു പ്രസാധക ആപ്പിന് സാധുവായ ഒരു പരസ്യ ഐഡി നേരിട്ടോ അല്ലാതെയോ ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കുന്നു. + പരസ്യ ഐഡി അറിയിപ്പ് + ഉപയോക്താവിന്റെ പരസ്യ ഐഡി അല്ലെങ്കിൽ പരസ്യ ട്രാക്കിംഗ് മുൻഗണന പരിമിതപ്പെടുത്തുമ്പോൾ ഒരു ആപ്പിന് അറിയിപ്പ് ലഭിക്കാൻ അനുവദിക്കുന്നു. + diff --git a/play-services-ads-identifier/core/src/main/res/values-nb-rNO/strings.xml b/play-services-ads-identifier/core/src/main/res/values-nb-rNO/strings.xml new file mode 100644 index 0000000..e931b20 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-nb-rNO/strings.xml @@ -0,0 +1,7 @@ + + + Tillatelse til reklame-ID + Lar en app få tilgang til en gyldig reklame-ID direkte eller indirekte. + Reklame-ID-varsling + Lar en app bli varslet når reklame-ID-en til brukeren eller innstillingene til denne oppdateres. + diff --git a/play-services-ads-identifier/core/src/main/res/values-nl/strings.xml b/play-services-ads-identifier/core/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000..3bb25c5 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-nl/strings.xml @@ -0,0 +1,7 @@ + + + Staart een app om een bericht te ontvangen wanneer de reclame ID of de beperkte advertentie verkiesbaar is. + Adverteren van ID Permissie + Staart een uitgever app toe om toegang te krijgen tot een geldige advertentie ID direct of indirect. + Adverteren van ID-informatie + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-pl/strings.xml b/play-services-ads-identifier/core/src/main/res/values-pl/strings.xml new file mode 100644 index 0000000..e21a8ab --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-pl/strings.xml @@ -0,0 +1,7 @@ + + + Umożliwia aplikacji otrzymywanie powiadomień w przypadku aktualizacji identyfikatora reklamowego lub ograniczenia preferencji śledzenia użytkownika w celach reklamowych. + Powiadomienie o indentyfikatorze reklamowym + Umożliwia wydawcy aplikacji na bezpośredni lub pośredni dostęp do ważnego identyfikatora reklamowego. + Pozwolenie na używanie identyfikatora reklamowego + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-pt-rBR/strings.xml b/play-services-ads-identifier/core/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..b3aa44e --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,7 @@ + + + Permissão do ID de publicidade + Permite que o app publicante acesse um ID de publicidade válido diretamente ou indiretamente. + Notificação do ID de publicidade + Permite que um app receba uma notificação quando o ID de publicidade muda ou a configuração de limitação de rastreamento de anúncios do usuário muda. + diff --git a/play-services-ads-identifier/core/src/main/res/values-pt/strings.xml b/play-services-ads-identifier/core/src/main/res/values-pt/strings.xml new file mode 100644 index 0000000..a217bf6 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-pt/strings.xml @@ -0,0 +1,7 @@ + + + Permissão do ID de publicidade + Permite que a app de publicação aceda um ID de publicidade válido direta ou indireto. + Notificação do ID de publicidade + Permite que uma app receba uma notificação quando o ID de publicidade muda ou a configuração de limitação de rastreamento de anúncios do utilizador muda. + diff --git a/play-services-ads-identifier/core/src/main/res/values-ro/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ro/strings.xml new file mode 100644 index 0000000..9051e7a --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ro/strings.xml @@ -0,0 +1,7 @@ + + + Permite unei aplicații să primească o notificare atunci când ID-ul de publicitate sau preferința limitată de urmărire a anunțurilor a utilizatorului este actualizată. + Notificare de identificare publicitară + Permite unei aplicații de editor să acceseze direct sau indirect un ID de publicitate valid. + Permisiune de identificare publicitară + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ru/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..dc46f14 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ru/strings.xml @@ -0,0 +1,7 @@ + + + Разрешает приложению получать уведомление когда рекламный идентификатор или предпочтение о лимите рекламной слежки пользователя обновлены. + Разрешение рекламного идентификатора + Разрешает издателю приложения прямо или косвенно получать доступ к рекламному идентификатору. + Уведомление рекламного идентификатора + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-sl/strings.xml b/play-services-ads-identifier/core/src/main/res/values-sl/strings.xml new file mode 100644 index 0000000..55344e5 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-sl/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-sr/strings.xml b/play-services-ads-identifier/core/src/main/res/values-sr/strings.xml new file mode 100644 index 0000000..cc171f7 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-sr/strings.xml @@ -0,0 +1,7 @@ + + + Обавештење за ID оглашавања + Дозвољава апликацији објављивача да директно или индиректно приступи важећем ID-у оглашавања. + Дозвола за ID оглашавања + Дозвољава апликацији да прими обавештење када се ажурира ID оглашавања или ограничење праћења огласа корисника. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-sv/strings.xml b/play-services-ads-identifier/core/src/main/res/values-sv/strings.xml new file mode 100644 index 0000000..8d4211a --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-sv/strings.xml @@ -0,0 +1,7 @@ + + + Tillåter en app att ta emot ett meddelande när annons-ID eller begränsad annonsspårningsinställning för användaren uppdateras. + Avisering av annons-ID + Tillåter en publicerad app att få tillgång till ett giltigt annons-ID direkt eller indirekt. + Behörighet för annons-ID + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ta/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ta/strings.xml new file mode 100644 index 0000000..afc6fdc --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ta/strings.xml @@ -0,0 +1,7 @@ + + + விளம்பர அடையாளம் அறிவிப்பு + விளம்பர அடையாளம் அல்லது பயனரின் விளம்பர கண்காணிப்பு விருப்பம் புதுப்பிக்கப்படும்போது ஒரு பயன்பாட்டை அறிவிப்பைப் பெற அனுமதிக்கிறது. + விளம்பர அடையாளம் இசைவு + சரியான விளம்பர அடையளத்தை நேரடியாகவோ அல்லது மறைமுகமாகவோ அணுக ஒரு வெளியீட்டாளர் பயன்பாட்டை அனுமதிக்கிறது. + diff --git a/play-services-ads-identifier/core/src/main/res/values-th/strings.xml b/play-services-ads-identifier/core/src/main/res/values-th/strings.xml new file mode 100644 index 0000000..73a203b --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-th/strings.xml @@ -0,0 +1,7 @@ + + + การอนุญาติให้เข้าถึงรหัสประจำตัวของโฆษณา + การแจ้งเตือน รหัสประจำตัวของโฆษณา + อนุญาตให้ผู้สร้างแอปเข้าถึง รหัสประจำตัวของโฆษณาที่ถูกต้องได้โดยตรงหรือโดยอ้อม + อนุญาตให้แอปรับการแจ้งเตือนเมื่อมีการอัปเดต รหัสประจำตัวของโฆษณา หรือ การตั้งค่าการติดตามโฆษณาของผู้ใช้ + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-tr/strings.xml b/play-services-ads-identifier/core/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..c505b7c --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-tr/strings.xml @@ -0,0 +1,7 @@ + + + Reklam kimliği izni + Reklam kimliği bildirimi + Bir uygulamanın, kullanıcının reklam takibini kısıtlama ayarını veya reklam kimliğini değiştirdiğinde bildirim almasına izin verir. + Bir uygulamanın geçerli bir reklam kimliğine doğrudan veya dolaylı olarak erişmesine izin verir. + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-ug/strings.xml b/play-services-ads-identifier/core/src/main/res/values-ug/strings.xml new file mode 100644 index 0000000..ae7324b --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-ug/strings.xml @@ -0,0 +1,7 @@ + + + ئېلان كىملىك ئۇقتۇرۇشى + ئېلان كىملىك ئىجازىتى + ئەپنىڭ ئىشلەتكۈچى ئېلان كىملىكى ياكى ئېلان ئىزلاشنى چەكلەش مايىللىقى ئۆزگەرگەندە ئۇقتۇرۇش تاپشۇرۇۋېلىشىغا يول قويىدۇ. + تارقاتقۇچىنىڭ ئەپىنىڭ بىۋاسىتە ياكى ۋاسىتىلىك ھالدا ئېلان كىملىكىنى زىيارەت قىلىشىغا يول قويىدۇ. + diff --git a/play-services-ads-identifier/core/src/main/res/values-uk/strings.xml b/play-services-ads-identifier/core/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000..d4bc556 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-uk/strings.xml @@ -0,0 +1,7 @@ + + + Дозволяє програмі отримувати сповіщення, коли рекламний ідентифікатор або обмеження налаштувань відстеження реклами користувача оновлюється. + Сповіщення рекламного ідентифікатора + Дозволяє застосунку видавця отримувати доступ до дійсного рекламного ідентифікатор прямо або опосередковано. + Дозвіл на рекламний ідентифікатор + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-vi/strings.xml b/play-services-ads-identifier/core/src/main/res/values-vi/strings.xml new file mode 100644 index 0000000..8bdcdc6 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-vi/strings.xml @@ -0,0 +1,7 @@ + + + Cho phép một ứng dụng nhận thông báo khi ID quảng cáo hoặc tùy chọn giới hạn theo dõi quảng cáo của người dùng được cập nhật. + Quyền truy cập ID quảng cáo + Thông báo về ID quảng cáo + Cho phép ứng dụng của nhà phát hành truy cập trực tiếp hoặc gián tiếp vào ID quảng cáo hợp lệ. + diff --git a/play-services-ads-identifier/core/src/main/res/values-zh-rCN/strings.xml b/play-services-ads-identifier/core/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..f3c478c --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,7 @@ + + + 广告 ID 权限 + 允许发布者应用直接或间接地访问广告 ID。 + 广告 ID 通知 + 允许应用在用户的广告 ID 或限制广告跟踪设置更改时接收通知。 + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values-zh-rTW/strings.xml b/play-services-ads-identifier/core/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..24e84f3 --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,7 @@ + + + 廣告 ID 權限 + 廣告 ID 通知 + 允許應用程式在使用者更新廣告 ID 或限制廣告追蹤設定時收到通知。 + 允許發布商應用程式直接或間接存取有效的廣告 ID。 + \ No newline at end of file diff --git a/play-services-ads-identifier/core/src/main/res/values/strings.xml b/play-services-ads-identifier/core/src/main/res/values/strings.xml new file mode 100644 index 0000000..865dd6a --- /dev/null +++ b/play-services-ads-identifier/core/src/main/res/values/strings.xml @@ -0,0 +1,11 @@ + + + + Advertising ID Permission + Allows a publisher app to access a valid advertising ID directly or indirectly. + Advertising ID notification + Allows an app to receive a notification when the advertising ID or limit ad tracking preference of the user is updated. + \ No newline at end of file diff --git a/play-services-ads-identifier/src/main/AndroidManifest.xml b/play-services-ads-identifier/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7f3bbf2 --- /dev/null +++ b/play-services-ads-identifier/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/play-services-ads-identifier/src/main/aidl/com/google/android/gms/ads/identifier/internal/IAdvertisingIdService.aidl b/play-services-ads-identifier/src/main/aidl/com/google/android/gms/ads/identifier/internal/IAdvertisingIdService.aidl new file mode 100644 index 0000000..bda8695 --- /dev/null +++ b/play-services-ads-identifier/src/main/aidl/com/google/android/gms/ads/identifier/internal/IAdvertisingIdService.aidl @@ -0,0 +1,17 @@ +package com.google.android.gms.ads.identifier.internal; + +import android.os.Bundle; + +interface IAdvertisingIdService { + String getAdvertisingId() = 0; + boolean isAdTrackingLimited(boolean ignored) = 1; + String resetAdvertisingId(String packageName) = 2; + void setAdTrackingLimitedGlobally(String packageName, boolean limited) = 3; + String setDebugLoggingEnabled(String packageName, boolean enabled) = 4; + boolean isDebugLoggingEnabled() = 5; + boolean isAdTrackingLimitedGlobally() = 6; + void setAdTrackingLimitedForApp(int uid, boolean limited) = 7; + void resetAdTrackingLimitedForApp(int uid) = 8; + Bundle getAllAppsLimitedAdTrackingConfiguration() = 9; // Map packageName -> Boolean + String getAdvertisingIdForApp(int uid) = 10; +} diff --git a/play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java b/play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java new file mode 100644 index 0000000..657c4a5 --- /dev/null +++ b/play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java @@ -0,0 +1,80 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.ads.identifier; + +import android.app.Activity; +import android.content.Context; +import android.provider.Settings; +import com.google.android.gms.common.GooglePlayServicesNotAvailableException; +import com.google.android.gms.common.GooglePlayServicesRepairableException; + +import java.io.IOException; + +/** + * Helper library for retrieval of advertising ID and related information such as the limit ad tracking setting. + *

+ * It is intended that the advertising ID completely replace existing usage of other identifiers for ads purposes (such as use + * of {@code ANDROID_ID} in {@link Settings.Secure}) when Google Play Services is available. Cases where Google Play Services is + * unavailable are indicated by a {@link GooglePlayServicesNotAvailableException} being thrown by getAdvertisingIdInfo(). + */ +public class AdvertisingIdClient { + /** + * Retrieves the user's advertising ID and limit ad tracking preference. + *

+ * This method cannot be called in the main thread as it may block leading to ANRs. An {@code IllegalStateException} will be + * thrown if this is called on the main thread. + * + * @param context Current {@link Context} (such as the current {@link Activity}). + * @return AdvertisingIdClient.Info with user's advertising ID and limit ad tracking preference. + * @throws IOException signaling connection to Google Play Services failed. + * @throws IllegalStateException indicating this method was called on the main thread. + * @throws GooglePlayServicesNotAvailableException indicating that Google Play is not installed on this device. + * @throws GooglePlayServicesRepairableException indicating that there was a recoverable error connecting to Google Play Services. + */ + public static Info getAdvertisingIdInfo(Context context) { + // We don't actually implement this functionality, but always claim that ad tracking was limited by user preference + return new Info("00000000-0000-0000-0000-000000000000", true); + } + + /** + * Includes both the advertising ID as well as the limit ad tracking setting. + */ + public static class Info { + private final String advertisingId; + private final boolean limitAdTrackingEnabled; + + /** + * Constructs an {@code Info} Object with the specified advertising Id and limit ad tracking setting. + * + * @param advertisingId The advertising ID. + * @param limitAdTrackingEnabled The limit ad tracking setting. It is true if the user has limit ad tracking enabled. False, otherwise. + */ + public Info(String advertisingId, boolean limitAdTrackingEnabled) { + this.advertisingId = advertisingId; + this.limitAdTrackingEnabled = limitAdTrackingEnabled; + } + + /** + * Retrieves the advertising ID. + */ + public String getId() { + return advertisingId; + } + + /** + * Retrieves whether the user has limit ad tracking enabled or not. + *

+ * When the returned value is true, the returned value of {@link #getId()} will always be + * {@code 00000000-0000-0000-0000-000000000000} starting with Android 12. + */ + public boolean isLimitAdTrackingEnabled() { + return limitAdTrackingEnabled; + } + } +} diff --git a/play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/package-info.java b/play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/package-info.java new file mode 100644 index 0000000..ff949da --- /dev/null +++ b/play-services-ads-identifier/src/main/java/com/google/android/gms/ads/identifier/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes relating to the Android Advertising ID (AAID). + */ +package com.google.android.gms.ads.identifier; diff --git a/play-services-ads-lite/build.gradle b/play-services-ads-lite/build.gradle new file mode 100644 index 0000000..1c8dbe1 --- /dev/null +++ b/play-services-ads-lite/build.gradle @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +android { + namespace "com.google.android.gms.ads" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +apply from: '../gradle/publish-android.gradle' + +description = 'microG implementation of play-services-ads-lite' + +dependencies { + api 'androidx.work:work-runtime:2.7.0' + api project(':play-services-ads-base') + api project(':play-services-basement') +// api project(':play-services-measurement-sdk-api') +// api project(':user-messaging-platform') +} diff --git a/play-services-ads-lite/core/build.gradle b/play-services-ads-lite/core/build.gradle new file mode 100644 index 0000000..4c4832e --- /dev/null +++ b/play-services-ads-lite/core/build.gradle @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +dependencies { + api project(':play-services-ads-lite') + implementation project(':play-services-base-core') +} + +android { + namespace "org.microg.gms.ads" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } +} diff --git a/play-services-ads-lite/core/src/main/AndroidManifest.xml b/play-services-ads-lite/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a9ef493 --- /dev/null +++ b/play-services-ads-lite/core/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt new file mode 100644 index 0000000..dc258c2 --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.ads + +import android.os.IBinder +import android.os.Parcel +import android.util.Log +import androidx.annotation.Keep +import com.google.android.gms.ads.internal.client.IAdLoaderBuilderCreator +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator +import com.google.android.gms.dynamic.IObjectWrapper +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AdLoaderBuilder" + +@Keep +class AdLoaderBuilderCreatorImpl : IAdLoaderBuilderCreator.Stub() { + override fun newAdLoaderBuilder(context: IObjectWrapper?, adUnitId: String, adapterCreator: IAdapterCreator?, clientVersion: Int): IBinder? { + Log.d(TAG, "newAdLoaderBuilder: adUnitId=$adUnitId clientVersion=$clientVersion") + return null + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt new file mode 100644 index 0000000..398956f --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.ads + +import android.os.Parcel +import androidx.annotation.Keep +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AdManager" + +@Keep +class AdManagerCreatorImpl : AdManagerCreator.Stub() { + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = + warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt new file mode 100644 index 0000000..176a17d --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.ads + +import android.content.Context +import android.os.IBinder +import android.os.Parcel +import android.util.Log +import androidx.annotation.Keep +import com.google.android.gms.ads.internal.client.IMobileAdsSettingManagerCreator +import com.google.android.gms.dynamic.IObjectWrapper +import com.google.android.gms.dynamic.ObjectWrapper +import org.microg.gms.ads.MobileAdsSettingManagerImpl +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AdsSettingManager" + +@Keep +class MobileAdsSettingManagerCreatorImpl : IMobileAdsSettingManagerCreator.Stub() { + override fun getMobileAdsSettingManager(context: IObjectWrapper?, clientVersion: Int): IBinder { + Log.d(TAG, "getMobileAdsSettingManager($clientVersion)") + return MobileAdsSettingManagerImpl(ObjectWrapper.unwrap(context) as Context) + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} + diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt new file mode 100644 index 0000000..5959db3 --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt @@ -0,0 +1,24 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.ads.measurement + +import android.os.Parcel +import android.util.Log +import androidx.annotation.Keep +import com.google.android.gms.dynamic.IObjectWrapper +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "DynamiteMeasurement" + +@Keep +class DynamiteMeasurementManager : IMeasurementManager.Stub() { + + override fun initialize(context: IObjectWrapper?, proxy: IAppMeasurementProxy?) { + Log.d(TAG, "Not yet implemented: initialize") + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = + warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt new file mode 100644 index 0000000..318ef3d --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.ads.rewarded + +import android.content.Context +import android.os.IBinder +import android.util.Log +import androidx.annotation.Keep +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator +import com.google.android.gms.ads.internal.rewarded.client.IRewardedAdCreator +import com.google.android.gms.dynamic.IObjectWrapper +import com.google.android.gms.dynamic.ObjectWrapper +import org.microg.gms.ads.rewarded.RewardedAdImpl + +private const val TAG = "RewardedAd" + +@Keep +class ChimeraRewardedAdCreatorImpl : IRewardedAdCreator.Stub() { + override fun newRewardedAd(context: IObjectWrapper, str: String, adapterCreator: IAdapterCreator, clientVersion: Int): IBinder { + Log.d(TAG, "newRewardedAd($str, $clientVersion)") + return RewardedAdImpl(ObjectWrapper.unwrap(context) as Context?, str, adapterCreator, clientVersion) + } +} + diff --git a/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt b/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt new file mode 100644 index 0000000..a687502 --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt @@ -0,0 +1,110 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package org.microg.gms.ads + +import android.content.Context +import android.os.Handler +import android.os.Looper +import android.os.Parcel +import android.os.RemoteException +import android.util.Log +import com.google.android.gms.ads.internal.AdapterStatusParcel +import com.google.android.gms.ads.internal.RequestConfigurationParcel +import com.google.android.gms.ads.internal.client.IMobileAdsSettingManager +import com.google.android.gms.ads.internal.client.IOnAdInspectorClosedListener +import com.google.android.gms.ads.internal.initialization.IInitializationCallback +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator +import com.google.android.gms.dynamic.IObjectWrapper +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AdsSettingManager" + +class MobileAdsSettingManagerImpl(private val context: Context?) : IMobileAdsSettingManager.Stub() { + private var initialized = false + private val initializationCallbacks = mutableListOf() + private var muted = false + private var volume = 1.0f + + override fun initialize() { + Log.d(TAG, "initialize") + if (initialized) return + initialized = true + for (callback in initializationCallbacks) { + runCatching { callback.onInitialized(emptyList()) } + } + } + + override fun setAppVolume(volume: Float) { + this.volume = volume + } + + override fun fetchAppSettings(appId: String?) { + fetchAppSettingsV2(appId, null) + } + + override fun setAppMuted(muted: Boolean) { + this.muted = muted + } + + override fun openDebugMenu(context: IObjectWrapper?, adUnitId: String?) { + Log.d(TAG, "openDebugMenu($adUnitId)") + } + + override fun fetchAppSettingsV2(appId: String?, runnable: IObjectWrapper?) { + Log.d(TAG, "fetchAppSettings($appId)") + } + + override fun getAdVolume(): Float { + return volume + } + + override fun isAdMuted(): Boolean { + return muted + } + + override fun getVersionString(): String { + return "" + } + + override fun registerRtbAdapter(className: String?) { + Log.d(TAG, "registerRtbAdapter($className)") + } + + override fun setAdapterCreator(iAdapterCreator: IAdapterCreator?) { + Log.d(TAG, "Not yet implemented: setAdapterCreator") + } + + override fun addInitializationCallback(callback: IInitializationCallback?) { + Log.d(TAG, "addInitializationCallback") + callback?.let { initializationCallbacks.add(it) } + } + + override fun getAdapterStatus(): List { + Log.d(TAG, "getAdapterStatus") + return arrayListOf(AdapterStatusParcel("com.google.android.gms.ads.MobileAds", true, 0, "Dummy")) + } + + override fun setRequestConfiguration(configuration: RequestConfigurationParcel?) { + Log.d(TAG, "setRequestConfiguration") + } + + override fun disableMediationAdapterInitialization() { + Log.d(TAG, "disableMediationAdapterInitialization") + } + + override fun openAdInspector(listener: IOnAdInspectorClosedListener?) { + Log.d(TAG, "openAdInspector") + } + + override fun enableSameAppKey(enabled: Boolean) { + Log.d(TAG, "enableSameAppKey($enabled)") + } + + override fun setPlugin(plugin: String?) { + Log.d(TAG, "setPlugin($plugin)") + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} \ No newline at end of file diff --git a/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt b/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt new file mode 100644 index 0000000..7767301 --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.ads.rewarded + +import android.os.Bundle +import android.util.Log +import com.google.android.gms.ads.internal.AdapterResponseInfoParcel +import com.google.android.gms.ads.internal.client.IResponseInfo + +private const val TAG = "RewardedAdResponseInfo" + +class ResponseInfoImpl : IResponseInfo.Stub() { + override fun getMediationAdapterClassName(): String? { + Log.d(TAG, "getMediationAdapterClassName") + return null + } + + override fun getResponseId(): String? { + Log.d(TAG, "getResponseId") + return null + } + + override fun getAdapterResponseInfo(): List { + Log.d(TAG, "getAdapterResponseInfo") + return arrayListOf() + } + + override fun getLoadedAdapterResponse(): AdapterResponseInfoParcel? { + Log.d(TAG, "getLoadedAdapterResponse") + return null + } + + override fun getResponseExtras(): Bundle { + Log.d(TAG, "getResponseExtras") + return Bundle() + } +} \ No newline at end of file diff --git a/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt b/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt new file mode 100644 index 0000000..33b3bd8 --- /dev/null +++ b/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt @@ -0,0 +1,108 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.ads.rewarded + +import android.content.Context +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.os.RemoteException +import android.util.Log +import com.google.android.gms.ads.internal.AdErrorParcel +import com.google.android.gms.ads.internal.AdRequestParcel +import com.google.android.gms.ads.internal.ServerSideVerificationOptionsParcel +import com.google.android.gms.ads.internal.client.IOnAdMetadataChangedListener +import com.google.android.gms.ads.internal.client.IOnPaidEventListener +import com.google.android.gms.ads.internal.client.IResponseInfo +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator +import com.google.android.gms.ads.internal.rewarded.client.* +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.dynamic.IObjectWrapper + +private const val TAG = "RewardedAd" + +class RewardedAdImpl(context: Context?, str: String?, adapterCreator: IAdapterCreator?, clientVersion: Int) : IRewardedAd.Stub() { + private var immersive: Boolean = false + + private fun load(request: AdRequestParcel, callback: IRewardedAdLoadCallback, interstitial: Boolean) { + Handler(Looper.getMainLooper()).post { + try { + callback.onAdLoadError(AdErrorParcel().apply { code = CommonStatusCodes.INTERNAL_ERROR; message = "Not supported" }) + } catch (e: RemoteException) { + Log.w(TAG, e) + } + } + } + + override fun load(request: AdRequestParcel, callback: IRewardedAdLoadCallback) { + Log.d(TAG, "load") + load(request, callback, false) + } + + override fun setCallback(callback: IRewardedAdCallback) { + Log.d(TAG, "setCallback") + } + + override fun canBeShown(): Boolean { + Log.d(TAG, "canBeShown") + return false + } + + override fun getMediationAdapterClassName(): String { + Log.d(TAG, "getMediationAdapterClassName") + return responseInfo.mediationAdapterClassName + } + + override fun show(activity: IObjectWrapper) { + Log.d(TAG, "show") + showWithImmersive(activity, immersive) + } + + override fun setRewardedAdSkuListener(listener: IRewardedAdSkuListener?) { + Log.d(TAG, "setRewardedAdSkuListener") + } + + override fun setServerSideVerificationOptions(options: ServerSideVerificationOptionsParcel) { + Log.d(TAG, "setServerSideVerificationOptions") + } + + override fun setOnAdMetadataChangedListener(listener: IOnAdMetadataChangedListener) { + Log.d(TAG, "setOnAdMetadataChangedListener") + } + + override fun getAdMetadata(): Bundle { + Log.d(TAG, "getAdMetadata") + return Bundle() + } + + override fun showWithImmersive(activity: IObjectWrapper?, immersive: Boolean) { + Log.d(TAG, "showWithBoolean") + } + + override fun getRewardItem(): IRewardItem? { + Log.d(TAG, "getRewardItem") + return null + } + + override fun getResponseInfo(): IResponseInfo { + Log.d(TAG, "getResponseInfo") + return ResponseInfoImpl() + } + + override fun setOnPaidEventListener(listener: IOnPaidEventListener) { + Log.d(TAG, "setOnPaidEventListener") + } + + override fun loadInterstitial(request: AdRequestParcel, callback: IRewardedAdLoadCallback) { + Log.d(TAG, "loadInterstitial") + load(request, callback, true) + } + + override fun setImmersiveMode(enabled: Boolean) { + Log.d(TAG, "setImmersiveMode($enabled)") + } +} + diff --git a/play-services-ads-lite/src/main/AndroidManifest.xml b/play-services-ads-lite/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1b55c5b --- /dev/null +++ b/play-services-ads-lite/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl new file mode 100644 index 0000000..7e07dd0 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl @@ -0,0 +1,4 @@ +package com.google.android.gms.ads; + +interface AdManagerCreator { +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl new file mode 100644 index 0000000..54251c3 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable AdErrorParcel; \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl new file mode 100644 index 0000000..220425e --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable AdRequestParcel; \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl new file mode 100644 index 0000000..822be57 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable AdapterResponseInfoParcel; \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl new file mode 100644 index 0000000..fc1bd40 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable AdapterStatusParcel; \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl new file mode 100644 index 0000000..45e9ebe --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable RequestConfigurationParcel; \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl new file mode 100644 index 0000000..b0b93d4 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable ServerSideVerificationOptionsParcel; \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl new file mode 100644 index 0000000..b6f63ac --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator; +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IAdLoaderBuilderCreator { + IBinder newAdLoaderBuilder(IObjectWrapper context, String adUnitId, IAdapterCreator adapterCreator, int clientVersion); +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl new file mode 100644 index 0000000..1df1f51 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl @@ -0,0 +1,29 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.ads.internal.AdapterStatusParcel; +import com.google.android.gms.ads.internal.RequestConfigurationParcel; +import com.google.android.gms.ads.internal.client.IOnAdInspectorClosedListener; +import com.google.android.gms.ads.internal.initialization.IInitializationCallback; +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator; +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IMobileAdsSettingManager { + void initialize() = 0; + void setAppVolume(float volume) = 1; + void fetchAppSettings(String appId) = 2; + void setAppMuted(boolean muted) = 3; + void openDebugMenu(IObjectWrapper context, String adUnitId) = 4; + void fetchAppSettingsV2(String appId, IObjectWrapper runnable) = 5; + float getAdVolume() = 6; + boolean isAdMuted() = 7; + String getVersionString() = 8; + void registerRtbAdapter(String className) = 9; + void setAdapterCreator(IAdapterCreator iAdapterCreator) = 10; + void addInitializationCallback(IInitializationCallback callback) = 11; + List getAdapterStatus() = 12; + void setRequestConfiguration(in RequestConfigurationParcel configuration) = 13; + void disableMediationAdapterInitialization() = 14; + void openAdInspector(IOnAdInspectorClosedListener listener) = 15; + void enableSameAppKey(boolean enabled) = 16; + void setPlugin(String plugin) = 17; +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl new file mode 100644 index 0000000..f468200 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IMobileAdsSettingManagerCreator { + IBinder getMobileAdsSettingManager(IObjectWrapper context, int clientVersion); +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl new file mode 100644 index 0000000..63f625c --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.ads.internal.AdErrorParcel; + +interface IOnAdInspectorClosedListener { + void onAdInspectorClosed(in @nullable AdErrorParcel adErrorParcel); +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl new file mode 100644 index 0000000..3a4ba6e --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.ads.internal.AdErrorParcel; + +interface IOnAdMetadataChangedListener { +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl new file mode 100644 index 0000000..8f2d342 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.ads.internal.AdErrorParcel; + +interface IOnPaidEventListener { +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl new file mode 100644 index 0000000..3b6fcd7 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.ads.internal.client; + +import com.google.android.gms.ads.internal.AdapterResponseInfoParcel; + +interface IResponseInfo { + String getMediationAdapterClassName() = 0; + String getResponseId() = 1; + List getAdapterResponseInfo() = 2; + AdapterResponseInfoParcel getLoadedAdapterResponse() = 3; + Bundle getResponseExtras() = 4; +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl new file mode 100644 index 0000000..259c869 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.ads.internal.initialization; + +import com.google.android.gms.ads.internal.AdapterStatusParcel; + +interface IInitializationCallback { + void onInitialized(in List status); +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl new file mode 100644 index 0000000..dae5d56 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.ads.internal.mediation.client; + +interface IAdapterCreator { + +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl new file mode 100644 index 0000000..9d0cb53 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl @@ -0,0 +1,4 @@ +package com.google.android.gms.ads.internal.rewarded.client; + +interface IRewardItem { +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl new file mode 100644 index 0000000..b3e1f51 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl @@ -0,0 +1,30 @@ +package com.google.android.gms.ads.internal.rewarded.client; + +import com.google.android.gms.ads.internal.AdRequestParcel; +import com.google.android.gms.ads.internal.ServerSideVerificationOptionsParcel; +import com.google.android.gms.ads.internal.client.IOnPaidEventListener; +import com.google.android.gms.ads.internal.client.IOnAdMetadataChangedListener; +import com.google.android.gms.ads.internal.client.IResponseInfo; +import com.google.android.gms.ads.internal.rewarded.client.IRewardedAdCallback; +import com.google.android.gms.ads.internal.rewarded.client.IRewardedAdLoadCallback; +import com.google.android.gms.ads.internal.rewarded.client.IRewardedAdSkuListener; +import com.google.android.gms.ads.internal.rewarded.client.IRewardItem; +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IRewardedAd { + void load(in AdRequestParcel request, IRewardedAdLoadCallback callback) = 0; + void setCallback(IRewardedAdCallback callback) = 1; + boolean canBeShown() = 2; + String getMediationAdapterClassName() = 3; + void show(IObjectWrapper activity) = 4; + void setRewardedAdSkuListener(IRewardedAdSkuListener listener) = 5; + void setServerSideVerificationOptions(in ServerSideVerificationOptionsParcel options) = 6; + void setOnAdMetadataChangedListener(IOnAdMetadataChangedListener listener) = 7; + Bundle getAdMetadata() = 8; + void showWithImmersive(IObjectWrapper activity, boolean immersive) = 9; + IRewardItem getRewardItem() = 10; + IResponseInfo getResponseInfo() = 11; + void setOnPaidEventListener(IOnPaidEventListener listener) = 12; + void loadInterstitial(in AdRequestParcel request, IRewardedAdLoadCallback callback) = 13; + void setImmersiveMode(boolean enabled) = 14; +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl new file mode 100644 index 0000000..22b7f59 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl @@ -0,0 +1,4 @@ +package com.google.android.gms.ads.internal.rewarded.client; + +interface IRewardedAdCallback { +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl new file mode 100644 index 0000000..9b0defe --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.ads.internal.rewarded.client; + +import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator; +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IRewardedAdCreator { + IBinder newRewardedAd(IObjectWrapper context, String str, IAdapterCreator adapterCreator, int clientVersion); +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl new file mode 100644 index 0000000..2bfb179 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl @@ -0,0 +1,9 @@ +package com.google.android.gms.ads.internal.rewarded.client; + +import com.google.android.gms.ads.internal.AdErrorParcel; + +interface IRewardedAdLoadCallback { + void onAdLoaded() = 0; + void onAdLoadErrorCode(int code) = 1; + void onAdLoadError(in AdErrorParcel error) = 2; +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl new file mode 100644 index 0000000..e41f52e --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.ads.internal.rewarded.client; + +import com.google.android.gms.ads.internal.AdErrorParcel; + +interface IRewardedAdSkuListener { +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl new file mode 100644 index 0000000..1fc7500 --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.ads.measurement; + +interface IAppMeasurementProxy { + +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl new file mode 100644 index 0000000..92f267b --- /dev/null +++ b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.ads.measurement; + +import com.google.android.gms.ads.measurement.IAppMeasurementProxy; +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IMeasurementManager { + void initialize(IObjectWrapper context, IAppMeasurementProxy proxy) = 1; +} \ No newline at end of file diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/admanager/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/admanager/package-info.java new file mode 100644 index 0000000..a08a3ba --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/admanager/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Google Ad Manager. + */ +package com.google.android.gms.ads.admanager; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/h5/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/h5/package-info.java new file mode 100644 index 0000000..c40c268 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/h5/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for H5 ads. + */ +package com.google.android.gms.ads.h5; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/initialization/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/initialization/package-info.java new file mode 100644 index 0000000..f06f3c0 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/initialization/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes related to SDK initialization. + */ +package com.google.android.gms.ads.initialization; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java new file mode 100644 index 0000000..89f1f30 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class AdDataParcel extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(AdDataParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java new file mode 100644 index 0000000..9757b47 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import com.google.android.gms.ads.internal.client.IResponseInfo; +import org.microg.safeparcel.AutoSafeParcelable; + +public class AdErrorParcel extends AutoSafeParcelable { + @Field(1) + public int code; + @Field(2) + public String message; + @Field(3) + public String domain; + @Field(4) + public AdErrorParcel cause; + @Field(5) + public IResponseInfo responseInfo; + public static final Creator CREATOR = new AutoCreator<>(AdErrorParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java new file mode 100644 index 0000000..cb96053 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import android.location.Location; +import android.os.Bundle; +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.List; + +public class AdRequestParcel extends AutoSafeParcelable { + @Field(1) + private int versionCode = 8; + @Field(2) + public long birthday; + @Field(3) + public Bundle adMobNetworkExtras = new Bundle(); + @Field(4) + public int gender; + @Field(5) + public ArrayList keywords; + @Field(6) + public boolean isTestDevice; + @Field(7) + public int taggedForChildDirectedTreatment; + @Field(9) + public String publisherProvidedId; + @Field(10) + public SearchAdRequestParcel searchAdRequest; + @Field(11) + public Location location; + @Field(12) + public String contentUrl; + @Field(13) + public Bundle networkExtrasBundles = new Bundle(); + @Field(14) + public Bundle customTargeting; + @Field(15) + public List categoryExclusion; + @Field(16) + public String requestAgent; + @Field(18) + public boolean designedForFamilies; + @Field(19) + public AdDataParcel adData; + @Field(20) + public int tagForUnderAgeOfConsent; + @Field(21) + public String maxAdContentRating; + @Field(22) + public List neighboringContentUrls; + @Field(23) + public int httpTimeoutMillis; + @Field(24) + public String adString; + + public static final Creator CREATOR = new AutoCreator<>(AdRequestParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java new file mode 100644 index 0000000..f1a452e --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import android.os.Bundle; +import org.microg.safeparcel.AutoSafeParcelable; + +public class AdapterResponseInfoParcel extends AutoSafeParcelable { + @Field(1) + public String adapterClassName; + @Field(2) + public long latencyMillis; + @Field(3) + public AdErrorParcel error; + @Field(4) + public Bundle credentials; + @Field(5) + public String adSourceName; + @Field(6) + public String adSourceId; + @Field(7) + public String adSourceInstanceName; + @Field(8) + public String adSourceInstanceId; + + public static final Creator CREATOR = new AutoCreator<>(AdapterResponseInfoParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java new file mode 100644 index 0000000..cd04062 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class AdapterStatusParcel extends AutoSafeParcelable { + @Field(1) + public String className; + @Field(2) + public boolean isReady; + @Field(3) + public int latency; + @Field(4) + public String description; + + public AdapterStatusParcel() {} + + public AdapterStatusParcel(String className, boolean isReady, int latency, String description) { + this.className = className; + this.isReady = isReady; + this.latency = latency; + this.description = description; + } + + public static final Creator CREATOR = new AutoCreator<>(AdapterStatusParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java new file mode 100644 index 0000000..f773f34 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class RequestConfigurationParcel extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(RequestConfigurationParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java new file mode 100644 index 0000000..d37b1c5 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SearchAdRequestParcel extends AutoSafeParcelable { + @Field(15) + public String query; + public static final Creator CREATOR = new AutoCreator<>(SearchAdRequestParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java new file mode 100644 index 0000000..1b516a3 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ServerSideVerificationOptionsParcel extends AutoSafeParcelable { + @Field(1) + public String userId; + @Field(2) + public String customData; + public static final Creator CREATOR = new AutoCreator<>(ServerSideVerificationOptionsParcel.class); +} diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/interstitial/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/interstitial/package-info.java new file mode 100644 index 0000000..dc0a9f2 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/interstitial/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Interstitial Ads. + */ +package com.google.android.gms.ads.interstitial; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java new file mode 100644 index 0000000..06bb35b --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Google Mobile Ads mediation custom events. + */ +package com.google.android.gms.ads.mediation.customevent; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/package-info.java new file mode 100644 index 0000000..d1df53d --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Google Mobile Ads mediation adapters. + */ +package com.google.android.gms.ads.mediation; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java new file mode 100644 index 0000000..af175ec --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Google Mobile Ads RTB mediation adapters. + */ +package com.google.android.gms.ads.mediation.rtb; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/nativead/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/nativead/package-info.java new file mode 100644 index 0000000..a1c245c --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/nativead/package-info.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for native ads functionality within Google Mobile + Ads. + */ +package com.google.android.gms.ads.nativead; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/package-info.java new file mode 100644 index 0000000..69f78b9 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Google Mobile Ads. + */ +package com.google.android.gms.ads; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewarded/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewarded/package-info.java new file mode 100644 index 0000000..685d4c4 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewarded/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Rewarded Ads. + */ +package com.google.android.gms.ads.rewarded; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java new file mode 100644 index 0000000..c37680e --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Rewarded Interstitial Ads. + */ +package com.google.android.gms.ads.rewardedinterstitial; diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/search/package-info.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/search/package-info.java new file mode 100644 index 0000000..50d72e4 --- /dev/null +++ b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/search/package-info.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * Contains classes for Search Ads for Apps. + */ +package com.google.android.gms.ads.search; diff --git a/play-services-ads/build.gradle b/play-services-ads/build.gradle new file mode 100644 index 0000000..34c0447 --- /dev/null +++ b/play-services-ads/build.gradle @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +android { + namespace "com.google.android.gms.ads.impl" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +apply from: '../gradle/publish-android.gradle' + +description = 'microG implementation of play-services-ads' + +dependencies { + implementation 'androidx.browser:browser:1.4.0' + implementation 'androidx.collection:collection:1.0.0' + implementation 'androidx.core:core:1.0.0' + api project(':play-services-ads-base') + api project(':play-services-ads-identifier') + api project(':play-services-ads-lite') +// api project(':play-services-appset') + api project(':play-services-basement') + api project(':play-services-tasks') +} diff --git a/play-services-ads/core/build.gradle b/play-services-ads/core/build.gradle new file mode 100644 index 0000000..c9beaf9 --- /dev/null +++ b/play-services-ads/core/build.gradle @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +dependencies { + api project(':play-services-ads') + implementation project(':play-services-base-core') + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" +} + +android { + namespace "org.microg.gms.ads.impl" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } +} diff --git a/play-services-ads/core/src/main/AndroidManifest.xml b/play-services-ads/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..78f153d --- /dev/null +++ b/play-services-ads/core/src/main/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/play-services-ads/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/ads/dynamite/ModuleDescriptor.java b/play-services-ads/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/ads/dynamite/ModuleDescriptor.java new file mode 100644 index 0000000..94ed94c --- /dev/null +++ b/play-services-ads/core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/ads/dynamite/ModuleDescriptor.java @@ -0,0 +1,74 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.dynamite.descriptors.com.google.android.gms.ads.dynamite; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.SharedPreferences; +import android.util.Log; +import androidx.annotation.Keep; + +import java.util.Locale; + +import static android.os.Build.DEVICE; +import static android.os.Build.DISPLAY; +import static android.os.Build.VERSION.RELEASE; + +@Keep +public class ModuleDescriptor { + public static final String MODULE_ID = "com.google.android.gms.ads.dynamite"; + public static final int MODULE_VERSION = 230500001; + private static final String TAG = "AdsDynamiteModule"; + + /** + * The ads module might try to access the user agent, requiring initialization on the main thread, + * which may result in deadlocks when invoked from any other thread. This only happens with microG, + * because we don't use the highly privileged SELinux Sandbox that regular Play Services uses + * (which allows apps to read the user-agent from Play Services instead of the WebView). To prevent + * the issue we pre-emptively write a user agent in the local storage of the app. + */ + public static void init(Context context) { + do { + try { + injectUserAgentSharedPreference(context); + } catch (Exception e) { + } + if (context instanceof ContextWrapper) { + Context baseContext = ((ContextWrapper) context).getBaseContext(); + if (context == baseContext) break; + context = baseContext; + } else { + break; + } + } while (context != null); + } + + /** + * @return A user-agent representing a browser on the current device. + */ + private static String buildDefaultUserAgent() { + StringBuilder sb = new StringBuilder(); + sb.append("Mozilla/5.0 (Linux; U; Android"); + if (RELEASE != null) sb.append(" ").append(RELEASE); + sb.append("; ").append(Locale.getDefault()); + if (DEVICE != null) { + sb.append("; ").append(DEVICE); + if (DISPLAY != null) sb.append(" Build/").append(DISPLAY); + } + sb.append(") AppleWebKit/533 Version/4.0 Safari/533"); + return sb.toString(); + } + + @SuppressLint("ApplySharedPref") + private static void injectUserAgentSharedPreference(Context context) { + SharedPreferences preferences = context.getSharedPreferences("admob_user_agent", Context.MODE_PRIVATE); + if (!preferences.contains("user_agent")) { + preferences.edit().putString("user_agent", buildDefaultUserAgent()).commit(); + Log.d(TAG, "Injected admob_user_agent into package " + context.getPackageName()); + } + } +} diff --git a/play-services-ads/core/src/main/kotlin/org/microg/gms/ads/AdRequestService.kt b/play-services-ads/core/src/main/kotlin/org/microg/gms/ads/AdRequestService.kt new file mode 100644 index 0000000..e451313 --- /dev/null +++ b/play-services-ads/core/src/main/kotlin/org/microg/gms/ads/AdRequestService.kt @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.ads + +import android.os.Bundle +import android.os.Parcel +import android.util.Log +import com.google.android.gms.ads.internal.ExceptionParcel +import com.google.android.gms.ads.internal.NonagonRequestParcel +import com.google.android.gms.ads.internal.request.IAdRequestService +import com.google.android.gms.ads.internal.request.INonagonStreamingResponseListener +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.common.PackageUtils +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AdRequestService" + +class AdRequestService : BaseService(TAG, GmsService.ADREQUEST) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + val packageName = PackageUtils.getAndCheckCallingPackage(this, request.packageName) + ?: throw IllegalArgumentException("Missing package name") + val binder = AdRequestServiceImpl().asBinder() + callback.onPostInitComplete(CommonStatusCodes.SUCCESS, binder, Bundle()) + } +} + +class AdRequestServiceImpl : IAdRequestService.Stub() { + override fun getAdRequest(request: NonagonRequestParcel, listener: INonagonStreamingResponseListener) { + Log.d(TAG, "getAdRequest") + listener.onException(ExceptionParcel().apply { + message = "Not supported" + code = CommonStatusCodes.INTERNAL_ERROR + }) + } + + override fun getSignals(request: NonagonRequestParcel, listener: INonagonStreamingResponseListener) { + Log.d(TAG, "getSignals") + listener.onException(ExceptionParcel().apply { + message = "Not supported" + code = CommonStatusCodes.INTERNAL_ERROR + }) + } + + override fun getUrlAndCacheKey(request: NonagonRequestParcel, listener: INonagonStreamingResponseListener) { + Log.d(TAG, "getUrlAndCacheKey") + listener.onException(ExceptionParcel().apply { + message = "Not supported" + code = CommonStatusCodes.INTERNAL_ERROR + }) + } + + override fun removeCacheUrl(key: String, listener: INonagonStreamingResponseListener) { + Log.d(TAG, "removeCacheUrl") + listener.onException(ExceptionParcel().apply { + message = "Not supported" + code = CommonStatusCodes.INTERNAL_ERROR + }) + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} \ No newline at end of file diff --git a/play-services-ads/src/main/AndroidManifest.xml b/play-services-ads/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2a578f7 --- /dev/null +++ b/play-services-ads/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/ExceptionParcel.aidl b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/ExceptionParcel.aidl new file mode 100644 index 0000000..41b8774 --- /dev/null +++ b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/ExceptionParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable ExceptionParcel; \ No newline at end of file diff --git a/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/NonagonRequestParcel.aidl b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/NonagonRequestParcel.aidl new file mode 100644 index 0000000..f952919 --- /dev/null +++ b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/NonagonRequestParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.ads.internal; + +parcelable NonagonRequestParcel; \ No newline at end of file diff --git a/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/IAdRequestService.aidl b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/IAdRequestService.aidl new file mode 100644 index 0000000..52ca62a --- /dev/null +++ b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/IAdRequestService.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.ads.internal.request; + +import com.google.android.gms.ads.internal.NonagonRequestParcel; +import com.google.android.gms.ads.internal.request.INonagonStreamingResponseListener; + +interface IAdRequestService { + void getAdRequest(in NonagonRequestParcel request, INonagonStreamingResponseListener listener) = 3; + void getSignals(in NonagonRequestParcel request, INonagonStreamingResponseListener listener) = 4; + void getUrlAndCacheKey(in NonagonRequestParcel request, INonagonStreamingResponseListener listener) = 5; + void removeCacheUrl(String key, INonagonStreamingResponseListener listener) = 6; +} \ No newline at end of file diff --git a/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/INonagonStreamingResponseListener.aidl b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/INonagonStreamingResponseListener.aidl new file mode 100644 index 0000000..78eae30 --- /dev/null +++ b/play-services-ads/src/main/aidl/com/google/android/gms/ads/internal/request/INonagonStreamingResponseListener.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.ads.internal.request; + +import com.google.android.gms.ads.internal.ExceptionParcel; + +interface INonagonStreamingResponseListener { + void onSuccess(in ParcelFileDescriptor fd); + void onException(in ExceptionParcel exception); +} \ No newline at end of file diff --git a/play-services-ads/src/main/java/com/google/android/gms/ads/internal/ExceptionParcel.java b/play-services-ads/src/main/java/com/google/android/gms/ads/internal/ExceptionParcel.java new file mode 100644 index 0000000..55ddf34 --- /dev/null +++ b/play-services-ads/src/main/java/com/google/android/gms/ads/internal/ExceptionParcel.java @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ExceptionParcel extends AutoSafeParcelable { + @Field(1) + public String message; + @Field(2) + public int code; + public static final Creator CREATOR = new AutoCreator<>(ExceptionParcel.class); +} diff --git a/play-services-ads/src/main/java/com/google/android/gms/ads/internal/NonagonRequestParcel.java b/play-services-ads/src/main/java/com/google/android/gms/ads/internal/NonagonRequestParcel.java new file mode 100644 index 0000000..866ef36 --- /dev/null +++ b/play-services-ads/src/main/java/com/google/android/gms/ads/internal/NonagonRequestParcel.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.ads.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class NonagonRequestParcel extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(NonagonRequestParcel.class); +} diff --git a/play-services-api/build.gradle b/play-services-api/build.gradle new file mode 100644 index 0000000..11c3911 --- /dev/null +++ b/play-services-api/build.gradle @@ -0,0 +1,46 @@ +/* + * Copyright 2013-2015 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: 'com.android.library' + +android { + namespace "org.microg.gms.api" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } +} + +dependencies { + api project(':play-services-base') + api project(':play-services-phenotype') + + annotationProcessor project(':safe-parcel-processor') +} diff --git a/play-services-api/src/main/AndroidManifest.xml b/play-services-api/src/main/AndroidManifest.xml new file mode 100644 index 0000000..359a9b7 --- /dev/null +++ b/play-services-api/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + diff --git a/play-services-api/src/main/aidl/com/google/android/gms/ads/omid/IOmid.aidl b/play-services-api/src/main/aidl/com/google/android/gms/ads/omid/IOmid.aidl new file mode 100644 index 0000000..22a0cbc --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/ads/omid/IOmid.aidl @@ -0,0 +1,16 @@ +package com.google.android.gms.ads.omid; + +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IOmid { + boolean initializeOmid(IObjectWrapper context) = 1; + IObjectWrapper createHtmlAdSession(String version, IObjectWrapper webView, String customReferenceData, String impressionOwner, String altImpressionOwner) = 2; + void startAdSession(IObjectWrapper adSession) = 3; + void registerAdView(IObjectWrapper adSession, IObjectWrapper view) = 4; + String getVersion() = 5; + void finishAdSession(IObjectWrapper adSession) = 6; + void addFriendlyObstruction(IObjectWrapper adSession, IObjectWrapper view) = 7; + IObjectWrapper createHtmlAdSessionWithPartnerName(String version, IObjectWrapper webView, String customReferenceData, String impressionOwner, String altImpressionOwner, String parterName) = 8; + IObjectWrapper createJavascriptAdSessionWithPartnerNameImpressionCreativeType(String version, IObjectWrapper webView, String customReferenceData, String impressionOwner, String altImpressionOwner, String parterName, String impressionType, String creativeType, String contentUrl) = 9; + IObjectWrapper createHtmlAdSessionWithPartnerNameImpressionCreativeType(String version, IObjectWrapper webView, String customReferenceData, String impressionOwner, String altImpressionOwner, String parterName, String impressionType, String creativeType, String contentUrl) = 10; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/CorpusStatus.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/CorpusStatus.aidl new file mode 100644 index 0000000..f893aef --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/CorpusStatus.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable CorpusStatus; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdate.aidl new file mode 100644 index 0000000..c7f5e43 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdate.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable PIMEUpdate; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdateResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdateResponse.aidl new file mode 100644 index 0000000..0ae6e4b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/PIMEUpdateResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable PIMEUpdateResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/RequestIndexingSpecification.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/RequestIndexingSpecification.aidl new file mode 100644 index 0000000..a0a785c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/RequestIndexingSpecification.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable RequestIndexingSpecification; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestSpecification.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestSpecification.aidl new file mode 100644 index 0000000..0b3c47f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestSpecification.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable SuggestSpecification; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestionResults.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestionResults.aidl new file mode 100644 index 0000000..57d2d63 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/SuggestionResults.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable SuggestionResults; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/UsageInfo.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/UsageInfo.aidl new file mode 100644 index 0000000..b52e3d4 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/UsageInfo.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.appdatasearch; + +parcelable UsageInfo; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/IAppDataSearch.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/IAppDataSearch.aidl new file mode 100644 index 0000000..ebc204c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/IAppDataSearch.aidl @@ -0,0 +1,14 @@ +package com.google.android.gms.appdatasearch.internal; + +import com.google.android.gms.appdatasearch.CorpusStatus; +import com.google.android.gms.appdatasearch.PIMEUpdateResponse; +import com.google.android.gms.appdatasearch.RequestIndexingSpecification; +import com.google.android.gms.appdatasearch.SuggestionResults; +import com.google.android.gms.appdatasearch.SuggestSpecification; + +interface IAppDataSearch { + SuggestionResults getSuggestions(String var1, String packageName, in String[] accounts, int maxNum, in SuggestSpecification specs) = 1; + boolean requestIndexing(String packageName, String accountName, long l, in RequestIndexingSpecification specs) = 3; + CorpusStatus getStatus(String packageName, String accountName) = 4; + PIMEUpdateResponse requestPIMEUpdate(String s1, String s2, int i, in byte[] bs) = 34; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearch.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearch.aidl new file mode 100644 index 0000000..77e618a --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearch.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.appdatasearch.internal; + +import com.google.android.gms.appdatasearch.internal.ILightweightAppDataSearchCallbacks; +import com.google.android.gms.appdatasearch.UsageInfo; + +interface ILightweightAppDataSearch { + void view(ILightweightAppDataSearchCallbacks callbacks, String packageName, in UsageInfo[] usageInfos); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearchCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearchCallbacks.aidl new file mode 100644 index 0000000..338a142 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/appdatasearch/internal/ILightweightAppDataSearchCallbacks.aidl @@ -0,0 +1,4 @@ +package com.google.android.gms.appdatasearch.internal; + +interface ILightweightAppDataSearchCallbacks { +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/audit/LogAuditRecordsRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/audit/LogAuditRecordsRequest.aidl new file mode 100644 index 0000000..e2a0155 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/audit/LogAuditRecordsRequest.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.audit; + +parcelable LogAuditRecordsRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/audit/internal/IAuditService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/audit/internal/IAuditService.aidl new file mode 100644 index 0000000..7e26825 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/audit/internal/IAuditService.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.audit.internal; + +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.audit.LogAuditRecordsRequest; + +interface IAuditService { + void logAuditRecords(in LogAuditRecordsRequest request, IStatusCallback callback); +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl new file mode 100644 index 0000000..ee7f733 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.auth.appcert; + +interface IAppCertService { + boolean fetchDeviceKey() = 0; + String getSpatulaHeader(String packageName) = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl new file mode 100644 index 0000000..973de92 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.checkin.internal; + +interface ICheckinService { + String getDeviceDataVersionInfo(); + long getLastCheckinSuccessTime(); + String getLastSimOperator(); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/IPendingIntentCallback.aidl b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/IPendingIntentCallback.aidl new file mode 100644 index 0000000..7af7a04 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/IPendingIntentCallback.aidl @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.common; + +import com.google.android.gms.common.api.Status; + +interface IPendingIntentCallback { + void onPendingIntent(in Status status, in PendingIntent pendingIntent); +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/ISettingsCallback.aidl b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/ISettingsCallback.aidl new file mode 100644 index 0000000..ef9ef41 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/common/ISettingsCallback.aidl @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.common; + +import com.google.android.gms.common.api.Status; + +interface ISettingsCallback { + void onSetting(in Status status, in byte[] value); +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/firstparty/internal/ICredentialManagerService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/firstparty/internal/ICredentialManagerService.aidl new file mode 100644 index 0000000..39ab381 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/firstparty/internal/ICredentialManagerService.aidl @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.firstparty.internal; + +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.credential.manager.common.IPendingIntentCallback; +import com.google.android.gms.credential.manager.common.ISettingsCallback; +import com.google.android.gms.credential.manager.invocationparams.CredentialManagerInvocationParams; + +interface ICredentialManagerService { + void getCredentialManagerIntent(IPendingIntentCallback callback, in CredentialManagerInvocationParams params) = 0; + void getSetting(ISettingsCallback callback, String key) = 1; + void setSetting(IStatusCallback callback, String key, in byte[] value) = 2; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.aidl b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.aidl new file mode 100644 index 0000000..81d4301 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.invocationparams; + +parcelable CredentialManagerInvocationParams; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/FacsCacheCallOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/FacsCacheCallOptions.aidl new file mode 100644 index 0000000..72a9af0 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/FacsCacheCallOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.facs.cache; + +parcelable FacsCacheCallOptions; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.aidl new file mode 100644 index 0000000..5bac21a --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.facs.cache; + +parcelable ForceSettingsCacheRefreshResult; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.aidl new file mode 100644 index 0000000..627417d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.facs.cache; + +parcelable GetActivityControlsSettingsResult; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.aidl new file mode 100644 index 0000000..936f2ee --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.facs.cache; + +parcelable ReadDeviceLevelSettingsResult; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.aidl new file mode 100644 index 0000000..051f9e0 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.facs.cache; + +parcelable UpdateActivityControlsSettingsResult; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheCallbacks.aidl new file mode 100644 index 0000000..ecea95a --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheCallbacks.aidl @@ -0,0 +1,15 @@ +package com.google.android.gms.facs.cache.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.facs.cache.ForceSettingsCacheRefreshResult; +import com.google.android.gms.facs.cache.GetActivityControlsSettingsResult; +import com.google.android.gms.facs.cache.ReadDeviceLevelSettingsResult; +import com.google.android.gms.facs.cache.UpdateActivityControlsSettingsResult; + +interface IFacsCacheCallbacks { + void onForceSettingsCacheRefreshResult(in Status status, in ForceSettingsCacheRefreshResult result) = 0; + void onUpdateActivityControlsSettingsResult(in Status status, in UpdateActivityControlsSettingsResult result) = 1; + void onGetActivityControlsSettingsResult(in Status status, in GetActivityControlsSettingsResult result) = 2; + void onWriteDeviceLevelSettingsResult(in Status status) = 3; + void onReadDeviceLevelSettingsResult(in Status status, in ReadDeviceLevelSettingsResult result) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheService.aidl new file mode 100644 index 0000000..534c9de --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/facs/cache/internal/IFacsCacheService.aidl @@ -0,0 +1,12 @@ +package com.google.android.gms.facs.cache.internal; + +import com.google.android.gms.facs.cache.FacsCacheCallOptions; +import com.google.android.gms.facs.cache.internal.IFacsCacheCallbacks; + +interface IFacsCacheService { + void forceSettingsCacheRefresh(IFacsCacheCallbacks callbacks, in FacsCacheCallOptions options) = 0; + void updateActivityControlsSettings(IFacsCacheCallbacks callbacks, in byte[] bytes, in FacsCacheCallOptions options) = 1; + void getActivityControlsSettings(IFacsCacheCallbacks callbacks, in FacsCacheCallOptions options) = 2; + void readDeviceLevelSettings(IFacsCacheCallbacks callbacks) = 3; + void writeDeviceLevelSettings(IFacsCacheCallbacks callbacks, in byte[] bytes) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl new file mode 100644 index 0000000..0b4980d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable ErrorReport; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/FeedbackOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/FeedbackOptions.aidl new file mode 100644 index 0000000..8e90ece --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/FeedbackOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.feedback; + +parcelable FeedbackOptions; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl new file mode 100644 index 0000000..d6dd158 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable FileTeleporter; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl new file mode 100644 index 0000000..433575b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable LogOptions; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl new file mode 100644 index 0000000..7b189c9 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable ThemeSettings; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl new file mode 100644 index 0000000..eeb50c9 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback.internal; + +interface IFeedbackCallbacks { + void onServiceDestroy(); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl new file mode 100644 index 0000000..48401b0 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback.internal; + +import com.google.android.gms.feedback.FeedbackOptions; +import android.os.IBinder; +import android.os.IInterface; +import android.os.Parcel; +import com.google.android.gms.googlehelp.GoogleHelp; +import com.google.android.gms.feedback.ErrorReport; +import android.content.Context; +import android.os.Bundle; +import android.content.Intent; + + +interface IFeedbackService { + + boolean startFeedbackFlow(in ErrorReport errorReport) = 0; + + boolean silentSendFeedback(in ErrorReport errorReport) = 2; + + void saveFeedbackDataAsync(in Bundle bundle, long id) = 3; + + void saveFeedbackDataAsyncWithOption(in FeedbackOptions options, in Bundle bundle, long id) = 4; + + void startFeedbackFlowAsync(in ErrorReport errorReport, long id) = 5; + + boolean isValidConfiguration(in FeedbackOptions options) = 6; + +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassRequestParcel.aidl b/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassRequestParcel.aidl new file mode 100644 index 0000000..ffe2ae7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassRequestParcel.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.gass.internal; + +parcelable GassRequestParcel; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassResponseParcel.aidl b/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassResponseParcel.aidl new file mode 100644 index 0000000..f8f40a7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/GassResponseParcel.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.gass.internal; + +parcelable GassResponseParcel; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/IGassService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/IGassService.aidl new file mode 100644 index 0000000..7fafe56 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/gass/internal/IGassService.aidl @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.gass.internal; + +import android.os.Bundle; +import android.os.IInterface; +import com.google.android.gms.gass.internal.GassRequestParcel; +import com.google.android.gms.gass.internal.GassResponseParcel; + +interface IGassService { + GassResponseParcel getGassResponse(in GassRequestParcel gassRequestParcel) = 0; + Bundle getGassBundle(in Bundle bundle, int code) = 3; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/GoogleHelp.aidl b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/GoogleHelp.aidl new file mode 100644 index 0000000..9da8ad7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/GoogleHelp.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.googlehelp; + +parcelable GoogleHelp; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/InProductHelp.aidl b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/InProductHelp.aidl new file mode 100644 index 0000000..717af5b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/InProductHelp.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.googlehelp; + +parcelable InProductHelp; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/SupportRequestHelp.aidl b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/SupportRequestHelp.aidl new file mode 100644 index 0000000..4093b9c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/SupportRequestHelp.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.googlehelp; + +parcelable SupportRequestHelp; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpCallbacks.aidl new file mode 100644 index 0000000..777fbf5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpCallbacks.aidl @@ -0,0 +1,26 @@ +package com.google.android.gms.googlehelp.internal.common; + +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcel; + +import com.google.android.gms.googlehelp.GoogleHelp; +import com.google.android.gms.googlehelp.InProductHelp; + +interface IGoogleHelpCallbacks { + void onProcessGoogleHelpFinished(in GoogleHelp googleHelp) = 0; + oneway void onSaveAsyncPsdFinished() = 6; + oneway void onSaveAsyncPsbdFinished() = 7; + void onRequestChatSupportSuccess(int chatQueuePosition) = 8; + void onRequestChatSupportFailed() = 9; + void onRequestC2cSupportSuccess() = 10; + void onRequestC2cSupportFailed() = 11; + void onSuggestions(in byte[] suggestions) = 12; + void onNoSuggestions() = 13; + void onEscalationOptions(in byte[] options) = 14; + void onNoEscalationOptions() = 15; + void onProcessInProductHelpFinished(in InProductHelp inProductHelp) = 16; + void onRealtimeSupportStatus(in byte[] status) = 17; + void onNoRealtimeSupportStatus() = 18; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpService.aidl new file mode 100644 index 0000000..6fbb2a2 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/googlehelp/internal/common/IGoogleHelpService.aidl @@ -0,0 +1,26 @@ +package com.google.android.gms.googlehelp.internal.common; + +import android.graphics.Bitmap; +import android.os.Bundle; + +import com.google.android.gms.feedback.FeedbackOptions; +import com.google.android.gms.googlehelp.GoogleHelp; +import com.google.android.gms.googlehelp.InProductHelp; +import com.google.android.gms.googlehelp.SupportRequestHelp; +import com.google.android.gms.googlehelp.internal.common.IGoogleHelpCallbacks; + +interface IGoogleHelpService { + void processGoogleHelpAndPip(in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 0; + void processGoogleHelpAndPipWithBitmap(in GoogleHelp googleHelp, in Bitmap bitmap, IGoogleHelpCallbacks callbacks) = 1; + oneway void saveAsyncHelpPsd(in Bundle bundle, long timestamp, in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 7; + oneway void saveAsyncFeedbackPsd(in Bundle bundle, long timestamp, in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 8; + oneway void saveAsyncFeedbackPsbd(in FeedbackOptions options, in Bundle bundle, long timestamp, in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 9; + oneway void requestChatSupport(in GoogleHelp googleHelp, String phoneNumber, String s2, IGoogleHelpCallbacks callbacks) = 10; + oneway void requestC2cSupport(in GoogleHelp googleHelp, String phoneNumber, String s2, IGoogleHelpCallbacks callbacks) = 11; + oneway void getSuggestions(in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 12; + oneway void getEscalationOptions(in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 13; + oneway void requestChatSupportWithSupportRequest(in SupportRequestHelp supportRequestHelp, IGoogleHelpCallbacks callbacks) = 14; + oneway void requestC2cSupportWithSupportRequest(in SupportRequestHelp supportRequestHelp, IGoogleHelpCallbacks callbacks) = 15; + void processInProductHelpAndPip(in InProductHelp inProductHelp, in Bitmap bitmap, IGoogleHelpCallbacks callbacks) = 16; + oneway void getRealtimeSupportStatus(in GoogleHelp googleHelp, IGoogleHelpCallbacks callbacks) = 17; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/http/IGoogleHttpService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/http/IGoogleHttpService.aidl new file mode 100644 index 0000000..58ea0ba --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/http/IGoogleHttpService.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.http; + +import android.os.Bundle; + +interface IGoogleHttpService { + Bundle checkUrl(String url); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/ClientLanguageSettings.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/ClientLanguageSettings.aidl new file mode 100644 index 0000000..9b451c3 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/ClientLanguageSettings.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.languageprofile; + +parcelable ClientLanguageSettings; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluency.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluency.aidl new file mode 100644 index 0000000..637d553 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluency.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.languageprofile; + +parcelable LanguageFluency; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluencyParams.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluencyParams.aidl new file mode 100644 index 0000000..f61b1fa --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguageFluencyParams.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.languageprofile; + +parcelable LanguageFluencyParams; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreference.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreference.aidl new file mode 100644 index 0000000..d326c85 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreference.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.languageprofile; + +parcelable LanguagePreference; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreferenceParams.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreferenceParams.aidl new file mode 100644 index 0000000..294f192 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/LanguagePreferenceParams.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.languageprofile; + +parcelable LanguagePreferenceParams; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileCallbacks.aidl new file mode 100644 index 0000000..c72b49d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileCallbacks.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.languageprofile.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.languageprofile.LanguageFluency; +import com.google.android.gms.languageprofile.LanguagePreference; + +interface ILanguageProfileCallbacks { + oneway void onString(in Status status, String s) = 0; + oneway void onLanguagePreferences(in Status status, in List preferences) = 1; + oneway void onLanguageFluencies(in Status status, in List fluencies) = 2; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileService.aidl new file mode 100644 index 0000000..6becf73 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/languageprofile/internal/ILanguageProfileService.aidl @@ -0,0 +1,16 @@ +package com.google.android.gms.languageprofile.internal; + +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.languageprofile.ClientLanguageSettings; +import com.google.android.gms.languageprofile.LanguageFluencyParams; +import com.google.android.gms.languageprofile.LanguagePreferenceParams; +import com.google.android.gms.languageprofile.internal.ILanguageProfileCallbacks; + +interface ILanguageProfileService { + String fun1(String accountName) = 0; + void fun2(String accountName, ILanguageProfileCallbacks callbacks) = 1; + void getLanguagePreferences(String accountName, in LanguagePreferenceParams params, ILanguageProfileCallbacks callbacks) = 2; + void getLanguageFluencies(String accountName, in LanguageFluencyParams params, ILanguageProfileCallbacks callbacks) = 3; + void getLanguageSettings(String accountName, in ClientLanguageSettings settings, IStatusCallback callback) = 4; + void removeLanguageSettings(String accountName, IStatusCallback callback) = 5; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/IneligibilityRationale.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/IneligibilityRationale.aidl new file mode 100644 index 0000000..cd644d9 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/IneligibilityRationale.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable IneligibilityRationale; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationReportingStatus.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationReportingStatus.aidl new file mode 100644 index 0000000..20018a5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationReportingStatus.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable LocationReportingStatus; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationShare.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationShare.aidl new file mode 100644 index 0000000..dc07a04 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationShare.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable LocationShare; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadRequest.aidl new file mode 100644 index 0000000..deca656 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable LocationUploadRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadResponse.aidl new file mode 100644 index 0000000..dbcb0f4 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/LocationUploadResponse.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable LocationUploadResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.aidl new file mode 100644 index 0000000..de90453 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable NoticeAckedUpdateRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.aidl new file mode 100644 index 0000000..3a91fcb --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable PeriodicLocationReportingIssues; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.aidl new file mode 100644 index 0000000..4689029 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable PeriodicLocationUploadRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.aidl new file mode 100644 index 0000000..034910b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable StartLocationReportingRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.aidl new file mode 100644 index 0000000..b00b992 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +parcelable StopLocationReportingRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingIssuesCallback.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingIssuesCallback.aidl new file mode 100644 index 0000000..58e934a --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingIssuesCallback.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter.internal; + +import com.google.android.gms.common.api.ApiMetadata; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.locationsharingreporter.PeriodicLocationReportingIssues; + +interface ILocationReportingIssuesCallback { + void onPeriodicLocationReportingIssues(in Status status, in PeriodicLocationReportingIssues periodicLocationReportingIssues, in ApiMetadata apiMetadata) = 0; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingStatusCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingStatusCallbacks.aidl new file mode 100644 index 0000000..ea04a6e --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationReportingStatusCallbacks.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter.internal; + +import com.google.android.gms.common.api.ApiMetadata; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.locationsharingreporter.LocationReportingStatus; + +interface ILocationReportingStatusCallbacks { + void onLocationReportingStatus(in Status status, in LocationReportingStatus locationReportingStatus, in ApiMetadata apiMetadata) = 0; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationSharingReporterService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationSharingReporterService.aidl new file mode 100644 index 0000000..5840185 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationSharingReporterService.aidl @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter.internal; + +import android.accounts.Account; +import com.google.android.gms.common.api.ApiMetadata; +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.locationsharingreporter.internal.ILocationReportingIssuesCallback; +import com.google.android.gms.locationsharingreporter.internal.ILocationReportingStatusCallbacks; +import com.google.android.gms.locationsharingreporter.internal.ILocationUploadCallbacks; +import com.google.android.gms.locationsharingreporter.LocationUploadRequest; +import com.google.android.gms.locationsharingreporter.PeriodicLocationUploadRequest; +import com.google.android.gms.locationsharingreporter.StartLocationReportingRequest; +import com.google.android.gms.locationsharingreporter.StopLocationReportingRequest; +import com.google.android.gms.locationsharingreporter.NoticeAckedUpdateRequest; + +interface ILocationSharingReporterService { + void uploadLocation(ILocationUploadCallbacks callback, in Account account, in LocationUploadRequest request, in ApiMetadata apiMetadata) = 0; + void getReportingStatus(ILocationReportingStatusCallbacks callback, in Account account, in ApiMetadata apiMetadata) = 1; + void syncReportingStatus(IStatusCallback callback, in Account account, in ApiMetadata apiMetadata) = 2; + void periodicLocationUpload(IStatusCallback callback, in Account account, in PeriodicLocationUploadRequest request, in ApiMetadata apiMetadata) = 3; + void startLocationReporting(IStatusCallback callback, in Account account, in StartLocationReportingRequest request, in ApiMetadata apiMetadata) = 4; + void stopLocationReporting(IStatusCallback callback, in Account account, in StopLocationReportingRequest request, in ApiMetadata apiMetadata) = 5; + void updateNoticeState(IStatusCallback callback, in Account account, in NoticeAckedUpdateRequest request, in ApiMetadata apiMetadata) = 6; + void getReportingIssues(ILocationReportingIssuesCallback callback, in Account account, in ApiMetadata apiMetadata) = 7; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationUploadCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationUploadCallbacks.aidl new file mode 100644 index 0000000..9bd0f8b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/locationsharingreporter/internal/ILocationUploadCallbacks.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter.internal; + +import com.google.android.gms.common.api.ApiMetadata; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.locationsharingreporter.LocationUploadResponse; + +interface ILocationUploadCallbacks { + void onLocationUploadResponse(in Status status, in LocationUploadResponse locationUploadResponse, in ApiMetadata apiMetadata) = 0; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/auth/IApiTokenService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/auth/IApiTokenService.aidl new file mode 100644 index 0000000..122395e --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/auth/IApiTokenService.aidl @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.maps.auth; + +import android.os.Bundle; + +interface IApiTokenService { + Bundle requestApiToken(in Bundle params); +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/AppMetadata.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/AppMetadata.aidl new file mode 100644 index 0000000..005edc3 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/AppMetadata.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.measurement.internal; + +parcelable AppMetadata; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.aidl new file mode 100644 index 0000000..de59ae5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.measurement.internal; + +parcelable ConditionalUserPropertyParcel; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/EventParcel.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/EventParcel.aidl new file mode 100644 index 0000000..372d66f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/EventParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.measurement.internal; + +parcelable EventParcel; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl new file mode 100644 index 0000000..380c045 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl @@ -0,0 +1,27 @@ +package com.google.android.gms.measurement.internal; + +import com.google.android.gms.measurement.internal.AppMetadata; +import com.google.android.gms.measurement.internal.ConditionalUserPropertyParcel; +import com.google.android.gms.measurement.internal.EventParcel; +import com.google.android.gms.measurement.internal.UserAttributeParcel; + +interface IMeasurementService { + void sendEvent(in EventParcel event, in AppMetadata app) = 0; + void sendUserProperty(in UserAttributeParcel attribute, in AppMetadata app) = 1; + void sendAppLaunch(in AppMetadata app) = 3; +// void f5(in EventParcel event, String p1, String p2) = 4; + void sendMeasurementEnabled(in AppMetadata p0) = 5; + List getAllUserProperties(in AppMetadata app, boolean includeInternal) = 6; +// byte[] f9(in EventParcel event, String p1) = 8; + void sendCurrentScreen(long id, String name, String referrer, String packageName) = 9; + String getAppInstanceId(in AppMetadata app) = 10; + void sendConditionalUserProperty(in ConditionalUserPropertyParcel property, in AppMetadata app) = 11; +// void f13(ConditionalUserPropertyParcel p0) = 12; + List getUserProperties(String origin, String propertyNamePrefix, boolean includeInternal, in AppMetadata app) = 13; + List getUserPropertiesAs(String packageName, String origin, String propertyNamePrefix, boolean includeInternal) = 14; + List getConditionalUserProperties(String origin, String propertyNamePrefix, in AppMetadata app) = 15; + List getConditionalUserPropertiesAs(String packageName, String origin, String propertyNamePrefix) = 16; + void reset(in AppMetadata app) = 17; + void sendDefaultEventParameters(in Bundle params, in AppMetadata app) = 18; + void sendConsentSettings(in AppMetadata app) = 19; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/UserAttributeParcel.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/UserAttributeParcel.aidl new file mode 100644 index 0000000..efb3b72 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/UserAttributeParcel.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.measurement.internal; + +parcelable UserAttributeParcel; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleCallbacks.aidl new file mode 100644 index 0000000..75db9fa --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleCallbacks.aidl @@ -0,0 +1,12 @@ +package com.google.android.gms.people.internal; + +import android.os.Bundle; +import android.os.ParcelFileDescriptor; + +import com.google.android.gms.common.data.DataHolder; + +interface IPeopleCallbacks { + void onDataHolder(int code, in Bundle resolution, in DataHolder holder) = 1; + void onDataHolders(int code, in Bundle resolution, in DataHolder[] holders) = 3; + void onParcelFileDescriptor(int code, in Bundle resolution, in ParcelFileDescriptor fileDescriptor, in Bundle extras) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleService.aidl new file mode 100644 index 0000000..62ae147 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/people/internal/IPeopleService.aidl @@ -0,0 +1,44 @@ +package com.google.android.gms.people.internal; + +import android.os.Bundle; + +import com.google.android.gms.people.internal.IPeopleCallbacks; +import com.google.android.gms.common.server.FavaDiagnosticsEntity; +import com.google.android.gms.common.internal.ICancelToken; + +interface IPeopleService { + // void loadOwners1(IPeopleCallbacks var1, boolean var2, boolean var3, String var4, String var5); + // void loadCirclesOld(IPeopleCallbacks var1, String var2, String var3, String var4, int var5, String var6); + // void loadPeopleOld(IPeopleCallbacks var1, String var2, String var3, String var4, in List var5, int var6, boolean var7, long var8); + // void loadAvatarLegacy(IPeopleCallbacks var1, String var2, int var3, int var4); + // void loadContactImageLegacy(IPeopleCallbacks var1, long var2, boolean var4); + // void blockPerson(IPeopleCallbacks var1, String var2, String var3, String var4, boolean var5); + // Bundle syncRawContact(in Uri var1); + // void loadPeopleForAggregation8(IPeopleCallbacks var1, String var2, String var3, String var4, boolean var5, int var6); + // void setSyncToContactsSettings(IPeopleCallbacks var1, String var2, boolean var3, in String[] var4); + + // Bundle startSync(String var1, String var2); + // void requestSync(IPeopleCallbacks var1, String var2, String var3, in Uri var4); + // void updatePersonCirclesOld(IPeopleCallbacks var1, String var2, String var3, String var4, in List var5, in List var6); + // boolean isSyncToContactsEnabled(); + // Bundle requestSyncOld(String var1, String var2); + // void setAvatar(IPeopleCallbacks var1, String var2, String var3, in Uri var4, boolean var5); + // void loadCircles(IPeopleCallbacks var1, String var2, String var3, String var4, int var5, String var6, boolean var7); + // Bundle requestSyncOld19(String var1, String var2, long var3); + // void loadPeople20(IPeopleCallbacks var1, String var2, String var3, String var4, in List var5, int var6, boolean var7, long var8, String var10, int var11); + // void loadPeopleLive(IPeopleCallbacks var1, String var2, String var3, String var4, int var5, String var6); + // void updatePersonCircles(IPeopleCallbacks var1, String var2, String var3, String var4, in List var5, in List var6, in FavaDiagnosticsEntity var7); + // void loadRemoteImageLegacy(IPeopleCallbacks var1, String var2); + // void loadContactsGaiaIds24(IPeopleCallbacks var1, String var2, String var3); + // Bundle requestSyncOld25(String var1, String var2, long var3, boolean var5); + // void addCircle(IPeopleCallbacks var1, String var2, String var3, String var4, String var5); + // void addPeopleToCircle(IPeopleCallbacks var1, String var2, String var3, String var4, in List var5); + + Bundle registerDataChangedListener(IPeopleCallbacks callbacks, boolean register, String var3, String var4, int scopes) = 10; + void loadCircles(IPeopleCallbacks callbacks, String account, String pageGaiaId, String circleId, int type, String var6, boolean var7) = 18; + Bundle requestSync(String account, String var2, long var3, boolean var5, boolean var6) = 204; + void loadOwners(IPeopleCallbacks callbacks, boolean var2, boolean var3, String account, String var5, int sortOrder) = 304; + void loadPeopleForAggregation(IPeopleCallbacks callbacks, String account, String var3, String filter, int var5, boolean var6, int var7, int var8, String var9, boolean var10, int var11, int var12) = 401; + ICancelToken loadOwnerAvatar(IPeopleCallbacks callbacks, String account, String pageId, int size, int flags) = 504; + ICancelToken loadAutocompleteList(IPeopleCallbacks callbacks, String account, String pageId, boolean directorySearch, String var5, String query, int autocompleteType, int var8, int numberOfResults, boolean var10) = 506; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/Configurations.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/Configurations.aidl new file mode 100644 index 0000000..33ccf3d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/Configurations.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.phenotype; + +parcelable Configurations; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/DogfoodsToken.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/DogfoodsToken.aidl new file mode 100644 index 0000000..991fca0 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/DogfoodsToken.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.phenotype; + +parcelable DogfoodsToken; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/ExperimentTokens.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/ExperimentTokens.aidl new file mode 100644 index 0000000..4b6ba4f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/ExperimentTokens.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.phenotype; + +parcelable ExperimentTokens; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/Flag.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/Flag.aidl new file mode 100644 index 0000000..f91175f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/Flag.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.phenotype; + +parcelable Flag; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/FlagOverrides.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/FlagOverrides.aidl new file mode 100644 index 0000000..bdf15a6 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/FlagOverrides.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.phenotype; + +parcelable FlagOverrides; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/RegistrationInfo.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/RegistrationInfo.aidl new file mode 100644 index 0000000..644ba2d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/RegistrationInfo.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.phenotype; + +parcelable RegistrationInfo; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl new file mode 100644 index 0000000..3c29b8b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl @@ -0,0 +1,27 @@ +package com.google.android.gms.phenotype.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.phenotype.Configurations; +import com.google.android.gms.phenotype.DogfoodsToken; +import com.google.android.gms.phenotype.ExperimentTokens; +import com.google.android.gms.phenotype.Flag; +import com.google.android.gms.phenotype.FlagOverrides; + +interface IPhenotypeCallbacks { + oneway void onRegistered(in Status status) = 0; + oneway void onWeakRegistered(in Status status) = 1; + oneway void onUnregistered(in Status status) = 2; + oneway void onConfiguration(in Status status, in Configurations configurations) = 3; + oneway void onCommitedToConfiguration(in Status status) = 4; + oneway void onExperimentTokens(in Status status, in ExperimentTokens experimentTokens) = 5; + oneway void onDogfoodsToken(in Status status, in DogfoodsToken dogfoodsToken) = 6; + oneway void onDogfoodsTokenSet(in Status status) = 7; + oneway void onFlag(in Status status, in Flag flag) = 8; + oneway void onCommittedConfiguration(in Status status, in Configurations configuration) = 9; + oneway void onSyncFinished(in Status status, long p1) = 10; + oneway void onFlagOverridesSet(in Status status) = 11; + oneway void onFlagOverrides(in Status status, in FlagOverrides overrides) = 12; + oneway void onAppSpecificPropertiesSet(in Status status) = 13; + + oneway void onServingVersion(in Status status, long version) = 15; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeService.aidl new file mode 100644 index 0000000..eb6113d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeService.aidl @@ -0,0 +1,35 @@ +package com.google.android.gms.phenotype.internal; + +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.phenotype.internal.IPhenotypeCallbacks; +import com.google.android.gms.phenotype.Flag; +import com.google.android.gms.phenotype.RegistrationInfo; + +interface IPhenotypeService { + oneway void register(IPhenotypeCallbacks callbacks, String packageName, int version, in String[] p3, in byte[] p4) = 0; // returns via callbacks.onRegistered() + oneway void weakRegister(IPhenotypeCallbacks callbacks, String packageName, int version, in String[] p3, in int[] p4, in byte[] p5) = 1; // returns via callbacks.onWeakRegistered() + oneway void unregister(IPhenotypeCallbacks callbacks, String packageName) = 2; // returns via callbacks.onUnregistered() + oneway void getConfigurationSnapshot(IPhenotypeCallbacks callbacks, String packageName, String user) = 3; // returns via callbacks.onConfiguration() + oneway void commitToConfiguration(IPhenotypeCallbacks callbacks, String snapshotToken) = 4; // returns via callbacks.onCommitedToConfiguration() + oneway void getExperimentTokens(IPhenotypeCallbacks callbacks, String packageName, String logSourceName) = 5; // returns via callbacks.onExperimentTokens() + oneway void getDogfoodsToken(IPhenotypeCallbacks callbacks) = 6; // returns via callbacks.onDogfoodsToken() + oneway void setDogfoodsToken(IPhenotypeCallbacks callbacks, in byte[] p1) = 7; // returns via callbacks.onDogfoodsTokenSet() + oneway void getFlag(IPhenotypeCallbacks callbacks, String packageName, String name, int type) = 8; // returns via callbacks.onFlag() + oneway void getCommitedConfiguration(IPhenotypeCallbacks callbacks, String packageName) = 9; // returns via callbacks.onCommittedConfiguration() + oneway void getConfigurationSnapshotWithToken(IPhenotypeCallbacks callbacks, String packageName, String user, String token) = 10; // returns via callbacks.onConfiguration() + oneway void syncAfterOperation(IPhenotypeCallbacks callbacks, String packageName, long version) = 11; // returns via callbacks.onSyncFinished() + oneway void registerSync(IPhenotypeCallbacks callbacks, String packageName, int version, in String[] p3, in byte[] p4, String p5, String p6) = 12; // returns via callbacks.onConfiguration() + oneway void setFlagOverrides(IPhenotypeCallbacks callbacks, String packageName, String user, String flagName, int flagType, int flagDataType, String flagValue) = 13; // returns via callbacks.onFlagOverridesSet() + oneway void deleteFlagOverrides(IPhenotypeCallbacks callbacks, String packageName, String user, String flagName) = 14; // returns via callbacks.onFlagOverrides() + oneway void listFlagOverrides(IPhenotypeCallbacks callbacks, String packageName, String user, String flagName) = 15; // returns via callbacks.onFlagOverrides() + + oneway void clearFlagOverrides(IPhenotypeCallbacks callbacks, String packageName, String user) = 17; // returns via callbacks.onFlagOverridesSet() + oneway void bulkRegister(IPhenotypeCallbacks callbacks, in RegistrationInfo[] infos) = 18; // returns via callbacks.onRegister() + oneway void setAppSpecificProperties(IPhenotypeCallbacks callbacks, String packageName, in byte[] p2) = 19; // returns via callbacks.onAppSpecificPropertiesSet() + + oneway void getServingVersion(IPhenotypeCallbacks callbacks) = 21; // returns via callbacks.onServingVersion() + oneway void getExperimentTokensForLogging(IPhenotypeCallbacks callbacks, String packageName, String logSourceName, String p3, String clientPackageName) = 22; // returns via callbacks.onExperimentTokens() + oneway void syncAllAfterOperation(IPhenotypeCallbacks callbacks, long p1) = 23; // returns via callbacks.onSyncFinished() + oneway void setRuntimeProperties(IStatusCallback callbacks, String p1, in byte[] p2) = 24; +// oneway void setExternalExperiments(IStatusCallback callbacks, String p1, in List p2) = 25; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/plus/internal/IPlusOneButtonCreator.aidl b/play-services-api/src/main/aidl/com/google/android/gms/plus/internal/IPlusOneButtonCreator.aidl new file mode 100644 index 0000000..7e2121d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/plus/internal/IPlusOneButtonCreator.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.plus.internal; + +import com.google.android.gms.dynamic.IObjectWrapper; + +interface IPlusOneButtonCreator { + IObjectWrapper create(IObjectWrapper context, int size, int annotation, String url, int activityRequestCode); + IObjectWrapper createForAccount(IObjectWrapper context, int size, int annotation, String url, String account); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/potokens/PoToken.aidl b/play-services-api/src/main/aidl/com/google/android/gms/potokens/PoToken.aidl new file mode 100644 index 0000000..8cf0bb7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/potokens/PoToken.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.potokens; + +parcelable PoToken; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/IPoTokensService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/IPoTokensService.aidl new file mode 100644 index 0000000..938c848 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/IPoTokensService.aidl @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.potokens.internal; + +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.potokens.internal.ITokenCallbacks; + +interface IPoTokensService { + void responseStatus(IStatusCallback call, int code) = 1; + void responseStatusToken(ITokenCallbacks call, int i, in byte[] bArr) = 2; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/ITokenCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/ITokenCallbacks.aidl new file mode 100644 index 0000000..55c71df --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/potokens/internal/ITokenCallbacks.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.potokens.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.potokens.PoToken; + +interface ITokenCallbacks { + void responseToken(in Status status, in PoToken token) = 1; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/PseudonymousIdToken.aidl b/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/PseudonymousIdToken.aidl new file mode 100644 index 0000000..b8d88c1 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/PseudonymousIdToken.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.pseudonymous; + +parcelable PseudonymousIdToken; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdCallbacks.aidl new file mode 100644 index 0000000..f6a47de --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdCallbacks.aidl @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.pseudonymous.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.pseudonymous.PseudonymousIdToken; + +interface IPseudonymousIdCallbacks { + void onGetTokenResponse(in Status status, in PseudonymousIdToken token) = 0; + void onSetTokenResponse(in Status status) = 1; + void onGetLastResetWallTimeMsResponse(in Status status, long time) = 2; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdService.aidl new file mode 100644 index 0000000..e99f7df --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/pseudonymous/internal/IPseudonymousIdService.aidl @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.pseudonymous.internal; + +import com.google.android.gms.pseudonymous.internal.IPseudonymousIdCallbacks; +import com.google.android.gms.pseudonymous.PseudonymousIdToken; + +interface IPseudonymousIdService { + void getToken(IPseudonymousIdCallbacks call) = 0; + void setToken(IPseudonymousIdCallbacks call, in PseudonymousIdToken token) = 1; + void getLastResetWallTimeMs(IPseudonymousIdCallbacks callbacks) = 2; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/AccountState.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/AccountState.aidl new file mode 100644 index 0000000..24ae0ff --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/AccountState.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders; + +parcelable AccountState; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/CreateReminderOptionsInternal.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/CreateReminderOptionsInternal.aidl new file mode 100644 index 0000000..142dded --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/CreateReminderOptionsInternal.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders; + +parcelable CreateReminderOptionsInternal; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/LoadRemindersOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/LoadRemindersOptions.aidl new file mode 100644 index 0000000..ff41844 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/LoadRemindersOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders; + +parcelable LoadRemindersOptions; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/ReindexDueDatesOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/ReindexDueDatesOptions.aidl new file mode 100644 index 0000000..55ac1be --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/ReindexDueDatesOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders; + +parcelable ReindexDueDatesOptions; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/UpdateRecurrenceOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/UpdateRecurrenceOptions.aidl new file mode 100644 index 0000000..79f91de --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/UpdateRecurrenceOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders; + +parcelable UpdateRecurrenceOptions; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersCallbacks.aidl new file mode 100644 index 0000000..5e5506e --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersCallbacks.aidl @@ -0,0 +1,17 @@ +package com.google.android.gms.reminders.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.common.data.DataHolder; + +import com.google.android.gms.reminders.AccountState; + +interface IRemindersCallbacks { + void onDataHolder(in DataHolder data, in Status status) = 0; + void onStatus(in Status status) = 1; + void onNoStatus() = 2; + void onDataHolderNoStatus(in DataHolder data, in Status status) = 3; + void onBool(boolean b, in Status status) = 4; + void onString(in String s, in Status status) = 5; + void onAccountState(in AccountState accountState, in Status status) = 6; + void onAsyncDataHolder(in DataHolder data) = 7; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersListener.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersListener.aidl new file mode 100644 index 0000000..2added9 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersListener.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.reminders.internal; + +interface IRemindersListener { + +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersService.aidl new file mode 100644 index 0000000..f998648 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/internal/IRemindersService.aidl @@ -0,0 +1,37 @@ +package com.google.android.gms.reminders.internal; + +import com.google.android.gms.reminders.internal.IRemindersCallbacks; + +import com.google.android.gms.reminders.AccountState; +import com.google.android.gms.reminders.CreateReminderOptionsInternal; +import com.google.android.gms.reminders.LoadRemindersOptions; +import com.google.android.gms.reminders.ReindexDueDatesOptions; +import com.google.android.gms.reminders.UpdateRecurrenceOptions; +import com.google.android.gms.reminders.model.CustomizedSnoozePresetEntity; +import com.google.android.gms.reminders.model.TaskEntity; +import com.google.android.gms.reminders.model.TaskIdEntity; + +interface IRemindersService { + void loadReminders(IRemindersCallbacks callbacks, in LoadRemindersOptions options) = 0; + void addListener(IRemindersCallbacks callbacks) = 1; + void createReminder(IRemindersCallbacks callbacks, in TaskEntity task) = 2; + void updateReminder(IRemindersCallbacks callbacks, in TaskEntity task) = 3; + void deleteReminder(IRemindersCallbacks callbacks, in TaskIdEntity taskId) = 4; + void bumpReminder(IRemindersCallbacks callbacks, in TaskIdEntity taskId) = 5; + void hasUpcomingReminders(IRemindersCallbacks callbacks) = 6; + void createRecurrence(IRemindersCallbacks callbacks, in TaskEntity task) = 7; + void updateRecurrence(IRemindersCallbacks callbacks, String s1, in TaskEntity task, in UpdateRecurrenceOptions options) = 8; + void deleteRecurrence(IRemindersCallbacks callbacks, String s1, in UpdateRecurrenceOptions options) = 9; + void changeRecurrence(IRemindersCallbacks callbacks, String s1, in TaskEntity task, in UpdateRecurrenceOptions options) = 10; + void makeTaskRecurring(IRemindersCallbacks callbacks, in TaskEntity task) = 11; + void makeRecurrenceSingleInstance(IRemindersCallbacks callbacks, String s1, in TaskEntity task, in UpdateRecurrenceOptions options) = 12; + void clearListeners() = 13; + void batchUpdateReminders(IRemindersCallbacks callbacks, in List tasks) = 14; + void createReminderWithOptions(IRemindersCallbacks callbacks, in TaskEntity task, in CreateReminderOptionsInternal options) = 15; + void getCustomizedSnoozePreset(IRemindersCallbacks callbacks) = 16; + void setCustomizedSnoozePreset(IRemindersCallbacks callbacks, in CustomizedSnoozePresetEntity preset) = 17; + void setAccountState(IRemindersCallbacks callbacks, in AccountState accountState) = 18; + void getAccountState(IRemindersCallbacks callbacks) = 19; + void checkReindexDueDatesNeeded(IRemindersCallbacks callbacks, in ReindexDueDatesOptions options) = 20; + void reindexDueDates(IRemindersCallbacks callbacks, in ReindexDueDatesOptions options) = 21; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.aidl new file mode 100644 index 0000000..bbb9083 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders.model; + +parcelable CustomizedSnoozePresetEntity; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskEntity.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskEntity.aidl new file mode 100644 index 0000000..9a3883c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskEntity.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders.model; + +parcelable TaskEntity; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskIdEntity.aidl b/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskIdEntity.aidl new file mode 100644 index 0000000..a4c4148 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/reminders/model/TaskIdEntity.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.reminders.model; + +parcelable TaskIdEntity; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/administration/internal/ISearchAdministrationService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/administration/internal/ISearchAdministrationService.aidl new file mode 100644 index 0000000..404544c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/administration/internal/ISearchAdministrationService.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.search.administration.internal; + +interface ISearchAdministrationService { + +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/ClearCorpusRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/ClearCorpusRequest.aidl new file mode 100644 index 0000000..9f71893 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/ClearCorpusRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.corpora; + +parcelable ClearCorpusRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusInfoRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusInfoRequest.aidl new file mode 100644 index 0000000..11b0a4d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusInfoRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.corpora; + +parcelable GetCorpusInfoRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusRequest.aidl new file mode 100644 index 0000000..b2e549d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.corpora; + +parcelable GetCorpusStatusRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusResponse.aidl new file mode 100644 index 0000000..a837a7d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/GetCorpusStatusResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.corpora; + +parcelable GetCorpusStatusResponse; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingRequest.aidl new file mode 100644 index 0000000..ad68ef3 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.corpora; + +parcelable RequestIndexingRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingResponse.aidl new file mode 100644 index 0000000..7aaa548 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/RequestIndexingResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.corpora; + +parcelable RequestIndexingResponse; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaCallbacks.aidl new file mode 100644 index 0000000..863b016 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaCallbacks.aidl @@ -0,0 +1,9 @@ +package com.google.android.gms.search.corpora.internal; + +import com.google.android.gms.search.corpora.RequestIndexingResponse; +import com.google.android.gms.search.corpora.GetCorpusStatusResponse; + +interface ISearchCorporaCallbacks { + void onRequestIndexing(in RequestIndexingResponse response) = 1; + void onGetCorpusStatus(in GetCorpusStatusResponse response) = 3; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaService.aidl new file mode 100644 index 0000000..fe2073c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/corpora/internal/ISearchCorporaService.aidl @@ -0,0 +1,14 @@ +package com.google.android.gms.search.corpora.internal; + +import com.google.android.gms.search.corpora.ClearCorpusRequest; +import com.google.android.gms.search.corpora.GetCorpusStatusRequest; +import com.google.android.gms.search.corpora.GetCorpusInfoRequest; +import com.google.android.gms.search.corpora.RequestIndexingRequest; +import com.google.android.gms.search.corpora.internal.ISearchCorporaCallbacks; + +interface ISearchCorporaService { + void requestIndexing(in RequestIndexingRequest request, ISearchCorporaCallbacks callbacks) = 1; + void clearCorpus(in ClearCorpusRequest request, ISearchCorporaCallbacks callbacks) = 2; + void getCorpusStatus(in GetCorpusStatusRequest request, ISearchCorporaCallbacks callbacks) = 3; + void getCorpusInfo(in GetCorpusInfoRequest request, ISearchCorporaCallbacks callbacks) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.aidl new file mode 100644 index 0000000..426cbe4 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable GetCurrentExperimentIdsRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.aidl new file mode 100644 index 0000000..8fdb456 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable GetCurrentExperimentIdsResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.aidl new file mode 100644 index 0000000..986ab4d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable GetGlobalSearchSourcesRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.aidl new file mode 100644 index 0000000..86d52a1 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable GetGlobalSearchSourcesResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.aidl new file mode 100644 index 0000000..8d7382e --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable GetPendingExperimentIdsRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.aidl new file mode 100644 index 0000000..ca99ad5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable GetPendingExperimentIdsResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsRequest.aidl new file mode 100644 index 0000000..2bd4d8b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable SetExperimentIdsRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsResponse.aidl new file mode 100644 index 0000000..ff55276 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetExperimentIdsResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable SetExperimentIdsResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.aidl new file mode 100644 index 0000000..79cbb17 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable SetIncludeInGlobalSearchRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.aidl new file mode 100644 index 0000000..a5f2d6d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.global; + +parcelable SetIncludeInGlobalSearchResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminCallbacks.aidl new file mode 100644 index 0000000..b08d953 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminCallbacks.aidl @@ -0,0 +1,16 @@ +package com.google.android.gms.search.global.internal; + +import com.google.android.gms.search.global.GetCurrentExperimentIdsResponse; +import com.google.android.gms.search.global.GetGlobalSearchSourcesResponse; +import com.google.android.gms.search.global.GetPendingExperimentIdsResponse; +import com.google.android.gms.search.global.SetExperimentIdsResponse; +import com.google.android.gms.search.global.SetIncludeInGlobalSearchResponse; + +interface IGlobalSearchAdminCallbacks { + void onGetGlobalSearchSourcesResponse(in GetGlobalSearchSourcesResponse request) = 1; + void onSetExperimentIdsResponse(in SetExperimentIdsResponse response) = 2; + void onGetCurrentExperimentIdsResponse(in GetCurrentExperimentIdsResponse response) = 3; + void onGetPendingExperimentIdsResponse(in GetPendingExperimentIdsResponse response) = 4; + + void onSetIncludeInGlobalSearchResponse(in SetIncludeInGlobalSearchResponse response) = 7; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminService.aidl new file mode 100644 index 0000000..95bc32a --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/global/internal/IGlobalSearchAdminService.aidl @@ -0,0 +1,17 @@ +package com.google.android.gms.search.global.internal; + +import com.google.android.gms.search.global.GetCurrentExperimentIdsRequest; +import com.google.android.gms.search.global.GetGlobalSearchSourcesRequest; +import com.google.android.gms.search.global.GetPendingExperimentIdsRequest; +import com.google.android.gms.search.global.SetExperimentIdsRequest; +import com.google.android.gms.search.global.SetIncludeInGlobalSearchRequest; +import com.google.android.gms.search.global.internal.IGlobalSearchAdminCallbacks; + +interface IGlobalSearchAdminService { + void getGlobalSearchSources(in GetGlobalSearchSourcesRequest request, IGlobalSearchAdminCallbacks callbacks) = 1; + void setExperimentIds(in SetExperimentIdsRequest request, IGlobalSearchAdminCallbacks callbacks) = 2; + void getCurrentExperimentIds(in GetCurrentExperimentIdsRequest request, IGlobalSearchAdminCallbacks callbacks) = 3; + void getPendingExperimentIds(in GetPendingExperimentIdsRequest request, IGlobalSearchAdminCallbacks callbacks) = 4; + + void setIncludeInGlobalSearch(in SetIncludeInGlobalSearchRequest request, IGlobalSearchAdminCallbacks callbacks) = 7; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryRequest.aidl new file mode 100644 index 0000000..1986e95 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.queries; + +parcelable QueryRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryResponse.aidl new file mode 100644 index 0000000..9704725 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/QueryResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.search.queries; + +parcelable QueryResponse; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesCallbacks.aidl new file mode 100644 index 0000000..8bcb891 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesCallbacks.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.search.queries.internal; + +import com.google.android.gms.search.queries.QueryResponse; + +interface ISearchQueriesCallbacks { + void onQuery(in QueryResponse response) = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesService.aidl new file mode 100644 index 0000000..091cdae --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/search/queries/internal/ISearchQueriesService.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.search.queries.internal; + +import com.google.android.gms.search.queries.QueryRequest; +import com.google.android.gms.search.queries.internal.ISearchQueriesCallbacks; + +interface ISearchQueriesService { + void query(in QueryRequest request, ISearchQueriesCallbacks callbacks) = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/PlaceCandidate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/PlaceCandidate.aidl new file mode 100644 index 0000000..9b89b5c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/PlaceCandidate.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocation; + +parcelable PlaceCandidate; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.aidl new file mode 100644 index 0000000..715a75c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocation; + +parcelable SemanticLocationEventRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl new file mode 100644 index 0000000..de75def --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocation.internal; + +import android.app.PendingIntent; +import android.os.IInterface; +import com.google.android.gms.semanticlocation.SemanticLocationEventRequest; +import com.google.android.gms.semanticlocation.internal.SemanticLocationParameters; +import com.google.android.gms.common.api.internal.IStatusCallback; + +interface ISemanticLocationService { + void registerSemanticLocationEvents(in SemanticLocationParameters params, IStatusCallback callback, in SemanticLocationEventRequest request, in PendingIntent pendingIntent) = 0; + void unregisterSemanticLocationEvents(in SemanticLocationParameters params, IStatusCallback callback, in PendingIntent pendingIntent) = 1; + + void setIncognitoMode(in SemanticLocationParameters params, IStatusCallback callback, boolean mode) = 4; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.aidl new file mode 100644 index 0000000..1ac959e --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocation.internal; + +parcelable SemanticLocationParameters; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FieldMask.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FieldMask.aidl new file mode 100644 index 0000000..9708311 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FieldMask.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable FieldMask; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentPlace.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentPlace.aidl new file mode 100644 index 0000000..07dcd9a --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentPlace.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable FrequentPlace; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentTrip.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentTrip.aidl new file mode 100644 index 0000000..4679af7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/FrequentTrip.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable FrequentTrip; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/InferredPlace.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/InferredPlace.aidl new file mode 100644 index 0000000..4341be9 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/InferredPlace.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable InferredPlace; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.aidl new file mode 100644 index 0000000..35737b8 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable LocationHistorySegment; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.aidl new file mode 100644 index 0000000..ef058fa --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable LocationHistorySegmentRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LookupParameters.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LookupParameters.aidl new file mode 100644 index 0000000..f0a7be5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/LookupParameters.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable LookupParameters; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/Persona.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/Persona.aidl new file mode 100644 index 0000000..181a806 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/Persona.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable Persona; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/RequestCredentials.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/RequestCredentials.aidl new file mode 100644 index 0000000..2f1ccb7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/RequestCredentials.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable RequestCredentials; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.aidl new file mode 100644 index 0000000..316a525 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable TimeRangeFilter; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/UserLocationProfile.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/UserLocationProfile.aidl new file mode 100644 index 0000000..7630d5d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/UserLocationProfile.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocationhistory; + +parcelable UserLocationProfile; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryCallbacks.aidl new file mode 100644 index 0000000..18784fe --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryCallbacks.aidl @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.common.data.DataHolder; +import com.google.android.gms.semanticlocationhistory.InferredPlace; +import com.google.android.gms.semanticlocationhistory.UserLocationProfile; + +interface ISemanticLocationHistoryCallbacks { + void onSegmentsReturn(in DataHolder dataHolder) = 4; + void onDeleteHistoryReturn(in Status status) = 5; + void onEditSegmentsReturn(in Status status) = 3; + void onGetBackupSummaryReturn(in Status status, in List list) = 7; + void onGetInferredHomeReturn(in Status status, in InferredPlace inferredPlace) = 1; + void onGetInferredWorkReturn(in Status status, in InferredPlace inferredPlace) = 2; + void onGetUserLocationProfileReturn(in Status status, in UserLocationProfile userLocationProfile) = 6; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryService.aidl new file mode 100644 index 0000000..8377cc1 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocationhistory/internal/ISemanticLocationHistoryService.aidl @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory.internal; + +import com.google.android.gms.semanticlocationhistory.internal.ISemanticLocationHistoryCallbacks; +import com.google.android.gms.common.api.ApiMetadata; +import com.google.android.gms.semanticlocationhistory.RequestCredentials; +import com.google.android.gms.semanticlocationhistory.LocationHistorySegmentRequest; +import com.google.android.gms.common.api.internal.IStatusCallback; + +interface ISemanticLocationHistoryService { + void getSegments(in ISemanticLocationHistoryCallbacks callback, in ApiMetadata apiMetadata, in RequestCredentials requestCredentials, in LocationHistorySegmentRequest request) = 0; + void onDemandBackupRestore(in IStatusCallback callback, in ApiMetadata apiMetadata, in RequestCredentials requestCredentials) = 1; + void onDemandBackupRestoreV2(in IStatusCallback callback, in RequestCredentials requestCredentials, in List list, in ApiMetadata apiMetadata) = 2; + void getInferredHome(in ISemanticLocationHistoryCallbacks callback, in RequestCredentials requestCredentials, in ApiMetadata apiMetadata) = 3; + void getInferredWork(in ISemanticLocationHistoryCallbacks callback, in RequestCredentials requestCredentials, in ApiMetadata apiMetadata) = 4; + void editSegments(in ISemanticLocationHistoryCallbacks callback, in List list, in ApiMetadata apiMetadata, in RequestCredentials requestCredentials) = 5; + void deleteHistory(in ISemanticLocationHistoryCallbacks callback, in RequestCredentials requestCredentials, long startTime, long endTime, in ApiMetadata apiMetadata) = 6; + void getUserLocationProfile(in IStatusCallback callback, in ApiMetadata apiMetadata, in RequestCredentials requestCredentials) = 7; + void getBackupSummary(in IStatusCallback callback, in ApiMetadata apiMetadata, in RequestCredentials requestCredentials) = 8; + void deleteBackups(in IStatusCallback callback, in RequestCredentials requestCredentials, in List list, in ApiMetadata apiMetadata) = 9; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl new file mode 100644 index 0000000..a88060f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.usagereporting; + +parcelable UsageReportingOptInOptions; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl new file mode 100644 index 0000000..3e877c2 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.usagereporting.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.usagereporting.UsageReportingOptInOptions; + +interface IUsageReportingCallbacks { + oneway void onOptInOptions(in Status status, in UsageReportingOptInOptions options) = 1; + oneway void onOptInOptionsSet(in Status status) = 2; + oneway void onOptInOptionsChangedListenerAdded(in Status status) = 3; + oneway void onOptInOptionsChangedListenerRemoved(in Status status) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl new file mode 100644 index 0000000..8e9c287 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.usagereporting.internal; + +interface IUsageReportingOptInOptionsChangedListener { + oneway void onOptionsChanged() = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl new file mode 100644 index 0000000..46d6265 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl @@ -0,0 +1,12 @@ +package com.google.android.gms.usagereporting.internal; + +import com.google.android.gms.usagereporting.internal.IUsageReportingCallbacks; +import com.google.android.gms.usagereporting.internal.IUsageReportingOptInOptionsChangedListener; +import com.google.android.gms.usagereporting.UsageReportingOptInOptions; + +interface IUsageReportingService { + oneway void getOptInOptions(IUsageReportingCallbacks callbacks) = 1; + oneway void setOptInOptions(in UsageReportingOptInOptions options, IUsageReportingCallbacks callbacks) = 2; + oneway void addOptInOptionsChangedListener(IUsageReportingOptInOptionsChangedListener listener, IUsageReportingCallbacks callbacks) = 3; + oneway void removeOptInOptionsChangedListener(IUsageReportingOptInOptionsChangedListener listener, IUsageReportingCallbacks callbacks) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenRequest.aidl new file mode 100644 index 0000000..ad52402 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenRequest.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.wallet; + +parcelable GetClientTokenRequest; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenResponse.aidl new file mode 100644 index 0000000..e2b7c30 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/wallet/GetClientTokenResponse.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.wallet; + +parcelable GetClientTokenResponse; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/android/gms/wallet/IsReadyToPayRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/wallet/IsReadyToPayRequest.aidl new file mode 100644 index 0000000..da1b034 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/wallet/IsReadyToPayRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.wallet; + +parcelable IsReadyToPayRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IOwService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IOwService.aidl new file mode 100644 index 0000000..4b5ac36 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IOwService.aidl @@ -0,0 +1,10 @@ +package com.google.android.gms.wallet.internal; + +import com.google.android.gms.wallet.internal.IWalletServiceCallbacks; +import com.google.android.gms.wallet.IsReadyToPayRequest; +import com.google.android.gms.wallet.GetClientTokenRequest; + +interface IOwService { + void isReadyToPay(in IsReadyToPayRequest request, in Bundle args, IWalletServiceCallbacks callbacks) = 13; + void getClientToken(in GetClientTokenRequest getClientTokenRequest, in Bundle options, IWalletServiceCallbacks callbacks) = 14; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IWalletServiceCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IWalletServiceCallbacks.aidl new file mode 100644 index 0000000..a7bd289 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/wallet/internal/IWalletServiceCallbacks.aidl @@ -0,0 +1,9 @@ +package com.google.android.gms.wallet.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.wallet.GetClientTokenResponse; + +interface IWalletServiceCallbacks { + void onIsReadyToPayResponse(in Status status, boolean result, in Bundle args) = 8; + void onClientTokenReceived(in Status status, in GetClientTokenResponse response, in Bundle extras) = 9; +} diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/CompoundHashParcelable.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/CompoundHashParcelable.aidl new file mode 100644 index 0000000..689e591 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/CompoundHashParcelable.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.database.connection.idl; + +parcelable CompoundHashParcelable; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/ConnectionConfig.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/ConnectionConfig.aidl new file mode 100644 index 0000000..d6c1fc3 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/ConnectionConfig.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.database.connection.idl; + +parcelable ConnectionConfig; \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IConnectionAuthTokenProvider.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IConnectionAuthTokenProvider.aidl new file mode 100644 index 0000000..447f9f4 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IConnectionAuthTokenProvider.aidl @@ -0,0 +1,7 @@ +package com.google.firebase.database.connection.idl; + +import com.google.firebase.database.connection.idl.IGetTokenCallback; + +interface IConnectionAuthTokenProvider { + void zero(boolean var1, IGetTokenCallback var2) = 0; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IGetTokenCallback.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IGetTokenCallback.aidl new file mode 100644 index 0000000..c4d45cd --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IGetTokenCallback.aidl @@ -0,0 +1,6 @@ +package com.google.firebase.database.connection.idl; + +interface IGetTokenCallback { + void zero(String s) = 0; + void onError(String s) = 1; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IListenHashProvider.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IListenHashProvider.aidl new file mode 100644 index 0000000..a5aaa18 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IListenHashProvider.aidl @@ -0,0 +1,11 @@ +package com.google.firebase.database.connection.idl; + +import com.google.firebase.database.connection.idl.CompoundHashParcelable; + +interface IListenHashProvider { + String zzPY() = 0; + + boolean zzPZ() = 1; + + CompoundHashParcelable zzQF() = 2; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnection.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnection.aidl new file mode 100644 index 0000000..21e00b1 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnection.aidl @@ -0,0 +1,44 @@ +package com.google.firebase.database.connection.idl; + +import com.google.android.gms.dynamic.IObjectWrapper; + +import com.google.firebase.database.connection.idl.ConnectionConfig; +import com.google.firebase.database.connection.idl.IConnectionAuthTokenProvider; +import com.google.firebase.database.connection.idl.IListenHashProvider; +import com.google.firebase.database.connection.idl.IPersistentConnectionDelegate; +import com.google.firebase.database.connection.idl.IRequestResultCallback; + + +interface IPersistentConnection { + void setup(in ConnectionConfig var1, IConnectionAuthTokenProvider var2, IObjectWrapper var3, IPersistentConnectionDelegate var4) = 0; + + void initialize() = 1; + + void shutdown() = 2; + + void refreshAuthToken() = 3; + + void listen(in List var1, IObjectWrapper var2, IListenHashProvider var3, long var4, IRequestResultCallback var6) = 4; + + void unlisten(in List var1, IObjectWrapper var2) = 5; + + void purgeOutstandingWrites() = 6; + + void put(in List var1, IObjectWrapper var2, IRequestResultCallback var3) = 7; + + void compareAndPut(in List var1, IObjectWrapper var2, String var3, IRequestResultCallback var4) = 8; + + void merge(in List var1, IObjectWrapper var2, IRequestResultCallback var3) = 9; + + void onDisconnectPut(in List var1, IObjectWrapper var2, IRequestResultCallback var3) = 10; + + void onDisconnectMerge(in List var1, IObjectWrapper var2, IRequestResultCallback var3) = 11; + + void onDisconnectCancel(in List var1, IRequestResultCallback var2) = 12; + + void interrupt(String var1) = 13; + + void resume(String var1) = 14; + + boolean isInterrupted(String var1) = 15; +} diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnectionDelegate.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnectionDelegate.aidl new file mode 100644 index 0000000..9ae649d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IPersistentConnectionDelegate.aidl @@ -0,0 +1,19 @@ +package com.google.firebase.database.connection.idl; + +import com.google.android.gms.dynamic.IObjectWrapper; + +import com.google.firebase.database.connection.idl.RangeParcelable; + +interface IPersistentConnectionDelegate { + void zero(in List var1, IObjectWrapper var2, boolean var3, long var4) = 0; + + void one(in List var1, in List var2, IObjectWrapper var3, long var4) = 1; + + void two() = 2; + + void onDisconnect() = 3; + + void four(boolean var1) = 4; + + void five(IObjectWrapper var1) = 5; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IRequestResultCallback.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IRequestResultCallback.aidl new file mode 100644 index 0000000..5806bc3 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/IRequestResultCallback.aidl @@ -0,0 +1,5 @@ +package com.google.firebase.database.connection.idl; + +interface IRequestResultCallback { + void zero(String var1, String var2) = 0; +} \ No newline at end of file diff --git a/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/RangeParcelable.aidl b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/RangeParcelable.aidl new file mode 100644 index 0000000..08d6df1 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/firebase/database/connection/idl/RangeParcelable.aidl @@ -0,0 +1,3 @@ +package com.google.firebase.database.connection.idl; + +parcelable RangeParcelable; \ No newline at end of file diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java new file mode 100644 index 0000000..5c71ea0 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import android.os.Bundle; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class CorpusStatus extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode; + @SafeParceled(1) + public boolean found; + @SafeParceled(2) + public long lastIndexedSeqno; + @SafeParceled(3) + public long lastCommittedSeqno; + @SafeParceled(4) + public long committedNumDocuments; + @SafeParceled(5) + public Bundle counters; + @SafeParceled(6) + public String g; + + public CorpusStatus() { + versionCode = 2; + } + + public static final Creator CREATOR = new AutoCreator(CorpusStatus.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdate.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdate.java new file mode 100644 index 0000000..2f8a596 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdate.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class PIMEUpdate extends AutoSafeParcelable { + + public static final Creator CREATOR = new AutoCreator(PIMEUpdate.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java new file mode 100644 index 0000000..d542f48 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class PIMEUpdateResponse extends AutoSafeParcelable { + @SafeParceled(1000) + private int versionCode; + + @SafeParceled(1) + private String b; + + @SafeParceled(2) + public final byte[] bytes; + + @SafeParceled(3) + public final PIMEUpdate[] updates; + + public PIMEUpdateResponse() { + versionCode = 1; + this.bytes = null; + this.updates = new PIMEUpdate[0]; + } + + public static final Creator CREATOR = new AutoCreator(PIMEUpdateResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java new file mode 100644 index 0000000..1be52c8 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +import java.util.List; + +public class QuerySpecification extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 2; + @SafeParceled(1) + public final boolean b; + //@SafeParceled(value = 2, subType = "TODO") + public final List c; + //@SafeParceled(value = 3, subType = "TODO") + public final List d; + @SafeParceled(4) + public final boolean e; + @SafeParceled(5) + public final int f; + @SafeParceled(6) + public final int g; + @SafeParceled(7) + public final boolean h; + @SafeParceled(8) + public final int i; + + private QuerySpecification() { + b = false; + c = null; + d = null; + e = false; + f = 0; + g = 0; + h = false; + i = 0; + } + + @Override + public String toString() { + return "QuerySpecification{" + + "versionCode=" + versionCode + + ", b=" + b + + ", c=" + c + + ", d=" + d + + ", e=" + e + + ", f=" + f + + ", g=" + g + + ", h=" + h + + ", i=" + i + + '}'; + } + + public static final Creator CREATOR = new AutoCreator(QuerySpecification.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/RequestIndexingSpecification.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/RequestIndexingSpecification.java new file mode 100644 index 0000000..720f773 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/RequestIndexingSpecification.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class RequestIndexingSpecification extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode; + + public static final Creator CREATOR = new AutoCreator(RequestIndexingSpecification.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java new file mode 100644 index 0000000..fec25f0 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class SearchResults extends AutoSafeParcelable { + @SafeParceled(1000) + private int versionCode = 2; + + public static Creator CREATOR = new AutoCreator(SearchResults.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java new file mode 100644 index 0000000..0f80a05 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class SuggestSpecification extends AutoSafeParcelable { + @SafeParceled(1000) + private int versionCode; + + public SuggestSpecification() { + versionCode = 2; + } + + public static final Creator CREATOR = new AutoCreator(SuggestSpecification.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java new file mode 100644 index 0000000..f616d51 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class SuggestionResults extends AutoSafeParcelable { + @SafeParceled(1000) + private int versionCode; + @SafeParceled(1) + public final String errorMessage; + + @SafeParceled(2) + public final String[] s1; + @SafeParceled(3) + public final String[] s2; + + private SuggestionResults() { + versionCode = 2; + errorMessage = null; + s1 = s2 = null; + } + + public SuggestionResults(String errorMessage) { + versionCode = 2; + this.errorMessage = errorMessage; + this.s1 = null; + this.s2 = null; + } + + public SuggestionResults(String[] s1, String[] s2) { + versionCode = 2; + this.errorMessage = null; + this.s1 = s1; + this.s2 = s2; + } + + public static final Creator CREATOR = new AutoCreator(SuggestionResults.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/UsageInfo.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/UsageInfo.java new file mode 100644 index 0000000..a2f0f9e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/UsageInfo.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.appdatasearch; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UsageInfo extends AutoSafeParcelable { + + public static Creator CREATOR = new AutoCreator(UsageInfo.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/audit/LogAuditRecordsRequest.java b/play-services-api/src/main/java/com/google/android/gms/audit/LogAuditRecordsRequest.java new file mode 100644 index 0000000..8042154 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/audit/LogAuditRecordsRequest.java @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.audit; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class LogAuditRecordsRequest extends AbstractSafeParcelable { + @Field(1) + public int writeMode; + @Field(2) + public int componentId; + @Field(3) + public String accountName; + @Field(4) + public byte[][] auditRecords; + @Field(5) + public byte[] traceToken; + @Field(6) + public byte[] auditToken; + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("LogAuditRecordsRequest") + .field("writeMode", writeMode) + .field("componentId", componentId) + .field("accountName", accountName) + .field("auditRecords", auditRecords) + .field("traceToken", traceToken) + .field("auditToken", auditToken) + .end(); + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LogAuditRecordsRequest.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java new file mode 100644 index 0000000..6c73b4b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +import android.accounts.Account; + +import org.microg.gms.auth.AuthConstants; +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class AccountRecoveryGuidanceRequest extends AutoSafeParcelable { + + @SafeParceled(1) + private int versionCode = 1; + @SafeParceled(2) + @Deprecated + public final String accountName; + @SafeParceled(3) + public final Account account; + + public AccountRecoveryGuidanceRequest(String accountName) { + this.accountName = accountName; + this.account = new Account(accountName, AuthConstants.DEFAULT_ACCOUNT_TYPE); + } + + public AccountRecoveryGuidanceRequest(Account account) { + this.accountName = account.name; + this.account = account; + } + + public static final Creator CREATOR = new AutoCreator(AccountRecoveryGuidanceRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java new file mode 100644 index 0000000..cd56eb1 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +import android.accounts.Account; + +import org.microg.gms.auth.AuthConstants; +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class AccountRemovalRequest extends AutoSafeParcelable { + + @SafeParceled(1) + private int versionCode = 1; + @SafeParceled(2) + @Deprecated + public final String accountName; + @SafeParceled(3) + public final Account account; + + public AccountRemovalRequest(String accountName) { + this.accountName = accountName; + this.account = new Account(accountName, AuthConstants.DEFAULT_ACCOUNT_TYPE); + } + + public AccountRemovalRequest(Account account) { + this.accountName = account.name; + this.account = account; + } + + public static final Creator CREATOR = new AutoCreator(AccountRemovalRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java new file mode 100644 index 0000000..c7db433 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +import com.google.android.gms.auth.firstparty.shared.AccountCredentials; +import com.google.android.gms.auth.firstparty.shared.CaptchaSolution; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class ConfirmCredentialsRequest extends AutoSafeParcelable { + @SafeParceled(1) + private int versionCode = 1; + @SafeParceled(2) + public AccountCredentials accountCredentials; + @SafeParceled(3) + public CaptchaSolution captchaSolution; + + public static final Creator CREATOR = new AutoCreator(ConfirmCredentialsRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/FACLConfig.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/FACLConfig.java new file mode 100644 index 0000000..17004b0 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/FACLConfig.java @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class FACLConfig extends AutoSafeParcelable { + @Field(1) + public int versionCode = 1; + @Field(2) + public boolean allCirclesVisible; + @Field(3) + public String visibleEdges; + @Field(4) + public boolean allContactsVisible; + @Field(5) + public boolean showCircles; + @Field(6) + public boolean showContacts; + @Field(7) + public boolean hasShowCircles; + + public static final Creator CREATOR = new AutoCreator(FACLConfig.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/PACLConfig.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/PACLConfig.java new file mode 100644 index 0000000..58f04dc --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/PACLConfig.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class PACLConfig extends AutoSafeParcelable { + @Field(1) + private int versionCode = 1; + @Field(2) + public String visibleActions; + @Field(3) + public String data; + + public static final Creator CREATOR = new AutoCreator(PACLConfig.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java new file mode 100644 index 0000000..4ea4071 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2015 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +import android.accounts.Account; +import android.os.Bundle; + +import com.google.android.gms.auth.firstparty.shared.AppDescription; +import com.google.android.gms.auth.firstparty.shared.CaptchaSolution; +import org.microg.safeparcel.AutoSafeParcelable; + +public class TokenRequest extends AutoSafeParcelable { + @Field(1) + private int versionCode = 8; + @Field(2) + private String service; + @Field(3) + public String accountName; + @Field(4) + public Bundle extras; + @Field(5) + public FACLConfig faclConfig; + @Field(6) + public PACLConfig paclConfig; + @Field(7) + public boolean signingIn; + @Field(9) + public String consent; + @Field(10) + public AppDescription callingAppDescription; + @Field(11) + public CaptchaSolution captchaSolution; + @Field(14) + public boolean useCache; + @Field(15) + public String accountType; + @Field(16) + public int delegationType; + @Field(17) + public String delegateeUserId; + @Field(19) + public String consentResult; + @Field(24) + public int mode; + + public Account getAccount() { + return new Account(accountName, accountType); + } + + public static final Creator CREATOR = new AutoCreator(TokenRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenResponse.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenResponse.java new file mode 100644 index 0000000..999e9a9 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenResponse.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.dataservice; + +public class TokenResponse { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java new file mode 100644 index 0000000..0091dee --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.delegate; + +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.os.Bundle; + +import com.google.android.gms.auth.firstparty.shared.AppDescription; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class ConfirmCredentialsWorkflowRequest extends AutoSafeParcelable { + @SafeParceled(1) + private int versionCode = 3; + @SafeParceled(2) + public String accountName; + @SafeParceled(3) + public AppDescription appDescription; + @SafeParceled(4) + public Bundle extras; + @SafeParceled(5) + public Account account; + @SafeParceled(6) + public AccountAuthenticatorResponse accountAuthenticatorResponse; + + public static final Creator CREATOR = new AutoCreator(ConfirmCredentialsWorkflowRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/proximity/data/Permit.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/proximity/data/Permit.java new file mode 100644 index 0000000..139bf29 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/proximity/data/Permit.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.proximity.data; + +public class Permit { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java new file mode 100644 index 0000000..4b57130 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.shared; + +import android.accounts.Account; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +// TODO +public class AccountCredentials extends AutoSafeParcelable { + @SafeParceled(1) + private int versionCode = 2; + @SafeParceled(3) + public String accountName; + @SafeParceled(9) + public String accountType; + + public Account getAccount() { + return new Account(accountName, accountType); + } + + public static final Creator CREATOR = new AutoCreator(AccountCredentials.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java new file mode 100644 index 0000000..9e339e8 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.shared; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class AppDescription extends AutoSafeParcelable { + @SafeParceled(1) + private int versionCode = 1; + @SafeParceled(2) + public int callingUid; + @SafeParceled(3) + public String sessiondId; + @SafeParceled(4) + public String sessiondSig; + @SafeParceled(5) + public String callingPkg; + + public static final Creator CREATOR = new AutoCreator(AppDescription.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java new file mode 100644 index 0000000..9563798 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.auth.firstparty.shared; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +// TODO +public class CaptchaSolution extends AutoSafeParcelable { + + @SafeParceled(1) + private int versionCode = 1; + + public static final Creator CREATOR = new AutoCreator(CaptchaSolution.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CallerInfo.java b/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CallerInfo.java new file mode 100644 index 0000000..763a90c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CallerInfo.java @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.invocationparams; + +import androidx.annotation.NonNull; +import org.microg.safeparcel.AutoSafeParcelable; + +public class CallerInfo extends AutoSafeParcelable { + @Field(1) + public String source; + @Field(2) + public String medium; + @Field(3) + public String campaign; + @Field(4) + public String content; + + @NonNull + @Override + public String toString() { + return "CallerInfo(" + source + "," + medium + "," + campaign + "," + content + ")"; + } + + public static final Creator CREATOR = new AutoCreator<>(CallerInfo.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerAccount.java b/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerAccount.java new file mode 100644 index 0000000..f12db2f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerAccount.java @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.invocationparams; + +import androidx.annotation.NonNull; +import org.microg.safeparcel.AutoSafeParcelable; + +public class CredentialManagerAccount extends AutoSafeParcelable { + @Field(1) + public String name; + + @NonNull + @Override + public String toString() { + return name; + } + + public static final String NAME_LOCAL = "pwm.constant.LocalAccount"; + public static final Creator CREATOR = new AutoCreator<>(CredentialManagerAccount.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.java b/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.java new file mode 100644 index 0000000..871754f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/credential/manager/invocationparams/CredentialManagerInvocationParams.java @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.credential.manager.invocationparams; + +import androidx.annotation.NonNull; +import org.microg.gms.utils.ToStringHelper; +import org.microg.safeparcel.AutoSafeParcelable; + +public class CredentialManagerInvocationParams extends AutoSafeParcelable { + @Field(1) + public CredentialManagerAccount account; + @Field(2) + public CallerInfo caller; + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("CredentialManagerInvocationParams") + .field("account", account) + .field("caller", caller) + .end(); + } + + public static final Creator CREATOR = new AutoCreator<>(CredentialManagerInvocationParams.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/facs/cache/FacsCacheCallOptions.java b/play-services-api/src/main/java/com/google/android/gms/facs/cache/FacsCacheCallOptions.java new file mode 100644 index 0000000..c74383e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/facs/cache/FacsCacheCallOptions.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.facs.cache; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class FacsCacheCallOptions extends AutoSafeParcelable { + @Field(1) + public String instanceId; + @Field(2) + public long version; + + public static final Creator CREATOR = new AutoCreator<>(FacsCacheCallOptions.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.java b/play-services-api/src/main/java/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.java new file mode 100644 index 0000000..18f2177 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/facs/cache/ForceSettingsCacheRefreshResult.java @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.facs.cache; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ForceSettingsCacheRefreshResult extends AutoSafeParcelable { + + public static final Creator CREATOR = new AutoCreator<>(ForceSettingsCacheRefreshResult.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.java b/play-services-api/src/main/java/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.java new file mode 100644 index 0000000..ae68810 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/facs/cache/GetActivityControlsSettingsResult.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.facs.cache; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class GetActivityControlsSettingsResult extends AbstractSafeParcelable { + @Field(value = 1) + public byte[] bytes; + + @Constructor + public GetActivityControlsSettingsResult(@Param(1) byte[] data) { + this.bytes = data; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetActivityControlsSettingsResult.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.java b/play-services-api/src/main/java/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.java new file mode 100644 index 0000000..b89f861 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/facs/cache/ReadDeviceLevelSettingsResult.java @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.facs.cache; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ReadDeviceLevelSettingsResult extends AutoSafeParcelable { + + public static final Creator CREATOR = new AutoCreator<>(ReadDeviceLevelSettingsResult.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.java b/play-services-api/src/main/java/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.java new file mode 100644 index 0000000..4ef2c91 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/facs/cache/UpdateActivityControlsSettingsResult.java @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.facs.cache; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UpdateActivityControlsSettingsResult extends AutoSafeParcelable { + + public static final Creator CREATOR = new AutoCreator<>(UpdateActivityControlsSettingsResult.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/family/model/MemberDataModel.java b/play-services-api/src/main/java/com/google/android/gms/family/model/MemberDataModel.java new file mode 100644 index 0000000..500a509 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/family/model/MemberDataModel.java @@ -0,0 +1,79 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.family.model; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class MemberDataModel extends AbstractSafeParcelable { + @Field(1) + public String memberId = ""; + @Field(2) + public String email = ""; + @Field(3) + public String displayName = ""; + @Field(4) + public String hohGivenName = ""; + @Field(5) + public String profilePhotoUrl = ""; + @Field(6) + public String roleName = ""; + @Field(7) + public int role = 0; + @Field(8) + public boolean isActive = false; + @Field(9) + public int supervisionType = 0; + @Field(10) + public long timestamp = 0; + @Field(11) + public boolean isInviteEntry = false; + @Field(12) + public int inviteSlots = 0; + @Field(13) + public boolean isInvited = false; + @Field(14) + public String invitationId = ""; + @Field(15) + public long inviteState = 0; + @Field(16) + public String inviteSentDate = ""; + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(MemberDataModel.class); + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + @Override + public String toString() { + return "MemberDataModel{" + + "memberId='" + memberId + '\'' + + ", email='" + email + '\'' + + ", displayName='" + displayName + '\'' + + ", hohGivenName='" + hohGivenName + '\'' + + ", profilePhotoUrl='" + profilePhotoUrl + '\'' + + ", roleName='" + roleName + '\'' + + ", role=" + role + + ", isActive=" + isActive + + ", supervisionType=" + supervisionType + + ", timestamp=" + timestamp + + ", isInviteEntry=" + isInviteEntry + + ", inviteSlots=" + inviteSlots + + ", isInvited=" + isInvited + + ", invitationId='" + invitationId + '\'' + + ", inviteState=" + inviteState + + ", inviteSentDate='" + inviteSentDate + '\'' + + '}'; + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/family/v2/model/BulletPoint.java b/play-services-api/src/main/java/com/google/android/gms/family/v2/model/BulletPoint.java new file mode 100644 index 0000000..f1ef313 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/family/v2/model/BulletPoint.java @@ -0,0 +1,68 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.family.v2.model; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public class BulletPoint implements Parcelable { + + public HashMap contentMap = new HashMap<>(); + + public BulletPoint() { + } + + public BulletPoint(HashMap contentMap) { + this.contentMap = contentMap; + } + + public BulletPoint(Parcel parcel) { + int readInt = parcel.readInt(); + for (int i = 0; i < readInt; i++) { + this.contentMap.put(parcel.readInt(), parcel.readString()); + } + } + + public final boolean equals(Object obj) { + return (obj instanceof BulletPoint) && ((BulletPoint) obj).contentMap.equals(this.contentMap); + } + + public final int hashCode() { + return Arrays.hashCode(new Object[]{this.contentMap}); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(this.contentMap.size()); + for (Map.Entry entry : this.contentMap.entrySet()) { + dest.writeInt((Integer) entry.getKey()); + dest.writeString((String) entry.getValue()); + } + } + + public static final Creator CREATOR = new Creator() { + @Override + public BulletPoint createFromParcel(Parcel source) { + return new BulletPoint(source); + } + + @Override + public BulletPoint[] newArray(int size) { + return new BulletPoint[size]; + } + }; +} diff --git a/play-services-api/src/main/java/com/google/android/gms/family/v2/model/HelpData.java b/play-services-api/src/main/java/com/google/android/gms/family/v2/model/HelpData.java new file mode 100644 index 0000000..21c1af7 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/family/v2/model/HelpData.java @@ -0,0 +1,45 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.family.v2.model; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class HelpData extends AbstractSafeParcelable { + @Field(1) + public String linkUrl; + @Field(2) + public String appContext; + + public HelpData() { + } + + public HelpData(String linkUrl, String appContext) { + this.linkUrl = linkUrl; + this.appContext = appContext; + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(HelpData.class); + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + @Override + public String toString() { + return "HelpData{" + + "linkUrl='" + linkUrl + '\'' + + ", appContext='" + appContext + '\'' + + '}'; + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/family/v2/model/PageData.java b/play-services-api/src/main/java/com/google/android/gms/family/v2/model/PageData.java new file mode 100644 index 0000000..5a0cb11 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/family/v2/model/PageData.java @@ -0,0 +1,61 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.family.v2.model; + +import android.os.Parcelable; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Objects; + +public class PageData extends AutoSafeParcelable { + @Field(1) + public int version = 1; + @Field(2) + public HashMap sectionMap = new HashMap<>(); + @Field(3) + public HashMap helpMap = new HashMap<>(); + @Field(4) + public ArrayList bulletPoints = new ArrayList<>(); + + public PageData() {} + + public PageData(HashMap sectionMap, HashMap helpMap, ArrayList bulletPoints) { + this.sectionMap = sectionMap; + this.helpMap = helpMap; + this.bulletPoints = bulletPoints; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof PageData)) return false; + PageData other = (PageData) obj; + return version == other.version && + Objects.equals(sectionMap, other.sectionMap) && + Objects.equals(helpMap, other.helpMap) && + Objects.equals(bulletPoints, other.bulletPoints); + } + + @Override + public int hashCode() { + return Objects.hash(version, sectionMap, helpMap, bulletPoints); + } + + @Override + public String toString() { + return "PageData{" + + "version=" + version + + ", sectionMap=" + sectionMap + + ", helpMap=" + helpMap + + ", bulletPoints=" + bulletPoints + + '}'; + } + + public static final Parcelable.Creator CREATOR = findCreator(PageData.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java b/play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java new file mode 100644 index 0000000..55d6d35 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java @@ -0,0 +1,163 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.app.ApplicationErrorReport; +import android.graphics.Bitmap; +import android.graphics.RectF; +import android.os.Bundle; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.data.BitmapTeleporter; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.util.List; + +@SafeParcelable.Class +public class ErrorReport extends AbstractSafeParcelable { + @Field(2) + public ApplicationErrorReport applicationErrorReport; + @Field(3) + public String feedbackMsg; + @Field(4) + public int versionCode; + @Field(5) + public String versionName; + @Field(6) + public String mobileDevice; + @Field(7) + public String mobileDisplay; + @Field(8) + public String mobileType; + @Field(9) + public String mobileModel; + @Field(10) + public String mobileProduct; + @Field(11) + public String mobileFingerprint; + @Field(12) + public int mobileSdkInt; + @Field(13) + public String mobileRelease; + @Field(14) + public String mobileIncremental; + @Field(15) + public String mobileCodeName; + @Field(16) + public String mobileBoard; + @Field(17) + public String mobileBrand; + @Field(18) + public String[] unknownStringArray18; + @Field(19) + public String[] unknownStringArray19; + @Field(20) + public String[] unknownStringArray20; + @Field(21) + public String unknownString21; + @Field(22) + public String screenshotImgSrc; + @Field(23) + public byte[] screenshotImgData; + @Field(24) + public int screenshotHeight; + @Field(25) + public int screenshotWidth; + @Field(26) + public int phoneType; + @Field(27) + public int networkType; + @Field(28) + public String networkOperatorName; + @Field(29) + public String email; + @Field(30) + public String languageTag; + @Field(31) + public Bundle bundle; + @Field(32) + public boolean isFixedUri; + @Field(33) + public int mobileCountryCode; + @Field(34) + public int mobileNetworkCode; + @Field(35) + public boolean unknownBool35; + @Field(36) + public String exceptionClassName; + @Field(37) + public String throwFileName; + @Field(38) + public int throwLineNumber; + @Field(39) + public String throwClassName; + @Field(40) + public String throwMethodName; + @Field(41) + public String stackTrace; + @Field(42) + public String exceptionMessage; + @Field(43) + public String unknownString43; + @Field(44) + public String unknownString44; + @Field(45) + public String packageName; + @Field(46) + public BitmapTeleporter bitmapTeleporter; + @Field(47) + public String unknownString47; + @Field(48) + public FileTeleporter[] files; + @Field(49) + public String[] unknownByteArray49; + @Field(50) + public boolean unknownBool50; + @Field(51) + public String unknownString51; + @Field(52) + public ThemeSettings themeSettings; + @Field(53) + public LogOptions logOptions; + @Field(54) + public String unknownString54; + @Field(55) + public boolean unknownBool55; + @Field(56) + public Bundle bundleText; + @Field(57) + public List rectFS; + @Field(58) + public boolean unknownBool58; + @Field(59) + public Bitmap bitmap; + @Field(60) + public String unknownString60; + @Field(61) + public List camList; + @Field(62) + public int unknownInt62; + @Field(63) + public int unknownInt63; + @Field(64) + public String[] unknownStringArray64; + @Field(65) + public String[] unknownStringArray65; + @Field(66) + public String[] unknownStringArray66; + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(ErrorReport.class); + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java b/play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java new file mode 100644 index 0000000..679fe0f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.app.ApplicationErrorReport; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.data.BitmapTeleporter; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.util.List; + +@SafeParcelable.Class +public class FeedbackOptions extends AbstractSafeParcelable { + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FeedbackOptions.class); + + @Field(2) + public String unknownString2; + @Field(3) + public Bundle unknownBundle3; + @Field(5) + public String unknownString3; + @Field(6) + public ApplicationErrorReport applicationErrorReport; + @Field(7) + public String unknownString7; + @Field(8) + public BitmapTeleporter bitmapTeleporter; + @Field(9) + public String packageName; + @Field(10) + public List files; + @Field(11) + public boolean unknownBoolean11; + @Field(12) + public ThemeSettings themeSettings; + @Field(13) + public LogOptions logOptions; + @Field(14) + public boolean unknownBoolean14; + @Field(15) + public Bitmap screenshot; + @Field(16) + public String unknownString16; + @Field(17) + public boolean unknownBoolean17; + @Field(18) + public long unknownLong18; + @Field(19) + public boolean unknownBool19; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java b/play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java new file mode 100644 index 0000000..445200b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class FileTeleporter extends AbstractSafeParcelable { + @Field(3) + public String contentType; + @Field(4) + public String content; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FileTeleporter.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java b/play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java new file mode 100644 index 0000000..ce1f820 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class LogOptions extends AbstractSafeParcelable { + + @Field(2) + public String options; + @Field(3) + public boolean unknownBool3; + @Field(4) + public boolean unknownBool4; + @Field(5) + public boolean unknownBool5; + @Field(6) + public boolean unknownBool6; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LogOptions.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/ThemeSettings.java b/play-services-api/src/main/java/com/google/android/gms/feedback/ThemeSettings.java new file mode 100644 index 0000000..3dee3f0 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/ThemeSettings.java @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import androidx.annotation.NonNull; +import org.microg.gms.utils.ToStringHelper; +import org.microg.safeparcel.AutoSafeParcelable; + +public class ThemeSettings extends AutoSafeParcelable { + @Field(2) + public int unknownInt2; + @Field(3) + public int unknownInt3; + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("ThemeSettings") + .field("2", unknownInt2) + .field("3", unknownInt3) + .end(); + } + + public static final Creator CREATOR = findCreator(ThemeSettings.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/gass/internal/GassRequestParcel.java b/play-services-api/src/main/java/com/google/android/gms/gass/internal/GassRequestParcel.java new file mode 100644 index 0000000..6666968 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/gass/internal/GassRequestParcel.java @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.gass.internal; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class GassRequestParcel extends AbstractSafeParcelable { + + @Field(1) + public int versionCode; + @Field(2) + public String packageName; + @Field(3) + public String appVersionCode; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GassRequestParcel.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/gass/internal/GassResponseParcel.java b/play-services-api/src/main/java/com/google/android/gms/gass/internal/GassResponseParcel.java new file mode 100644 index 0000000..34e2c61 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/gass/internal/GassResponseParcel.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.gass.internal; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import com.google.android.gms.feedback.ErrorReport; + +@SafeParcelable.Class +public class GassResponseParcel extends AbstractSafeParcelable { + + @Field(1) + public int versionCode; + + @Field(2) + public byte[] data; + + public ErrorReport report; + + public GassResponseParcel() { + } + + public GassResponseParcel(int i, byte[] bArr) { + this.versionCode = i; + this.report = null; + this.data = bArr; + } + + public GassResponseParcel(ErrorReport report) { + this.versionCode = 1; + this.report = report; + this.data = null; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GassResponseParcel.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/FRDProductSpecificDataEntry.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/FRDProductSpecificDataEntry.java new file mode 100644 index 0000000..cf3bfd4 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/FRDProductSpecificDataEntry.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class FRDProductSpecificDataEntry extends AutoSafeParcelable { + public static final Creator CREATOR = findCreator(FRDProductSpecificDataEntry.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/GoogleHelp.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/GoogleHelp.java new file mode 100644 index 0000000..d189a2a --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/GoogleHelp.java @@ -0,0 +1,131 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp; + +import android.accounts.Account; +import android.app.PendingIntent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import androidx.annotation.NonNull; +import com.google.android.gms.feedback.ErrorReport; +import com.google.android.gms.feedback.ThemeSettings; +import com.google.android.gms.googlehelp.internal.common.OverflowMenuItem; +import com.google.android.gms.googlehelp.internal.common.TogglingData; +import org.microg.gms.utils.ToStringHelper; +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.List; + +public class GoogleHelp extends AutoSafeParcelable { + @Field(1) + private int versionCode; + @Field(2) + public String appContext; + @Field(3) + public Account account; + @Field(4) + public Bundle extras; + @Field(5) + public boolean unknownBool5; + @Field(6) + public boolean unknownBool6; + @Field(7) + public List unknownStringList7; + @Field(15) + public Uri uri; + @Field(16) + public List overflowMenuItems; + @Field(17) + public int unknownAlwaysZero17; + @Field(18) + public List offlineSuggestions; + @Field(20) + public int unknownInt20; + @Field(21) + public int unknownInt21; + @Field(22) + public boolean unknownBool22; + @Field(23) + public ErrorReport errorReport; + @Field(25) + public ThemeSettings themeSettings; + @Field(28) + public String appPackageName; + @Field(31) + public TogglingData togglingData; + @Field(32) + public int unknownInt32; + @Field(33) + public PendingIntent customFeedbackPendingIntent; + @Field(34) + public String title; + @Field(35) + public Bitmap icon; + @Field(36) + public int unknownInt36; + @Field(37) + public boolean unknownBool37; + @Field(38) + public boolean unknownBool38; + @Field(39) + public int timeout; + @Field(40) + public String sessionId; + @Field(41) + public boolean unknownBool41; + @Field(42) + public String clientPackageName; + @Field(43) + public boolean unknownBool43; + @Field(44) + public ND4CSettings nd4CSettings; + @Field(45) + public boolean unknownBool45; + @Field(46) + public List productSpecificDataEntries; + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("GoogleHelp") + .field("appContext", appContext) + .field("account", account) + .field("extras", extras) + .field("5", unknownBool5) + .field("6", unknownBool6) + .field("7", unknownStringList7) + .field("uri", uri) + .field("overflowMenuItems", overflowMenuItems) + .field("17", unknownAlwaysZero17) + .field("offlineSuggestions", offlineSuggestions) + .field("20", unknownInt20) + .field("21", unknownInt21) + .field("22", unknownBool22) + .field("errorReport", errorReport) + .field("themeSettings", themeSettings) + .field("appPackageName", appPackageName) + .field("togglingData", togglingData) + .field("32", unknownInt32) + .field("customFeedbackPendingIntent", customFeedbackPendingIntent) + .field("title", title) + .field("icon", icon) + .field("36", unknownInt36) + .field("37", unknownBool37) + .field("38", unknownBool38) + .field("timeout", timeout) + .field("sessionId", sessionId) + .field("41", unknownBool41) + .field("clientPackageName", clientPackageName) + .field("43", unknownBool43) + .field("nd4CSettings", nd4CSettings) + .field("45", unknownBool45) + .field("productSpecificDataEntries", productSpecificDataEntries) + .end(); + } + + public static final Creator CREATOR = findCreator(GoogleHelp.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/InProductHelp.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/InProductHelp.java new file mode 100644 index 0000000..141a168 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/InProductHelp.java @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class InProductHelp extends AutoSafeParcelable { + @Field(1) + public GoogleHelp googleHelp; + public static final Creator CREATOR = findCreator(InProductHelp.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/ND4CSettings.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/ND4CSettings.java new file mode 100644 index 0000000..c16a0e1 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/ND4CSettings.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ND4CSettings extends AutoSafeParcelable { + public static final Creator CREATOR = findCreator(ND4CSettings.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/OfflineSuggestion.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/OfflineSuggestion.java new file mode 100644 index 0000000..952164a --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/OfflineSuggestion.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class OfflineSuggestion extends AutoSafeParcelable { + public static final Creator CREATOR = findCreator(OfflineSuggestion.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/SupportRequestHelp.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/SupportRequestHelp.java new file mode 100644 index 0000000..4fd8d35 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/SupportRequestHelp.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class SupportRequestHelp extends AutoSafeParcelable { + @Field(1) + public GoogleHelp googleHelp; + @Field(4) + public String phoneNumber; + + public static final Creator CREATOR = findCreator(SupportRequestHelp.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/OverflowMenuItem.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/OverflowMenuItem.java new file mode 100644 index 0000000..e966f7c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/OverflowMenuItem.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp.internal.common; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class OverflowMenuItem extends AutoSafeParcelable { + public static final Creator CREATOR = findCreator(OverflowMenuItem.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/TogglingData.java b/play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/TogglingData.java new file mode 100644 index 0000000..f2e21c8 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/googlehelp/internal/common/TogglingData.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.googlehelp.internal.common; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class TogglingData extends AutoSafeParcelable { + public static final Creator CREATOR = findCreator(TogglingData.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/identity/accounts/api/AccountData.java b/play-services-api/src/main/java/com/google/android/gms/identity/accounts/api/AccountData.java new file mode 100644 index 0000000..d909cbf --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/identity/accounts/api/AccountData.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.identity.accounts.api; + +public class AccountData { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/identity/intents/model/CountrySpecification.java b/play-services-api/src/main/java/com/google/android/gms/identity/intents/model/CountrySpecification.java new file mode 100644 index 0000000..b9770e3 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/identity/intents/model/CountrySpecification.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.identity.intents.model; + +public class CountrySpecification { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/identity/intents/model/UserAddress.java b/play-services-api/src/main/java/com/google/android/gms/identity/intents/model/UserAddress.java new file mode 100644 index 0000000..aa3959f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/identity/intents/model/UserAddress.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.identity.intents.model; + +public class UserAddress { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/languageprofile/ClientLanguageSettings.java b/play-services-api/src/main/java/com/google/android/gms/languageprofile/ClientLanguageSettings.java new file mode 100644 index 0000000..6494728 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/languageprofile/ClientLanguageSettings.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.languageprofile; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ClientLanguageSettings extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ClientLanguageSettings.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluency.java b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluency.java new file mode 100644 index 0000000..40058ee --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluency.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.languageprofile; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LanguageFluency extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(LanguageFluency.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluencyParams.java b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluencyParams.java new file mode 100644 index 0000000..0c022ac --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguageFluencyParams.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.languageprofile; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LanguageFluencyParams extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(LanguageFluencyParams.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreference.java b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreference.java new file mode 100644 index 0000000..a9f7eb3 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreference.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.languageprofile; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LanguagePreference extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(LanguagePreference.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreferenceParams.java b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreferenceParams.java new file mode 100644 index 0000000..6b599a8 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/languageprofile/LanguagePreferenceParams.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.languageprofile; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LanguagePreferenceParams extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(LanguagePreferenceParams.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/IneligibilityRationale.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/IneligibilityRationale.java new file mode 100644 index 0000000..2184aad --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/IneligibilityRationale.java @@ -0,0 +1,47 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class IneligibilityRationale extends AbstractSafeParcelable { + @Field(1) + public final String unknownStr1; + @Field(2) + public final boolean unknownBool2; + @Field(3) + public final String unknownStr3; + @Field(4) + public final boolean unknownBool4; + @Field(5) + public final boolean unknownBool5; + @Field(6) + public final boolean unknownBool6; + + @Constructor + public IneligibilityRationale(@Param(1) String unknownStr1, @Param(2) boolean unknownBool2, @Param(3) String unknownStr3, + @Param(4) boolean unknownBool4, @Param(5) boolean unknownBool5, @Param(6) boolean unknownBool6) { + this.unknownStr1 = unknownStr1; + this.unknownBool2 = unknownBool2; + this.unknownStr3 = unknownStr3; + this.unknownBool4 = unknownBool4; + this.unknownBool5 = unknownBool5; + this.unknownBool6 = unknownBool6; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(IneligibilityRationale.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationCollectionReason.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationCollectionReason.java new file mode 100644 index 0000000..d71ec7e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationCollectionReason.java @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + + +@SafeParcelable.Class +public class LocationCollectionReason extends AbstractSafeParcelable { + @Field(1) + public final int locationCollectionReason; + + @Constructor + public LocationCollectionReason(@Param(1) int locationCollectionReason) { + this.locationCollectionReason = locationCollectionReason; + } + + @NonNull + @Override + public String toString() { + return "LocationCollectionReason{" + + "locationCollectionReason=" + locationCollectionReason + + '}'; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationCollectionReason.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationReportingStatus.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationReportingStatus.java new file mode 100644 index 0000000..e476911 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationReportingStatus.java @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + + +@SafeParcelable.Class +public class LocationReportingStatus extends AbstractSafeParcelable { + @Field(1) + public final int unknownInt1; + @Field(2) + public final int unknownInt2; + @Field(3) + public final boolean unknownBool3; + @Field(4) + public final IneligibilityRationale ineligibilityRationale; + + @Constructor + public LocationReportingStatus(@Param(1) int unknownInt1, @Param(2) int unknownInt2, @Param(3) boolean unknownBool3, @Param(4) IneligibilityRationale ineligibilityRationale0) { + this.unknownInt1 = unknownInt1; + this.unknownInt2 = unknownInt2; + this.unknownBool3 = unknownBool3; + this.ineligibilityRationale = ineligibilityRationale0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationReportingStatus.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationShare.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationShare.java new file mode 100644 index 0000000..5882039 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationShare.java @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class LocationShare extends AbstractSafeParcelable { + @Field(1) + public final int locationShareType; + @Field(2) + public final String tokenId; + @Field(3) + public final String obfuscatedGaiaId; + + @Constructor + public LocationShare(@Param(1) int locationShareType, @Param(2) String tokenId, @Param(3) String obfuscatedGaiaId) { + this.locationShareType = locationShareType; + this.tokenId = tokenId; + this.obfuscatedGaiaId = obfuscatedGaiaId; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationShare.class); + + @Override + public String toString() { + return "LocationShare{" + + "locationShareType=" + locationShareType + + ", tokenId=" + (tokenId != null ? "\"" + tokenId + "\"" : "null") + + ", obfuscatedGaiaId=" + (obfuscatedGaiaId != null ? "\"" + obfuscatedGaiaId + "\"" : "null") + + '}'; + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadRequest.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadRequest.java new file mode 100644 index 0000000..f5c7858 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadRequest.java @@ -0,0 +1,63 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class LocationUploadRequest extends AbstractSafeParcelable { + @Field(1) + public final long accuracyMeters; + @Field(2) + public final int numberOfFix; + @Field(3) + public final long intervalMillis; + @Field(4) + public final long fastIntervalMillis; + @Field(5) + public final long expirationMillis; + @Field(6) + public final LocationCollectionReason locationCollectionReason; + @Field(7) + public final boolean unknownBool7; + @Field(8) + public final boolean throttleExempt; + @Field(9) + public final String moduleId; + @Field(10) + public final String unknownString10; + @Field(11) + public final long unknownLong11; + + @Constructor + public LocationUploadRequest(@Param(1) long accuracyMeters, @Param(2) int numberOfFix, @Param(3) long intervalMillis, @Param(4) long fastIntervalMillis, + @Param(5) long expirationMillis, @Param(6) LocationCollectionReason locationCollectionReason, + @Param(7) boolean unknownBool7, @Param(8) boolean throttleExempt, @Param(9) String moduleId, @Param(10) String unknownString10, @Param(11) long unknownLong11) { + this.accuracyMeters = accuracyMeters; + this.numberOfFix = numberOfFix; + this.intervalMillis = intervalMillis; + this.fastIntervalMillis = fastIntervalMillis; + this.expirationMillis = expirationMillis; + this.locationCollectionReason = locationCollectionReason; + this.unknownBool7 = unknownBool7; + this.throttleExempt = throttleExempt; + this.moduleId = moduleId; + this.unknownString10 = unknownString10; + this.unknownLong11 = unknownLong11; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationUploadRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadResponse.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadResponse.java new file mode 100644 index 0000000..4d452ea --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/LocationUploadResponse.java @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class LocationUploadResponse extends AbstractSafeParcelable { + @Field(1) + public final int unknownInt1; + @Field(2) + public final LocationReportingStatus locationReportingStatus; + + @Constructor + public LocationUploadResponse(@Param(1) int unknownInt1, @Param(2) LocationReportingStatus locationReportingStatus) { + this.unknownInt1 = unknownInt1; + this.locationReportingStatus = locationReportingStatus; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationUploadResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.java new file mode 100644 index 0000000..7d1e01b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/NoticeAckedUpdateRequest.java @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class NoticeAckedUpdateRequest extends AbstractSafeParcelable { + @Field(1) + public final int isConfirmed; + + @Constructor + public NoticeAckedUpdateRequest(@Param(1) int isConfirmed) { + this.isConfirmed = isConfirmed; + } + + @NonNull + @Override + public final String toString() { + return "NoticeAckedUpdateRequest{" + + "isConfirmed=" + isConfirmed + + '}'; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(NoticeAckedUpdateRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.java new file mode 100644 index 0000000..fa02a27 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationReportingIssues.java @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Bundle; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.util.Arrays; + +@SafeParcelable.Class +public class PeriodicLocationReportingIssues extends AbstractSafeParcelable { + @Field(1) + private final int[] generalIssues; + @Field(2) + private final Bundle issuesByAccount; + @Field(4) + private final boolean isCentralizedSharingFlagEnabled; + + @Constructor + public PeriodicLocationReportingIssues(@Param(1) int[] generalIssues, @Param(2) Bundle issuesByAccount, @Param(4) boolean isCentralizedSharingFlagEnabled) { + this.generalIssues = generalIssues; + this.issuesByAccount = issuesByAccount; + this.isCentralizedSharingFlagEnabled = isCentralizedSharingFlagEnabled; + } + + @NonNull + @Override + public final String toString() { + return "PeriodicLocationReportingIssues{generalIssues=" + Arrays.toString(this.generalIssues) + + ", issuesByAccount=" + this.issuesByAccount + ", isCentralizedSharingFlagEnabled=" + + this.isCentralizedSharingFlagEnabled + "}"; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PeriodicLocationReportingIssues.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.java new file mode 100644 index 0000000..d9cc17d --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/PeriodicLocationUploadRequest.java @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class PeriodicLocationUploadRequest extends AbstractSafeParcelable { + @Field(1) + public final LocationCollectionReason locationCollectionReason; + @Field(2) + public final LocationShare locationShare; + @Field(3) + public final int makePrimaryOption; + @Field(4) + public final long duration; + @Field(5) + public final boolean unknownBool5; + @Field(6) + public final String unknownStr6; + @Field(7) + public final boolean unknownBool7; + + @Constructor + public PeriodicLocationUploadRequest(@Param(1) LocationCollectionReason locationCollectionReason, @Param(2) LocationShare locationShare, + @Param(3) int makePrimaryOption, @Param(4) long duration, @Param(5) boolean unknownBool5, @Param(6) String unknownStr6, @Param(7) boolean unknownBool7) { + this.locationCollectionReason = locationCollectionReason; + this.locationShare = locationShare; + this.makePrimaryOption = makePrimaryOption; + this.duration = duration; + this.unknownBool5 = unknownBool5; + this.unknownStr6 = unknownStr6; + this.unknownBool7 = unknownBool7; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PeriodicLocationUploadRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.java new file mode 100644 index 0000000..8c2af87 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StartLocationReportingRequest.java @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class StartLocationReportingRequest extends AbstractSafeParcelable { + @Field(1) + public final int makePrimary; + @Field(2) + public final int reportingType; + @Field(3) + public final LocationShare locationShare; + @Field(4) + public final long requestDurationMs; + @Field(5) + public final NoticeAckedUpdateRequest noticeAckedUpdateRequest; + + @Constructor + public StartLocationReportingRequest(@Param(1) int makePrimary, @Param(2) int reportingType, @Param(3) LocationShare locationShare, + @Param(4) long requestDurationMs, @Param(5) NoticeAckedUpdateRequest noticeAckedUpdateRequest) { + this.makePrimary = makePrimary; + this.reportingType = reportingType; + this.requestDurationMs = requestDurationMs; + this.locationShare = locationShare; + this.noticeAckedUpdateRequest = noticeAckedUpdateRequest; + } + + @NonNull + @Override + public final String toString() { + return "StartLocationReportingRequest{" + + "makePrimary=" + makePrimary + + ", reportingType=" + reportingType + + ", locationShare=" + locationShare + + ", requestDurationMs=" + requestDurationMs + + ", noticeAckedUpdateRequest=" + noticeAckedUpdateRequest + + '}'; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(StartLocationReportingRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.java b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.java new file mode 100644 index 0000000..da3440b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/locationsharingreporter/StopLocationReportingRequest.java @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.locationsharingreporter; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class StopLocationReportingRequest extends AbstractSafeParcelable { + @Field(1) + public final LocationShare locationShare; + @Constructor + public StopLocationReportingRequest(@Param(1) LocationShare locationShare) { + this.locationShare = locationShare; + } + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(StopLocationReportingRequest.class); + + @Override + public String toString() { + return "StopLocationReportingRequest{" + + "locationShare=" + (locationShare != null ? locationShare.toString() : "null") + + '}'; + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java new file mode 100644 index 0000000..ad2c505 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java @@ -0,0 +1,79 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.List; + +public class AppMetadata extends AutoSafeParcelable { + @Field(2) + public String packageName; + @Field(3) + public String googleAppId; + @Field(4) + public String versionName; + @Field(5) + public String installerPackageName; + @Field(6) + private long googleVersion; + @Field(7) + private long devCertHash; + @Field(8) + private String healthMonitor; + @Field(9) + private boolean measurementEnabled = true; + @Field(10) + private boolean firstOpen; + @Field(11) + public long versionCode = Integer.MIN_VALUE; + @Field(12) + public String firebaseInstanceId; + @Field(13) + private long androidId; + @Field(14) + private long instantiationTime; + @Field(15) + public int appType; + @Field(16) + private boolean adIdReportingEnabled = true; + @Field(17) + public boolean ssaidCollectionEnabled = true; + @Field(18) + public boolean deferredAnalyticsCollection; + @Field(19) + public String admobAppId; + @Field(21) + public Boolean allowAdPersonalization; + @Field(22) + private long dynamiteVersion; + @Field(23) + public List safelistedEvents; + @Field(24) + public String gaAppId; + @Field(25) + private String consentSettings = ""; + @Field(26) + public String ephemeralAppInstanceId = ""; + @Field(27) + private String sessionStitchingToken; + @Field(28) + private boolean sgtmUploadEnabled = false; + @Field(29) + private long targetOsVersion; + @Field(30) + private int consentSource = 100; + @Field(31) + private String dmaConsent = ""; + @Field(32) + private int adServicesVersion; + + public String toString() { + return "AppMetadata[" + packageName + "]"; + } + + public static final Creator CREATOR = new AutoCreator<>(AppMetadata.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.java new file mode 100644 index 0000000..108c8ef --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/ConditionalUserPropertyParcel.java @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ConditionalUserPropertyParcel extends AutoSafeParcelable { + @Field(2) + public String appId; + @Field(3) + public String origin; + @Field(4) + public UserAttributeParcel userAttribute; + @Field(5) + public long creationTimestamp; + @Field(6) + public boolean active; + @Field(7) + public String triggerEventName; + @Field(8) + public EventParcel timedOutEvent; + @Field(9) + public long triggerTimeout; + @Field(10) + public EventParcel triggerEvent; + @Field(11) + public long timeToLive; + @Field(12) + public EventParcel expiredEvent; + + public static final Creator CREATOR = new AutoCreator<>(ConditionalUserPropertyParcel.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java new file mode 100644 index 0000000..54de139 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.internal; + +import android.os.Bundle; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class EventParams extends AutoSafeParcelable { + @Field(2) + public Bundle data; + + public static final Creator CREATOR = new AutoCreator<>(EventParams.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java new file mode 100644 index 0000000..7b5b617 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class EventParcel extends AutoSafeParcelable { + @Field(2) + public String name; + @Field(3) + public EventParams params; + @Field(4) + public String origin; + @Field(5) + public long timestamp; + + public static final Creator CREATOR = new AutoCreator<>(EventParcel.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java new file mode 100644 index 0000000..a2c03ed --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.internal; + +import androidx.annotation.Nullable; +import org.microg.safeparcel.AutoSafeParcelable; + +public class UserAttributeParcel extends AutoSafeParcelable { + @Field(1) + public int versionCode = 2; + @Field(2) + public String name; + @Field(3) + public long timestamp; + @Field(4) + @Nullable + public Long longValue; + @Deprecated + @Field(5) + @Nullable + public Float floatValue; + @Field(6) + @Nullable + public String stringValue; + @Field(7) + public String field7; + @Field(8) + @Nullable + public Double doubleValue; + + public static final Creator CREATOR = new AutoCreator<>(UserAttributeParcel.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java b/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java new file mode 100644 index 0000000..61180fd --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.people.internal; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class ParcelableLoadImageOptions extends AutoSafeParcelable { + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public int imageSize; + + @SafeParceled(2) + public int avatarOptions; + + @SafeParceled(3) + public boolean useLargePictureForCp2Images; + + public static final Creator CREATOR = new AutoCreator(ParcelableLoadImageOptions.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java b/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java new file mode 100644 index 0000000..814a657 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.people.model; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class AccountMetadata extends AutoSafeParcelable { + + @SafeParceled(1) + private int versionCode = 2; + + @SafeParceled(2) + public boolean hasGooglePlus = true; + + @SafeParceled(3) + public boolean hasFeature2 = true; + + @SafeParceled(4) + public boolean hasFeature3 = true; + + @SafeParceled(5) + public boolean hasFeature4 = true; + + public static Creator CREATOR = new AutoCreator(AccountMetadata.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java b/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java new file mode 100644 index 0000000..b03af38 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.people.model; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class AvatarReference extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode; + + @SafeParceled(1) + public int source; + + @SafeParceled(2) + public String location; + + public static final Creator CREATOR = new AutoCreator(AvatarReference.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/phenotype/Configurations.java b/play-services-api/src/main/java/com/google/android/gms/phenotype/Configurations.java new file mode 100644 index 0000000..9d91f78 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/phenotype/Configurations.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class Configurations extends AutoSafeParcelable { + @Field(2) + public String snapshotToken; + @Field(3) + public String serverToken; + @Field(4) + public Configuration[] field4; + @Field(5) + public boolean field5; + @Field(6) + public byte[] field6; + @Field(7) + public long version; + + public static final Creator CREATOR = new AutoCreator<>(Configurations.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/phenotype/DogfoodsToken.java b/play-services-api/src/main/java/com/google/android/gms/phenotype/DogfoodsToken.java new file mode 100644 index 0000000..917d375 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/phenotype/DogfoodsToken.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class DogfoodsToken extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(DogfoodsToken.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/phenotype/FlagOverrides.java b/play-services-api/src/main/java/com/google/android/gms/phenotype/FlagOverrides.java new file mode 100644 index 0000000..dca1216 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/phenotype/FlagOverrides.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class FlagOverrides extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(FlagOverrides.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/phenotype/RegistrationInfo.java b/play-services-api/src/main/java/com/google/android/gms/phenotype/RegistrationInfo.java new file mode 100644 index 0000000..7b9f6cd --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/phenotype/RegistrationInfo.java @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2021 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class RegistrationInfo extends AutoSafeParcelable { + @Field(1) + public String packageName; + @Field(2) + public int version; + @Field(3) + public String[] field3; + @Field(4) + public byte[] field4; + @Field(5) + public boolean weak; + @Field(6) + public int[] field6; + @Field(7) + public String clientPackageName; + + public static final Creator CREATOR = new AutoCreator<>(RegistrationInfo.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusCommonExtras.java b/play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusCommonExtras.java new file mode 100644 index 0000000..72d908e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusCommonExtras.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.internal; + +public class PlusCommonExtras { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusSession.java b/play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusSession.java new file mode 100644 index 0000000..b5b3f8a --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/internal/PlusSession.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.internal; + +public class PlusSession { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsRequest.java b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsRequest.java new file mode 100644 index 0000000..aee4d0b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsRequest.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.internal.model.smart_profile; + +public class CardsRequest { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsResponse.java b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsResponse.java new file mode 100644 index 0000000..bf6c967 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/CardsResponse.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.internal.model.smart_profile; + +public class CardsResponse { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesRequest.java b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesRequest.java new file mode 100644 index 0000000..c45512d --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesRequest.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.internal.model.smart_profile; + +public class PeopleForProfilesRequest { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesResponse.java b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesResponse.java new file mode 100644 index 0000000..4c108aa --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/internal/model/smart_profile/PeopleForProfilesResponse.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.internal.model.smart_profile; + +public class PeopleForProfilesResponse { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Comment.java b/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Comment.java new file mode 100644 index 0000000..37a215c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Comment.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.model.posts; + +public class Comment { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Post.java b/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Post.java new file mode 100644 index 0000000..3b9c346 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Post.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.model.posts; + +public class Post { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Settings.java b/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Settings.java new file mode 100644 index 0000000..a7045a3 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/plus/model/posts/Settings.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.plus.model.posts; + +public class Settings { +} diff --git a/play-services-api/src/main/java/com/google/android/gms/potokens/PoToken.java b/play-services-api/src/main/java/com/google/android/gms/potokens/PoToken.java new file mode 100644 index 0000000..9f5a3f4 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/potokens/PoToken.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.potokens; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class PoToken extends AutoSafeParcelable { + + @Field(1) + public byte[] data; + + public PoToken(byte[] data) { + this.data = data; + } + + public static Creator CREATOR = findCreator(PoToken.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/pseudonymous/PseudonymousIdToken.java b/play-services-api/src/main/java/com/google/android/gms/pseudonymous/PseudonymousIdToken.java new file mode 100644 index 0000000..18df15c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/pseudonymous/PseudonymousIdToken.java @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.pseudonymous; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class PseudonymousIdToken extends AbstractSafeParcelable { + + @Field(2) + public String name; + + @Constructor + public PseudonymousIdToken(@Param(2) String name) { + this.name = name; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PseudonymousIdToken.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/AccountState.java b/play-services-api/src/main/java/com/google/android/gms/reminders/AccountState.java new file mode 100644 index 0000000..4ad0101 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/AccountState.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class AccountState extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(AccountState.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/CreateReminderOptionsInternal.java b/play-services-api/src/main/java/com/google/android/gms/reminders/CreateReminderOptionsInternal.java new file mode 100644 index 0000000..cc0d81c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/CreateReminderOptionsInternal.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class CreateReminderOptionsInternal extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(CreateReminderOptionsInternal.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/LoadRemindersOptions.java b/play-services-api/src/main/java/com/google/android/gms/reminders/LoadRemindersOptions.java new file mode 100644 index 0000000..fd69c55 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/LoadRemindersOptions.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LoadRemindersOptions extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(LoadRemindersOptions.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/ReindexDueDatesOptions.java b/play-services-api/src/main/java/com/google/android/gms/reminders/ReindexDueDatesOptions.java new file mode 100644 index 0000000..e6a4eba --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/ReindexDueDatesOptions.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ReindexDueDatesOptions extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(ReindexDueDatesOptions.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/UpdateRecurrenceOptions.java b/play-services-api/src/main/java/com/google/android/gms/reminders/UpdateRecurrenceOptions.java new file mode 100644 index 0000000..ae70874 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/UpdateRecurrenceOptions.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UpdateRecurrenceOptions extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(UpdateRecurrenceOptions.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.java b/play-services-api/src/main/java/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.java new file mode 100644 index 0000000..29ee864 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/model/CustomizedSnoozePresetEntity.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders.model; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class CustomizedSnoozePresetEntity extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(CustomizedSnoozePresetEntity.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskEntity.java b/play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskEntity.java new file mode 100644 index 0000000..4062335 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskEntity.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders.model; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class TaskEntity extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(TaskEntity.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskIdEntity.java b/play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskIdEntity.java new file mode 100644 index 0000000..1816b1f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/reminders/model/TaskIdEntity.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.reminders.model; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class TaskIdEntity extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(TaskIdEntity.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/ClearCorpusRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/ClearCorpusRequest.java new file mode 100644 index 0000000..8e91b86 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/ClearCorpusRequest.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.corpora; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ClearCorpusRequest extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(ClearCorpusRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusInfoRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusInfoRequest.java new file mode 100644 index 0000000..2da1509 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusInfoRequest.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.corpora; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class GetCorpusInfoRequest extends AutoSafeParcelable { + public static Creator CREATOR = new AutoCreator(GetCorpusInfoRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java new file mode 100644 index 0000000..051a533 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.corpora; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class GetCorpusStatusRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final String packageName; + + @SafeParceled(2) + public final String corpus; + + private GetCorpusStatusRequest() { + packageName = null; + corpus = null; + } + + @Override + public String toString() { + return "GetCorpusStatusRequest{" + + "versionCode=" + versionCode + + ", packageName='" + packageName + '\'' + + ", corpus='" + corpus + '\'' + + '}'; + } + + public static Creator CREATOR = new AutoCreator(GetCorpusStatusRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusResponse.java new file mode 100644 index 0000000..2611d67 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusResponse.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.corpora; + +import com.google.android.gms.appdatasearch.CorpusStatus; +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class GetCorpusStatusResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode; + + @SafeParceled(1) + public final Status status; + + @SafeParceled(2) + public final CorpusStatus corpusStatus; + + private GetCorpusStatusResponse() { + status = null; + corpusStatus = null; + } + + public GetCorpusStatusResponse(Status status, CorpusStatus corpusStatus) { + this.status = status; + this.corpusStatus = corpusStatus; + } + + public static Creator CREATOR = new AutoCreator(GetCorpusStatusResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java new file mode 100644 index 0000000..4fa3396 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.corpora; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class RequestIndexingRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final String packageName; + + @SafeParceled(2) + public final String corpus; + + @SafeParceled(3) + public final long sequenceNumber; + + private RequestIndexingRequest() { + packageName = null; + corpus = null; + sequenceNumber = 0; + } + + @Override + public String toString() { + return "RequestIndexingRequest{" + + "versionCode=" + versionCode + + ", packageName='" + packageName + '\'' + + ", corpus='" + corpus + '\'' + + ", sequenceNumber=" + sequenceNumber + + '}'; + } + + public static Creator CREATOR = new AutoCreator(RequestIndexingRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingResponse.java new file mode 100644 index 0000000..cf25d6a --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingResponse.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.corpora; + +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class RequestIndexingResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode; + + @SafeParceled(1) + public final Status status; + + @SafeParceled(2) + public final boolean scheduledIndexing; + + private RequestIndexingResponse() { + status = null; + scheduledIndexing = false; + } + + public RequestIndexingResponse(Status status, boolean scheduledIndexing) { + this.status = status; + this.scheduledIndexing = scheduledIndexing; + } + + public static Creator CREATOR = new AutoCreator(RequestIndexingResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java new file mode 100644 index 0000000..6cc364e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class GetCurrentExperimentIdsRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + public static final Creator CREATOR = new AutoCreator(GetCurrentExperimentIdsRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java new file mode 100644 index 0000000..6fa3ef7 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +import java.util.Arrays; + +public class GetCurrentExperimentIdsResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final Status status; + + @SafeParceled(2) + public final int[] experimentIds; + + private GetCurrentExperimentIdsResponse() { + status = null; + experimentIds = null; + } + + public GetCurrentExperimentIdsResponse(Status status, int[] experimentIds) { + this.status = status; + this.experimentIds = experimentIds; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GetCurrentExperimentIdsResponse{"); + sb.append("status=").append(status); + sb.append(", experimentIds=").append(Arrays.toString(experimentIds)); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(GetCurrentExperimentIdsResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java new file mode 100644 index 0000000..6c06261 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class GetGlobalSearchSourcesRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public boolean bool; + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GetGlobalSearchSourcesRequest{"); + sb.append("bool=").append(bool); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(GetGlobalSearchSourcesRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java new file mode 100644 index 0000000..3aa8e3b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import android.os.Parcelable; + +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +import java.util.Arrays; + +public class GetGlobalSearchSourcesResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final Status status; + + @SafeParceled(2) + public final Parcelable[] sources; + + private GetGlobalSearchSourcesResponse() { + status = null; + sources = null; + } + + public GetGlobalSearchSourcesResponse(Status status, Parcelable[] sources) { + this.status = status; + this.sources = sources; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GetGlobalSearchSourcesResponse{"); + sb.append("status=").append(status); + sb.append(", sources=").append(Arrays.toString(sources)); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(GetGlobalSearchSourcesResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java new file mode 100644 index 0000000..3df0a0c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class GetPendingExperimentIdsRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + public static final Creator CREATOR = new AutoCreator(GetPendingExperimentIdsRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java new file mode 100644 index 0000000..cd98184 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +import java.util.Arrays; + +public class GetPendingExperimentIdsResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final Status status; + + @SafeParceled(2) + public final int[] experimentIds; + + private GetPendingExperimentIdsResponse() { + status = null; + experimentIds = null; + } + + public GetPendingExperimentIdsResponse(Status status, int[] experimentIds) { + this.status = status; + this.experimentIds = experimentIds; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GetPendingExperimentIdsResponse{"); + sb.append("status=").append(status); + sb.append(", experimentIds=").append(Arrays.toString(experimentIds)); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(GetPendingExperimentIdsResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java new file mode 100644 index 0000000..dd6982f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +import java.util.Arrays; + +public class SetExperimentIdsRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public byte[] experimentIds; + + @SafeParceled(2) + public boolean enable; + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SetExperimentIdsRequest{"); + sb.append("experimentIds=").append(Arrays.toString(experimentIds)); + sb.append(", enable=").append(enable); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(SetExperimentIdsRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java new file mode 100644 index 0000000..17fb679 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class SetExperimentIdsResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final Status status; + + private SetExperimentIdsResponse() { + status = null; + } + + public SetExperimentIdsResponse(Status status) { + this.status = status; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SetExperimentIdsResponse{"); + sb.append("status=").append(status); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(SetExperimentIdsResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java new file mode 100644 index 0000000..4e4fe7b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class SetIncludeInGlobalSearchRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public String packageName; + + @SafeParceled(2) + public String source; + + @SafeParceled(3) + public boolean enabled; + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SetIncludeInGlobalSearchRequest{"); + sb.append("packageName='").append(packageName).append('\''); + sb.append(", source='").append(source).append('\''); + sb.append(", enabled=").append(enabled); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(SetIncludeInGlobalSearchRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java new file mode 100644 index 0000000..c967103 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.global; + +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class SetIncludeInGlobalSearchResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final Status status; + + private SetIncludeInGlobalSearchResponse() { + status = null; + } + + public SetIncludeInGlobalSearchResponse(Status status) { + this.status = status; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SetIncludeInGlobalSearchResponse{"); + sb.append("status=").append(status); + sb.append('}'); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(SetIncludeInGlobalSearchResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryRequest.java new file mode 100644 index 0000000..b3f42a2 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryRequest.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.queries; + +import com.google.android.gms.appdatasearch.QuerySpecification; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +import java.util.Arrays; + +public class QueryRequest extends AutoSafeParcelable { + + @SafeParceled(1000) + public int versionCode = 1; + @SafeParceled(1) + public String searchString; + @SafeParceled(2) + public String packageName; + @SafeParceled(3) + public String[] corpora; + @SafeParceled(4) + public int d; + @SafeParceled(5) + public int e; + @SafeParceled(6) + public QuerySpecification spec; + + @Override + public String toString() { + return "QueryRequest{" + + "versionCode=" + versionCode + + ", searchString='" + searchString + '\'' + + ", packageName='" + packageName + '\'' + + ", corpora=" + Arrays.toString(corpora) + + ", d=" + d + + ", e=" + e + + ", spec=" + spec + + '}'; + } + + public static Creator CREATOR = new AutoCreator(QueryRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java new file mode 100644 index 0000000..a3f1ce5 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.gms.search.queries; + +import com.google.android.gms.appdatasearch.SearchResults; +import com.google.android.gms.common.api.Status; + +import org.microg.safeparcel.AutoSafeParcelable; +import org.microg.safeparcel.SafeParceled; + +public class QueryResponse extends AutoSafeParcelable { + + @SafeParceled(1000) + private int versionCode = 1; + + @SafeParceled(1) + public final Status status; + + @SafeParceled(2) + public final SearchResults results; + + private QueryResponse() { + status = null; + results = null; + } + + public QueryResponse(Status status, SearchResults results) { + this.status = status; + this.results = results; + } + + public static Creator CREATOR = new AutoCreator(QueryResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocation/PlaceCandidate.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocation/PlaceCandidate.java new file mode 100644 index 0000000..170f573 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocation/PlaceCandidate.java @@ -0,0 +1,138 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocation; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class PlaceCandidate extends AbstractSafeParcelable { + + @Field(1) + public Identifier identifier; + @Field(2) + public int confidence; + @Field(3) + public float distance; + @Field(4) + public float accuracy; + @Field(5) + public Point point; + @Field(6) + public boolean isLocationCandidate; + @Field(7) + public boolean isLocationCandidateVerified; + @Field(8) + public double latitude; + + public PlaceCandidate() { + } + + @Constructor + public PlaceCandidate(@Param(1) Identifier identifier, @Param(2) int confidence, @Param(3) float distance, @Param(4) float accuracy, @Param(5) Point point, @Param(6) boolean isLocationCandidate, @Param(7) boolean isLocationCandidateVerified, @Param(8) double latitude){ + this.identifier = identifier; + this.confidence = confidence; + this.distance = distance; + this.accuracy = accuracy; + this.point = point; + this.isLocationCandidate = isLocationCandidate; + this.isLocationCandidateVerified = isLocationCandidateVerified; + this.latitude = latitude; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PlaceCandidate.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("PlaceCandidate") + .field("identifier", identifier) + .field("confidence", confidence) + .field("distance", distance) + .field("accuracy", accuracy) + .field("point", point) + .field("isLocationCandidate", isLocationCandidate) + .field("isLocationCandidateVerified", isLocationCandidateVerified) + .field("latitude", latitude) + .end(); + } + + public static class Identifier extends AbstractSafeParcelable { + @Field(1) + public Long start; + @Field(2) + public Long end; + + public Identifier() { + } + + @Constructor + public Identifier(@Param(1) Long start, @Param(1) Long end) { + this.start = start; + this.end = end; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(Identifier.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("PlaceCandidate.Identifier") + .field("start", start) + .field("end", end) + .end(); + } + } + + public static class Point extends AbstractSafeParcelable { + @Field(1) + public int pointX; + @Field(2) + public int pointY; + + public Point() { + } + + @Constructor + public Point(@Param(1) int pointX, @Param(1) int pointY) { + this.pointX = pointX; + this.pointY = pointY; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(Point.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("PlaceCandidate.Point") + .field("pointX", pointX) + .field("pointY", pointY) + .end(); + } + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.java new file mode 100644 index 0000000..65ee137 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationEventRequest.java @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocation; + + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class SemanticLocationEventRequest extends AbstractSafeParcelable { + @Field(1) + public final float position; + + @Constructor + public SemanticLocationEventRequest(@Param(1) float position) { + this.position = position; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(SemanticLocationEventRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.java new file mode 100644 index 0000000..3dc753e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocation/internal/SemanticLocationParameters.java @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.semanticlocation.internal; + +import android.accounts.Account; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class SemanticLocationParameters extends AbstractSafeParcelable { + @Field(1) + public final Account account; + @Field(2) + public final String clientIdentifier; + @Field(3) + public final String packageName; + + @Constructor + public SemanticLocationParameters(@Param(1) Account account, @Param(2) String clientIdentifier, @Param(3) String packageName) { + this.account = account; + this.clientIdentifier = clientIdentifier; + this.packageName = packageName; + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(SemanticLocationParameters.class); + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FieldMask.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FieldMask.java new file mode 100644 index 0000000..511c453 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FieldMask.java @@ -0,0 +1,46 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +import java.util.List; + +@SafeParcelable.Class +public class FieldMask extends AbstractSafeParcelable { + + @Field(1) + public List list; + + public FieldMask() { + } + + @Constructor + public FieldMask(@Param(1) List list) { + this.list = list; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FieldMask.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("FieldMask").field("list", list).end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentPlace.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentPlace.java new file mode 100644 index 0000000..2cf4555 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentPlace.java @@ -0,0 +1,93 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import com.google.android.gms.semanticlocation.PlaceCandidate; + +import org.microg.gms.utils.ToStringHelper; + +import java.util.List; + +@SafeParcelable.Class +public class FrequentPlace extends AbstractSafeParcelable { + + @Field(1) + public PlaceCandidate.Identifier identifier; + @Field(2) + public PlaceCandidate.Point point; + @Field(3) + public int type; + @Field(4) + public FrequentPlaceMetadata placeMetadata; + @Field(5) + public List keys; + + public FrequentPlace() { + } + + @Constructor + public FrequentPlace(@Param(1) PlaceCandidate.Identifier identifier, @Param(2) PlaceCandidate.Point point, @Param(3) int type, @Param(4) FrequentPlaceMetadata placeMetadata, @Param(5) List keys){ + this.identifier = identifier; + this.point = point; + this.type = type; + this.placeMetadata = placeMetadata; + this.keys = keys; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FrequentPlace.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("FrequentPlace") + .field("identifier", identifier) + .field("point", point) + .field("type", type) + .field("placeMetadata", placeMetadata) + .field("keys", keys) + .end(); + } + + public static class FrequentPlaceMetadata extends AbstractSafeParcelable { + @Field(1) + public long timestamp; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FrequentPlace.FrequentPlaceMetadata.class); + + public FrequentPlaceMetadata() {} + + @Constructor + public FrequentPlaceMetadata(@Param(1) long timestamp) { + this.timestamp = timestamp; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("FrequentPlace.FrequentPlaceMetadata") + .field("timestamp", timestamp) + .end(); + } + } + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentTrip.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentTrip.java new file mode 100644 index 0000000..ccacd1a --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/FrequentTrip.java @@ -0,0 +1,127 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import com.google.android.gms.semanticlocation.PlaceCandidate; + +import org.microg.gms.utils.ToStringHelper; + +import java.util.List; + +@SafeParcelable.Class +public class FrequentTrip extends AbstractSafeParcelable { + + @Field(1) + public List identifierList; + @Field(2) + public Metadata placeMetadata; + @Field(3) + public List keys; + @Field(4) + public List modeDistributionList; + @Field(5) + public int type; + @Field(6) + public int tripType; + @Field(7) + public int tripMode; + @Field(8) + public float distance; + @Field(9) + public int distanceUnit; + + public FrequentTrip() { + } + + @Constructor + public FrequentTrip(@Param(1) List identifierList, @Param(2) Metadata placeMetadata, @Param(3) List keys, @Param(4) List modeDistributionList, @Param(5) int type, @Param(6) int tripType, @Param(7) int tripMode, @Param(8) float distance, @Param(9) int distanceUnit) { + this.identifierList = identifierList; + this.placeMetadata = placeMetadata; + this.keys = keys; + this.modeDistributionList = modeDistributionList; + this.type = type; + this.tripType = tripType; + this.tripMode = tripMode; + this.distance = distance; + this.distanceUnit = distanceUnit; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FrequentTrip.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("FrequentTrip").field("identifierList", identifierList).field("placeMetadata", placeMetadata).field("keys", keys).field("modeDistributionList", modeDistributionList).field("type", type).field("tripType", tripType).field("tripMode", tripMode).field("distance", distance).field("distanceUnit", distanceUnit).end(); + } + + public static class Metadata extends AbstractSafeParcelable { + @Field(1) + public long timestamp; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FrequentTrip.Metadata.class); + + public Metadata() { + } + + @Constructor + public Metadata(@Param(1) long timestamp) { + this.timestamp = timestamp; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("FrequentTrip.Metadata").field("timestamp", timestamp).end(); + } + } + + public static class ModeDistribution extends AbstractSafeParcelable { + @Field(1) + public int distance; + @Field(2) + public float confidence; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FrequentTrip.ModeDistribution.class); + + public ModeDistribution() { + } + + @Constructor + public ModeDistribution(@Param(1) int distance, @Param(2) float confidence) { + this.distance = distance; + this.confidence = confidence; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("FrequentTrip.Metadata").field("distance", distance).field("confidence", confidence).end(); + } + } + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/InferredPlace.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/InferredPlace.java new file mode 100644 index 0000000..b12290d --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/InferredPlace.java @@ -0,0 +1,55 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import com.google.android.gms.semanticlocation.PlaceCandidate; + +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class InferredPlace extends AbstractSafeParcelable { + + @Field(1) + public PlaceCandidate.Identifier identifier; + @Field(2) + public PlaceCandidate.Point point; + @Field(3) + public int inferredPlaceType; + + public InferredPlace() { + } + + @Constructor + public InferredPlace(@Param(1) PlaceCandidate.Identifier identifier, @Param(2) PlaceCandidate.Point point, @Param(3) int inferredPlaceType) { + this.identifier = identifier; + this.point = point; + this.inferredPlaceType = inferredPlaceType; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(InferredPlace.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("InferredPlace") + .field("identifier", identifier) + .field("point", point) + .field("inferredPlaceType", inferredPlaceType) + .end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.java new file mode 100644 index 0000000..4dcca6d --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegment.java @@ -0,0 +1,74 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class LocationHistorySegment extends AbstractSafeParcelable { + + @Field(1) + public long startTime; + @Field(2) + public long endTime; + @Field(3) + public int unknownFiled3; + @Field(4) + public int unknownFiled4; + @Field(7) + public String function; + @Field(8) + public int unknownFiled8; + @Field(12) + public int unknownFiled12; + @Field(13) + public int unknownFiled13; + + public LocationHistorySegment() { + } + + @Constructor + public LocationHistorySegment(@Param(1) long startTime, @Param(2) long endTime, @Param(3) int unknownFiled3, @Param(4) int unknownFiled4, @Param(7) String function, @Param(8) int unknownFiled8 , @Param(12) int unknownFiled12, @Param(13) int unknownFiled13){ + this.startTime = startTime; + this.endTime = endTime; + this.unknownFiled3 = unknownFiled3; + this.unknownFiled4 = unknownFiled4; + this.function = function; + this.unknownFiled8 = unknownFiled8; + this.unknownFiled12 = unknownFiled12; + this.unknownFiled13 = unknownFiled13; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationHistorySegment.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("LocationHistorySegment") + .field("startTime", startTime) + .field("endTime", endTime) + .field("unknownFiled3", unknownFiled3) + .field("unknownFiled4", unknownFiled4) + .field("unknownFiled7", function) + .field("unknownFiled8", unknownFiled8) + .field("unknownFiled12", unknownFiled12) + .field("unknownFiled13", unknownFiled13) + .end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.java new file mode 100644 index 0000000..be11802 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LocationHistorySegmentRequest.java @@ -0,0 +1,52 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +import java.util.List; + +@SafeParcelable.Class +public class LocationHistorySegmentRequest extends AbstractSafeParcelable { + + @Field(1) + public List list; + @Field(2) + public FieldMask fieldMask; + @Field(3) + public boolean status; + + public LocationHistorySegmentRequest() { + } + + @Constructor + public LocationHistorySegmentRequest(@Param(1) List list, @Param(2) FieldMask fieldMask, @Param(3) boolean status) { + this.list = list; + this.fieldMask = fieldMask; + this.status = status; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationHistorySegmentRequest.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("LocationHistorySegmentRequest").field("list", list).field("fieldMask", fieldMask).field("status", status).end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LookupParameters.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LookupParameters.java new file mode 100644 index 0000000..73e57af --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/LookupParameters.java @@ -0,0 +1,64 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class LookupParameters extends AbstractSafeParcelable { + + @Field(1) + public int index; + @Field(2) + public String tag; + @Field(3) + public TimeRangeFilter timeRangeFilter; + @Field(4) + public boolean check; + @Field(5) + public Integer start; + @Field(6) + public Integer end; + + public LookupParameters() { + } + + public LookupParameters(@Param(1) int index, @Param(2) String tag, @Param(3) TimeRangeFilter timeRangeFilter, @Param(4) boolean check, @Param(5) Integer start, @Param(6) Integer end){ + this.index = index; + this.tag = tag; + this.timeRangeFilter = timeRangeFilter; + this.check = check; + this.start = start; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LookupParameters.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("LookupParameters") + .field("index", index) + .field("tag", tag) + .field("timeRangeFilter", timeRangeFilter) + .field("check", check) + .field("start", start) + .field("end", end) + .end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/Persona.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/Persona.java new file mode 100644 index 0000000..a439eee --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/Persona.java @@ -0,0 +1,237 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import com.google.android.gms.semanticlocation.PlaceCandidate; + +import org.microg.gms.utils.ToStringHelper; + +import java.util.List; + +@SafeParcelable.Class +public class Persona extends AbstractSafeParcelable { + + @Field(1) + public PersonaMetadata personaMetadata; + @Field(2) + public List locationAffinityList; + @Field(3) + public List travelModeAffinityList; + + public Persona() { + } + + @Constructor + public Persona(@Param(1) PersonaMetadata personaMetadata, @Param(2) List locationAffinityList, @Param(3) List travelModeAffinityList){ + this.personaMetadata = personaMetadata; + this.locationAffinityList = locationAffinityList; + this.travelModeAffinityList = travelModeAffinityList; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(Persona.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("Persona") + .field("personaMetadata", personaMetadata) + .field("locationAffinityList", locationAffinityList) + .field("travelModeAffinityList", travelModeAffinityList) + .end(); + } + + public static class LocationAffinity extends AbstractSafeParcelable { + @Field(1) + public PlaceCandidate.Identifier identifier; + @Field(2) + public float confidence; + @Field(3) + public long timestamp; + @Field(4) + public float distance; + @Field(5) + public float accuracy; + @Field(6) + public float distanceToLocation; + + public LocationAffinity() {} + + @Constructor + public LocationAffinity(@Param(1) PlaceCandidate.Identifier identifier, @Param(2) float confidence, @Param(3) long timestamp, @Param(4) float distance, @Param(5) float accuracy, @Param(6) float distanceToLocation) { + this.identifier = identifier; + this.confidence = confidence; + this.timestamp = timestamp; + this.distance = distance; + this.accuracy = accuracy; + this.distanceToLocation = distanceToLocation; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LocationAffinity.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("Persona.LocationAffinity") + .field("identifier", identifier) + .field("confidence", confidence) + .field("timestamp", timestamp) + .field("distance", distance) + .field("accuracy", accuracy) + .field("distanceToLocation", distanceToLocation) + .end(); + } + } + + public static class PersonaMetadata extends AbstractSafeParcelable { + @Field(1) + public long timestamp; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PersonaMetadata.class); + + public PersonaMetadata() {} + + @Constructor + public PersonaMetadata(@Param(1) long timestamp) { + this.timestamp = timestamp; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("Persona.PersonaMetadata") + .field("timestamp", timestamp) + .end(); + } + } + + public static class TripSummary extends AbstractSafeParcelable { + @Field(1) + public float distance; + @Field(2) + public float duration; + @Field(3) + public long timestamp; + @Field(4) + public long endTime; + @Field(5) + public int tripType; + @Field(6) + public int tripMode; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(TripSummary.class); + + public TripSummary() {} + + @Constructor + public TripSummary(@Param(1) float distance, @Param(2) float duration, @Param(3) long timestamp, @Param(4) long endTime, @Param(5) int tripType, @Param(6) int tripMode) { + this.distance = distance; + this.duration = duration; + this.timestamp = timestamp; + this.endTime = endTime; + this.tripType = tripType; + this.tripMode = tripMode; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("Persona.TripSummary") + .field("distance", distance) + .field("duration", duration) + .field("timestamp", timestamp) + .field("endTime", endTime) + .field("tripType", tripType) + .field("tripMode", tripMode) + .end(); + } + } + + public static class TravelModeAffinity extends AbstractSafeParcelable { + @Field(1) + public int distance; + @Field(2) + public float confidence; + @Field(3) + public int travelMode; + @Field(4) + public int travelModeAffinity; + @Field(5) + public int tripType; + @Field(6) + public int tripMode; + @Field(7) + public TripSummary tripSummary; + @Field(8) + public TripSummary tripSummary2; + @Field(9) + public TripSummary tripSummary3; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(TravelModeAffinity.class); + + public TravelModeAffinity() {} + + @Constructor + public TravelModeAffinity(@Param(1) int distance, @Param(2) float confidence, @Param(3) int travelMode, @Param(4) int travelModeAffinity, @Param(5) int tripType, @Param(6) int tripMode, @Param(7) TripSummary tripSummary, @Param(8) TripSummary tripSummary2, @Param(9) TripSummary tripSummary3) { + this.distance = distance; + this.confidence = confidence; + this.travelMode = travelMode; + this.travelModeAffinity = travelModeAffinity; + this.tripType = tripType; + this.tripMode = tripMode; + this.tripSummary = tripSummary; + this.tripSummary2 = tripSummary2; + this.tripSummary3 = tripSummary3; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("Persona.TravelModeAffinity") + .field("distance", distance) + .field("confidence", confidence) + .field("travelMode", travelMode) + .field("travelModeAffinity", travelModeAffinity) + .field("tripType", tripType) + .field("tripMode", tripMode) + .field("tripSummary", tripSummary) + .field("tripSummary2", tripSummary2) + .field("tripSummary3", tripSummary3) + .end(); + } + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/RequestCredentials.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/RequestCredentials.java new file mode 100644 index 0000000..9c97b87 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/RequestCredentials.java @@ -0,0 +1,52 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.accounts.Account; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + + +@SafeParcelable.Class +public class RequestCredentials extends AbstractSafeParcelable { + + @Field(1) + public Account account; + @Field(2) + public String function; + @Field(3) + public String packageName; + + public RequestCredentials() { + } + + @Constructor + public RequestCredentials(@Param(1) Account account, @Param(2) String function, @Param(3) String packageName) { + this.account = account; + this.function = function; + this.packageName = packageName; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(RequestCredentials.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("RequestCredentials").field("account", account.name).field("function", function).field("packageName", packageName).end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.java new file mode 100644 index 0000000..8604f8c --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/TimeRangeFilter.java @@ -0,0 +1,47 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +public class TimeRangeFilter extends AbstractSafeParcelable { + + @Field(1) + public Long startTime; + @Field(2) + public Long endTime; + + public TimeRangeFilter() { + } + + @Constructor + public TimeRangeFilter(@Param(1) Long startTime, @Param(1) Long endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(TimeRangeFilter.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("TimeRangeFilter").field("startTime", startTime).field("endTime", endTime).end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/UserLocationProfile.java b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/UserLocationProfile.java new file mode 100644 index 0000000..7272f2e --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/semanticlocationhistory/UserLocationProfile.java @@ -0,0 +1,60 @@ +/** + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.semanticlocationhistory; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.utils.ToStringHelper; + +import java.util.List; + +@SafeParcelable.Class +public class UserLocationProfile extends AbstractSafeParcelable { + + @Field(1) + public List frequentPlaceList; + @Field(2) + public List frequentTripList; + @Field(3) + public Persona persona; + @Field(4) + public long timestamp; + + public UserLocationProfile() { + } + + @Constructor + public UserLocationProfile(@Param(1) List frequentPlaceList, @Param(2) List frequentTripList, @Param(3) Persona persona, @Param(4) long timestamp) { + this.frequentPlaceList = frequentPlaceList; + this.frequentTripList = frequentTripList; + this.persona = persona; + this.timestamp = timestamp; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(UserLocationProfile.class); + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("UserLocationProfile") + .field("frequentPlaceList", frequentPlaceList) + .field("frequentTripList", frequentTripList) + .field("persona", persona) + .field("timestamp", timestamp) + .end(); + } +} diff --git a/play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java b/play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java new file mode 100644 index 0000000..0e7ec10 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.usagereporting; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UsageReportingOptInOptions extends AutoSafeParcelable { + @Field(2) + public int optInUsageReporting; + + public static final Creator CREATOR = new AutoCreator<>(UsageReportingOptInOptions.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenRequest.java b/play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenRequest.java new file mode 100644 index 0000000..e0f8559 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenRequest.java @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.wallet; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class GetClientTokenRequest extends AbstractSafeParcelable { + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetClientTokenRequest.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenResponse.java b/play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenResponse.java new file mode 100644 index 0000000..2d3a8a9 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/wallet/GetClientTokenResponse.java @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2025 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.wallet; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class GetClientTokenResponse extends AbstractSafeParcelable { + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetClientTokenResponse.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayRequest.java b/play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayRequest.java new file mode 100644 index 0000000..2f9fde8 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayRequest.java @@ -0,0 +1,161 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 AND CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.wallet; + +import org.microg.gms.common.PublicApi; +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * A Parcelable request that can optionally be passed to {@link PaymentsClient#isReadyToPay(IsReadyToPayRequest)} to specify additional filtering criteria for determining if a user is considered ready to pay. + */ +@PublicApi +public class IsReadyToPayRequest extends AutoSafeParcelable { + @Field(value = 2, useDirectList = true) + private ArrayList allowedCardNetworks; + @Field(4) + private String unknown4; + @Field(5) + private String unknown5; + @Field(value = 6, useDirectList = true) + private ArrayList allowedPaymentMethods; + @Field(7) + private boolean existingPaymentMethodRequired; + @Field(8) + private String json; + + private IsReadyToPayRequest() { + } + + private IsReadyToPayRequest(String json) { + this.json = json; + } + + /** + * Constructs {@link IsReadyToPayRequest} from a JSON object serialized as a string. + *

+ * To convert back to a JSON object serialized as string use {@link #toJson()}. + *

+ * Note that you shouldn't rely on the values returned by getters in {@link IsReadyToPayRequest} as they will not be populated with the data set in the given JSON. + *

+ * Note that this will be {@code null} if this request was not constructed using {@link #fromJson(String)}. + *

+ * For the expected format of this JSON, please see IsReadyToPayRequest object reference documentation. + */ + public String toJson() { + return json; + } + + /** + * @return the {@link WalletConstants.CardNetwork} that will be used to filter the instruments deemed acceptable by {@link PaymentsClient#isReadyToPay(IsReadyToPayRequest)}. If not explicitly set, the default supported networks will be {@link WalletConstants#CARD_NETWORK_AMEX}, {@link WalletConstants#CARD_NETWORK_DISCOVER}, {@link WalletConstants#CARD_NETWORK_MASTERCARD}, and {@link WalletConstants#CARD_NETWORK_VISA}. + * @deprecated Use the JSON request format instead, see {@link #fromJson(String)}. + */ + public ArrayList getAllowedCardNetworks() { + return allowedCardNetworks; + } + + /** + * @return the supported payment credential types defined in {@link WalletConstants.PaymentMethod}, or {@code null} if no restrictions were specified. + * @deprecated Use the JSON request format instead, see {@link #fromJson(String)}. + */ + public ArrayList getAllowedPaymentMethods() { + return allowedPaymentMethods; + } + + /** + * @return whether or not IsReadyToPay will be determined by the user having an existing payment method that matches the other criteria specified in the IsReadyToPayRequest. + * @deprecated Use the JSON request format instead, see {@link #fromJson(String)}. + */ + public boolean isExistingPaymentMethodRequired() { + return existingPaymentMethodRequired; + } + + /** + * Builder for creating an {@link IsReadyToPayRequest}. + * + * @deprecated Use the JSON request format instead, see {@link #fromJson(String)}. + */ + public class Builder { + /** + * Adds a card network for cards allowed in the purchase. See {@link WalletConstants.CardNetwork} for available options. If not explicitly set via this or {@link #addAllowedCardNetworks(Collection)}, the default supported networks will be {@link WalletConstants#CARD_NETWORK_AMEX}, {@link WalletConstants#CARD_NETWORK_DISCOVER}, {@link WalletConstants#CARD_NETWORK_MASTERCARD}, and {@link WalletConstants#CARD_NETWORK_VISA}. + */ + public Builder addAllowedCardNetwork(int allowedCardNetwork) { + if (allowedCardNetworks == null) allowedCardNetworks = new ArrayList<>(); + allowedCardNetworks.add(allowedCardNetwork); + return this; + } + + /** + * Adds a collection of card networks for cards allowed in the purchase. See {@link WalletConstants.CardNetwork} for available options. If not explicitly set via this or {@link #addAllowedCardNetwork(int)}, the default supported networks will be {@link WalletConstants#CARD_NETWORK_AMEX}, {@link WalletConstants#CARD_NETWORK_DISCOVER}, {@link WalletConstants#CARD_NETWORK_MASTERCARD}, and {@link WalletConstants#CARD_NETWORK_VISA}. + */ + public Builder addAllowedCardNetworks(Collection allowedCardNetworks) { + if (IsReadyToPayRequest.this.allowedCardNetworks == null) + IsReadyToPayRequest.this.allowedCardNetworks = new ArrayList<>(); + IsReadyToPayRequest.this.allowedCardNetworks.addAll(allowedCardNetworks); + return this; + } + + /** + * Adds an allowed payment method. See {@link WalletConstants.PaymentMethod} for available options. If not explicitly set via this or {@link #addAllowedPaymentMethods(Collection)}, then the default allowed payment method will be {@link WalletConstants#PAYMENT_METHOD_TOKENIZED_CARD}. + */ + public Builder addAllowedPaymentMethod(int allowedPaymentMethod) { + if (allowedPaymentMethods == null) allowedPaymentMethods = new ArrayList<>(); + allowedPaymentMethods.add(allowedPaymentMethod); + return this; + } + + /** + * Adds a collection of allowed payment methods. See {@link WalletConstants.PaymentMethod} for available options. If not explicitly set via this or {@link #addAllowedPaymentMethod(int)}, then the default allowed payment method will be {@link WalletConstants#PAYMENT_METHOD_TOKENIZED_CARD}. + */ + public Builder addAllowedPaymentMethods(Collection allowedPaymentMethods) { + if (IsReadyToPayRequest.this.allowedPaymentMethods == null) + IsReadyToPayRequest.this.allowedPaymentMethods = new ArrayList<>(); + IsReadyToPayRequest.this.allowedPaymentMethods.addAll(allowedPaymentMethods); + return this; + } + + /** + * @return The actual {@link IsReadyToPayRequest} created using the data passed to the Builder object. + */ + public IsReadyToPayRequest build() { + return IsReadyToPayRequest.this; + } + + /** + * If set to true, then IsReadyToPay will only return true if the user has an existing payment method that matches the other criteria specified in the IsReadyToPayRequest. + *

+ * If you set this to true, make sure to call {@link PaymentsClient#isReadyToPay(IsReadyToPayRequest)} as early as possible in your flow as the call may take longer to resolve due to the extra check for an existing payment method. + */ + public Builder setExistingPaymentMethodRequired(boolean existingPaymentMethodRequired) { + IsReadyToPayRequest.this.existingPaymentMethodRequired = existingPaymentMethodRequired; + return this; + } + } + + public static final Creator CREATOR = new AutoCreator<>(IsReadyToPayRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayResponse.java b/play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayResponse.java new file mode 100644 index 0000000..96b0240 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/wallet/IsReadyToPayResponse.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.wallet; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class IsReadyToPayResponse extends AutoSafeParcelable { + @Field(1) + public boolean result; + @Field(2) + public String json; + + private IsReadyToPayResponse() { + } + + public IsReadyToPayResponse(boolean result, String json) { + this.result = result; + this.json = json; + } + + public static final Creator CREATOR = new AutoCreator<>(IsReadyToPayResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/wallet/WalletConstants.java b/play-services-api/src/main/java/com/google/android/gms/wallet/WalletConstants.java new file mode 100644 index 0000000..0e3e205 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/wallet/WalletConstants.java @@ -0,0 +1,117 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 AND CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.wallet; + +import org.microg.gms.common.PublicApi; + +/** + * Collection of constant values used by the ClientLibrary. + */ +@PublicApi +public class WalletConstants { + /** + * Credit card networks. Different APIs may support only a subset of these. + *

+ * Available options: + *

    + *
  • {@link #CARD_NETWORK_AMEX}
  • + *
  • {@link #CARD_NETWORK_DISCOVER}
  • + *
  • {@link #CARD_NETWORK_JCB}
  • + *
  • {@link #CARD_NETWORK_MASTERCARD}
  • + *
  • {@link #CARD_NETWORK_VISA}
  • + *
  • {@link #CARD_NETWORK_INTERAC}
  • + *
  • {@link #CARD_NETWORK_OTHER}
  • + *
+ * When used with Google Pay, the following networks use EMV cryptograms instead of 3DS cryptograms as part of the payment credentials: + *
    + *
  • {@link #CARD_NETWORK_INTERAC}
  • + *
+ */ + public @interface CardNetwork { + /** + * @deprecated Use {@link #CARD_NETWORK_AMEX} instead. + */ + int AMEX = 1; + /** + * @deprecated Use {@link #CARD_NETWORK_DISCOVER} instead. + */ + int DISCOVER = 2; + /** + * @deprecated Use {@link #CARD_NETWORK_JCB} instead. + */ + int JCB = 3; + /** + * @deprecated Use {@link #CARD_NETWORK_MASTERCARD} instead. + */ + int MASTERCARD = 4; + /** + * @deprecated Use {@link #CARD_NETWORK_VISA} instead. + */ + int VISA = 5; + /** + * @deprecated Use {@link #CARD_NETWORK_INTERAC} instead. + */ + int INTERAC = 6; + /** + * @deprecated Use {@link #CARD_NETWORK_OTHER} instead. + */ + int OTHER = 1000; + } + + /** + * The payment methods you support. + *

+ * Available options: + *

    + *
  • {@link #PAYMENT_METHOD_UNKNOWN}
  • + *
  • {@link #PAYMENT_METHOD_CARD}
  • + *
  • {@link #PAYMENT_METHOD_TOKENIZED_CARD}
  • + *
+ * Note {@link WalletConstants.PaymentMethod} is different from {@link PaymentMethodTokenizationType}, which identifies how you want to receive the returned payment credential. + */ + public @interface PaymentMethod { + } + + /** + * Payment method tokenization types. + *

+ * Available options: + *

    + *
  • {@link #PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY}
  • + *
  • {@link #PAYMENT_METHOD_TOKENIZATION_TYPE_NETWORK_TOKEN}
  • + *
  • {@link #PAYMENT_METHOD_TOKENIZATION_TYPE_DIRECT}
  • + *
+ * Integrator can configure {@link PaymentDataRequest} to tokenize the credit card selected by the buyer for a transaction using one of the tokenization types listed above. The token for the selected payment method can be retrieved by calling {@link PaymentData#getPaymentMethodToken()}. + */ + public @interface PaymentMethodTokenizationType { + } + + + public static final int CARD_CLASS_CREDIT = 1; + public static final int CARD_CLASS_DEBIT = 2; + public static final int CARD_CLASS_PREPAID = 3; + public static final int CARD_CLASS_UNKNOWN = 0; + + public static final int CARD_NETWORK_AMEX = 1; + public static final int CARD_NETWORK_DISCOVER = 2; + public static final int CARD_NETWORK_INTERAC = 6; + public static final int CARD_NETWORK_JCB = 3; + public static final int CARD_NETWORK_MASTERCARD = 4; + public static final int CARD_NETWORK_OTHER = 1000; + public static final int CARD_NETWORK_VISA = 5; + + public static final int PAYMENT_METHOD_CARD = 1; + public static final int PAYMENT_METHOD_TOKENIZED_CARD = 2; + public static final int PAYMENT_METHOD_UNKNOWN = 0; + + + public static final int PAYMENT_METHOD_TOKENIZATION_TYPE_DIRECT = 3; + public static final int PAYMENT_METHOD_TOKENIZATION_TYPE_NETWORK_TOKEN = 2; + public static final int PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY = 1; +} diff --git a/play-services-api/src/main/java/com/google/firebase/database/connection/idl/CompoundHashParcelable.java b/play-services-api/src/main/java/com/google/firebase/database/connection/idl/CompoundHashParcelable.java new file mode 100644 index 0000000..4b72c85 --- /dev/null +++ b/play-services-api/src/main/java/com/google/firebase/database/connection/idl/CompoundHashParcelable.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.database.connection.idl; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class CompoundHashParcelable extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator(CompoundHashParcelable.class); +} diff --git a/play-services-api/src/main/java/com/google/firebase/database/connection/idl/ConnectionConfig.java b/play-services-api/src/main/java/com/google/firebase/database/connection/idl/ConnectionConfig.java new file mode 100644 index 0000000..290467b --- /dev/null +++ b/play-services-api/src/main/java/com/google/firebase/database/connection/idl/ConnectionConfig.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.database.connection.idl; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ConnectionConfig extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator(ConnectionConfig.class); +} diff --git a/play-services-api/src/main/java/com/google/firebase/database/connection/idl/RangeParcelable.java b/play-services-api/src/main/java/com/google/firebase/database/connection/idl/RangeParcelable.java new file mode 100644 index 0000000..cfd0fd7 --- /dev/null +++ b/play-services-api/src/main/java/com/google/firebase/database/connection/idl/RangeParcelable.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013-2017 microG Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.database.connection.idl; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class RangeParcelable extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator(RangeParcelable.class); +} diff --git a/play-services-appinvite/build.gradle b/play-services-appinvite/build.gradle new file mode 100644 index 0000000..9906bcb --- /dev/null +++ b/play-services-appinvite/build.gradle @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2019 e Foundation + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' + +group = 'org.microg' + +android { + namespace "com.google.android.gms.appinvite" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + // Dependencies from play-services-appinvite:18.0.0 + api project(':play-services-base') + api project(':play-services-basement') + api project(':play-services-tasks') +// api project(':firebase-analytics') + api project(':firebase-dynamic-links') +} diff --git a/play-services-appinvite/core/build.gradle b/play-services-appinvite/core/build.gradle new file mode 100644 index 0000000..9477a7b --- /dev/null +++ b/play-services-appinvite/core/build.gradle @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'com.squareup.wire' +apply plugin: 'kotlin-android' + +dependencies { + api project(':play-services-appinvite') + implementation project(':play-services-base-core') + + implementation "androidx.appcompat:appcompat:$appcompatVersion" + + implementation "com.android.volley:volley:$volleyVersion" + implementation "com.squareup.wire:wire-runtime:$wireVersion" +} + +android { + namespace "org.microg.gms.appinvite" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } +} + +wire { + kotlin {} +} diff --git a/play-services-appinvite/core/src/main/AndroidManifest.xml b/play-services-appinvite/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4b89dcf --- /dev/null +++ b/play-services-appinvite/core/src/main/AndroidManifest.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt b/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt new file mode 100644 index 0000000..4b2872a --- /dev/null +++ b/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt @@ -0,0 +1,123 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.appinivite + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.util.Log +import android.view.ViewGroup +import android.view.Window +import android.widget.ProgressBar +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.pm.PackageInfoCompat +import androidx.core.os.bundleOf +import androidx.core.view.setPadding +import androidx.lifecycle.lifecycleScope +import com.android.volley.toolbox.Volley +import com.google.android.gms.common.internal.safeparcel.SafeParcelableSerializer +import com.google.firebase.dynamiclinks.internal.DynamicLinkData +import org.microg.gms.appinvite.MutateAppInviteLinkResponse +import org.microg.gms.appinivite.utils.DynamicLinkUtils +import org.microg.gms.utils.singleInstanceOf + +private const val TAG = "AppInviteActivity" + +private const val APPINVITE_DEEP_LINK = "com.google.android.gms.appinvite.DEEP_LINK" +private const val APPINVITE_INVITATION_ID = "com.google.android.gms.appinvite.INVITATION_ID" +private const val APPINVITE_OPENED_FROM_PLAY_STORE = "com.google.android.gms.appinvite.OPENED_FROM_PLAY_STORE" +private const val APPINVITE_REFERRAL_BUNDLE = "com.google.android.gms.appinvite.REFERRAL_BUNDLE" +private const val DYNAMIC_LINK_DATA = "com.google.firebase.dynamiclinks.DYNAMIC_LINK_DATA" + +class AppInviteActivity : AppCompatActivity() { + private val queue by lazy { singleInstanceOf { Volley.newRequestQueue(applicationContext) } } + + private val Int.px: Int get() = (this * resources.displayMetrics.density).toInt() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(ProgressBar(this).apply { + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) + setPadding(20.px) + isIndeterminate = true + }) + val extras = intent.extras + extras?.keySet() + Log.d(TAG, "Intent: $intent $extras") + if (intent?.data == null) return finish() + lifecycleScope.launchWhenStarted { + val response = DynamicLinkUtils.requestLinkResponse(intent.data.toString(), queue) ?: return@launchWhenStarted redirectToBrowser() + open(response) + } + } + + private fun redirectToBrowser() { + try { + startActivity(Intent(Intent.ACTION_VIEW).apply { + addCategory(Intent.CATEGORY_DEFAULT) + data = intent.data + }) + } catch (e: Exception) { + Log.w(TAG, e) + } + finish() + } + + private fun open(appInviteLink: MutateAppInviteLinkResponse) { + val minAppVersion = appInviteLink.data_?.app?.minAppVersion + val dynamicLinkData = DynamicLinkData(appInviteLink.metadata?.info?.url, appInviteLink.data_?.intentData, + (minAppVersion ?: 0).toInt(), System.currentTimeMillis(), null, null) + val linkPackageName = appInviteLink.data_?.packageName + val intent = Intent(Intent.ACTION_VIEW).apply { + addCategory(Intent.CATEGORY_DEFAULT) + data = appInviteLink.data_?.intentData?.let { Uri.parse(it) } + `package` = linkPackageName + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + putExtra( + APPINVITE_REFERRAL_BUNDLE, bundleOf( + APPINVITE_DEEP_LINK to appInviteLink, + APPINVITE_INVITATION_ID to "", + APPINVITE_OPENED_FROM_PLAY_STORE to false + ) + ) + putExtra(DYNAMIC_LINK_DATA, SafeParcelableSerializer.serializeToBytes(dynamicLinkData)) + } + val fallbackIntent = Intent(Intent.ACTION_VIEW).apply { + addCategory(Intent.CATEGORY_DEFAULT) + data = appInviteLink.data_?.fallbackUrl?.let { Uri.parse(it) } + } + val installedVersionCode = runCatching { + if (linkPackageName != null) { + PackageInfoCompat.getLongVersionCode(packageManager.getPackageInfo(linkPackageName, 0)) + } else { + null + } + }.getOrNull() + if (installedVersionCode != null && (minAppVersion == null || installedVersionCode >= minAppVersion)) { + val componentName = intent.resolveActivity(packageManager) + if (componentName == null) { + Log.w(TAG, "open resolve activity is null") + if (linkPackageName != null) { + val intentLaunch = + packageManager.getLaunchIntentForPackage(linkPackageName) + if (intentLaunch != null) { + intent.setComponent(intentLaunch.component) + } + } + } + startActivity(intent) + finish() + } else { + try { + startActivity(fallbackIntent) + } catch (e: Exception) { + Log.w(TAG, e) + } + finish() + } + } +} \ No newline at end of file diff --git a/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteService.kt b/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteService.kt new file mode 100644 index 0000000..8eb0ace --- /dev/null +++ b/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteService.kt @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2019 e Foundation + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package org.microg.gms.appinivite + +import android.app.Activity +import android.content.Context +import android.os.Bundle +import android.os.Parcel +import android.os.RemoteException +import android.util.Log +import com.google.android.gms.appinvite.internal.IAppInviteCallbacks +import com.google.android.gms.appinvite.internal.IAppInviteService +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.common.PackageUtils +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AppInviteService" + +class AppInviteService : BaseService(TAG, GmsService.APP_INVITE) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + PackageUtils.getAndCheckCallingPackage(this, request.packageName) + callback.onPostInitComplete(0, AppInviteServiceImpl(this, request.packageName, request.extras), null) + } +} + + +class AppInviteServiceImpl(context: Context?, packageName: String?, extras: Bundle?) : IAppInviteService.Stub() { + override fun updateInvitationOnInstall(callback: IAppInviteCallbacks, invitationId: String) { + callback.onStatus(Status.SUCCESS) + } + + override fun convertInvitation(callback: IAppInviteCallbacks, invitationId: String) { + callback.onStatus(Status.SUCCESS) + } + + override fun getInvitation(callback: IAppInviteCallbacks) { + callback.onStatusIntent(Status(Activity.RESULT_CANCELED), null) + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/utils/DynamicLinkUtils.kt b/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/utils/DynamicLinkUtils.kt new file mode 100644 index 0000000..3d16ced --- /dev/null +++ b/play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/utils/DynamicLinkUtils.kt @@ -0,0 +1,147 @@ +/** + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.appinivite.utils + +import android.content.Context +import android.os.Build.VERSION.SDK_INT +import android.os.LocaleList +import com.android.volley.NetworkResponse +import com.android.volley.ParseError +import com.android.volley.Request +import com.android.volley.Request.Method.POST +import com.android.volley.RequestQueue +import com.android.volley.Response +import com.android.volley.VolleyError +import com.android.volley.toolbox.HttpHeaderParser +import com.android.volley.toolbox.JsonRequest +import com.squareup.wire.Message +import com.squareup.wire.ProtoAdapter +import kotlinx.coroutines.CompletableDeferred +import okio.ByteString.Companion.decodeHex +import org.json.JSONException +import org.json.JSONObject +import org.microg.gms.appinvite.ClientIdInfo +import org.microg.gms.appinvite.ClientPlatform +import org.microg.gms.appinvite.LinkInfo +import org.microg.gms.appinvite.MutateAppInviteLinkRequest +import org.microg.gms.appinvite.MutateAppInviteLinkResponse +import org.microg.gms.appinvite.MutateDataRequest +import org.microg.gms.appinvite.MutateDataResponseWithError +import org.microg.gms.appinvite.MutateOperation +import org.microg.gms.appinvite.MutateOperationId +import org.microg.gms.appinvite.SystemInfo +import org.microg.gms.common.Constants +import org.microg.gms.utils.digest +import org.microg.gms.utils.getCertificates +import org.microg.gms.utils.toHexString +import java.io.UnsupportedEncodingException +import java.nio.charset.Charset +import java.util.HashMap +import java.util.Locale +import kotlin.collections.firstOrNull +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +object DynamicLinkUtils { + + suspend fun requestLinkResponse(linkUrl: String, queue: RequestQueue): MutateAppInviteLinkResponse? { + val request = ProtobufPostRequest( + "https://datamixer-pa.googleapis.com/v1/mutateonekey?alt=proto&key=AIzaSyAP-gfH3qvi6vgHZbSYwQ_XHqV_mXHhzIk", MutateOperation( + id = MutateOperationId.AppInviteLink, mutateRequest = MutateDataRequest( + appInviteLink = MutateAppInviteLinkRequest( + client = ClientIdInfo( + platform = ClientPlatform.Android, + packageName = Constants.GMS_PACKAGE_NAME, + signature = Constants.GMS_PACKAGE_SIGNATURE_SHA1.decodeHex().base64(), + language = Locale.getDefault().language + ), link = LinkInfo( + invitationId = "", uri = linkUrl + ), system = SystemInfo( + gms = SystemInfo.GmsInfo( + versionCode = Constants.GMS_VERSION_CODE + ) + ) + ) + ) + ), MutateDataResponseWithError.ADAPTER + ) + val response = try { + request.sendAndAwait(queue) + } catch (e: Exception) { + return null + } + if (response.errorStatus != null || response.dataResponse?.appInviteLink == null) return null + return response.dataResponse?.appInviteLink + } + + suspend fun requestShortLinks(context: Context, packageName: String, apiKey: String, longDynamicLink: String, queue: RequestQueue) = suspendCoroutine { con -> + queue.add(object : JsonRequest(POST, "https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=$apiKey", JSONObject().apply { + put("longDynamicLink", longDynamicLink) + }.toString(), { + con.resume(it) + }, { + con.resumeWithException(RuntimeException(it)) + }) { + override fun parseNetworkResponse(response: NetworkResponse): Response { + return try { + val jsonString = String(response.data, Charset.forName(HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET))) + Response.success(JSONObject(jsonString), null) + } catch (e: UnsupportedEncodingException) { + Response.error(ParseError(e)) + } catch (je: JSONException) { + Response.error(ParseError(je)) + } + } + + override fun getHeaders(): Map = mapOf( + "X-Android-Package" to packageName, + "X-Android-Cert" to context.packageManager.getCertificates(packageName).firstOrNull()?.digest("SHA1")?.toHexString()?.uppercase() + ) + }) + } +} + +internal class ProtobufPostRequest, O>(url: String, private val i: I, private val oAdapter: ProtoAdapter) : Request(Method.POST, url, null) { + private val deferred = CompletableDeferred() + + override fun getHeaders(): Map { + val headers = HashMap(super.getHeaders()) + headers["Accept-Language"] = if (SDK_INT >= 24) LocaleList.getDefault().toLanguageTags() else Locale.getDefault().language + headers["X-Android-Package"] = Constants.GMS_PACKAGE_NAME + headers["X-Android-Cert"] = Constants.GMS_PACKAGE_SIGNATURE_SHA1 + return headers + } + + override fun getBody(): ByteArray = i.encode() + + override fun getBodyContentType(): String = "application/x-protobuf" + + override fun parseNetworkResponse(response: NetworkResponse): Response { + return try { + Response.success(oAdapter.decode(response.data), null) + } catch (e: VolleyError) { + Response.error(e) + } catch (e: Exception) { + Response.error(VolleyError()) + } + } + + override fun deliverResponse(response: O) { + deferred.complete(response) + } + + override fun deliverError(error: VolleyError) { + deferred.completeExceptionally(error) + } + + suspend fun await(): O = deferred.await() + + suspend fun sendAndAwait(queue: RequestQueue): O { + queue.add(this) + return await() + } +} \ No newline at end of file diff --git a/play-services-appinvite/core/src/main/proto/datamixer.proto b/play-services-appinvite/core/src/main/proto/datamixer.proto new file mode 100644 index 0000000..1046f38 --- /dev/null +++ b/play-services-appinvite/core/src/main/proto/datamixer.proto @@ -0,0 +1,99 @@ +syntax = "proto2"; +option java_package = "org.microg.gms.appinvite"; + +enum ClientPlatform { + Android = 1; + IOS = 2; +} + +message ClientIdInfo { + optional ClientPlatform platform = 1; + optional string packageName = 3; // e.g. com.google.android.gms + optional string signature = 4; // Signing certificate sha-1 base64 with padding, e.g. WOHEEz90Qew9LCcCcKFIAtpHug4= + optional string language = 6; // e.g. en +} + +message LinkInfo { + optional string invitationId = 1; // e.g. "" + optional string uri = 2; +} + +message SystemInfo { + message GmsInfo { + optional uint32 versionCode = 1; // 212423054 + } + optional GmsInfo gms = 1; +} + +message MutateAppInviteLinkRequest { + optional ClientIdInfo client = 1; + optional LinkInfo link = 4; + optional SystemInfo system = 5; +} + +message MutateDataRequest { + oneof request { + MutateAppInviteLinkRequest appInviteLink = 84453462; + } +} + +message AppInviteLinkInfo { + optional int32 type = 1; + optional string url = 2; + optional string name = 3; +} + +message AppInviteAppData { + optional string packageName = 1; // apn + optional uint64 minAppVersion = 2; // amv + optional string altPackageName = 3; //apn +} + +message AppInviteLinkData { + optional string fallbackUrl = 1; // afl + optional string packageName = 2; // apn + optional string intentData = 3; // link + optional AppInviteAppData app = 6; +} + +message AppInviteLinkMetadata { + optional string source = 2; // utm_source + optional string medium = 3; // utm_medium + optional string campaign = 4; // utm_campaign + optional string id = 5; + optional string appCode = 6; + optional AppInviteLinkInfo info = 8; + optional string sessionId = 9; + optional string domainUriPrefix = 10; + optional string content = 11; // utm_content + optional string term = 12; // utm_term +} + +message MutateAppInviteLinkResponse { + optional AppInviteLinkData data = 1; + optional AppInviteLinkMetadata metadata = 4; +} + +message MutateDataResponse { + oneof response { + MutateAppInviteLinkResponse appInviteLink = 84453462; + } +} + +enum MutateOperationId { + AppInviteLink = 84453462; +} + +message MutateOperation { + optional MutateOperationId id = 1; // 84453462 + optional MutateDataRequest mutateRequest = 2; +} + +message StatusProto { + optional int32 code = 1; +} + +message MutateDataResponseWithError { + optional MutateDataResponse dataResponse = 1; + optional StatusProto errorStatus = 2; +} \ No newline at end of file diff --git a/play-services-appinvite/src/main/AndroidManifest.xml b/play-services-appinvite/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b6845e5 --- /dev/null +++ b/play-services-appinvite/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + diff --git a/play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteCallbacks.aidl b/play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteCallbacks.aidl new file mode 100644 index 0000000..66c64d7 --- /dev/null +++ b/play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteCallbacks.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.appinvite.internal; + + +import com.google.android.gms.common.api.Status; +import android.content.Intent; + + +interface IAppInviteCallbacks { + void onStatus(in Status status) = 0; + void onStatusIntent(in Status status, in Intent intent) = 1; +} diff --git a/play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteService.aidl b/play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteService.aidl new file mode 100644 index 0000000..630edd4 --- /dev/null +++ b/play-services-appinvite/src/main/aidl/com/google/android/gms/appinvite/internal/IAppInviteService.aidl @@ -0,0 +1,14 @@ +package com.google.android.gms.appinvite.internal; + + +import com.google.android.gms.appinvite.internal.IAppInviteCallbacks; + +import com.google.android.gms.dynamic.IObjectWrapper; +import com.google.android.gms.common.api.Status; + + +interface IAppInviteService { + void updateInvitationOnInstall(IAppInviteCallbacks callback, String invitationId) = 0; + void convertInvitation(IAppInviteCallbacks callback, String invitationId) = 1; + void getInvitation(IAppInviteCallbacks callback) = 2; +} diff --git a/play-services-appset/build.gradle b/play-services-appset/build.gradle new file mode 100644 index 0000000..cb838e7 --- /dev/null +++ b/play-services-appset/build.gradle @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' + +android { + namespace "com.google.android.gms.appset" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } +} + +description = 'microG implementation of play-services-appset' + +dependencies { + api project(':play-services-base') + api project(':play-services-basement') + + annotationProcessor project(':safe-parcel-processor') +} diff --git a/play-services-appset/core/build.gradle b/play-services-appset/core/build.gradle new file mode 100644 index 0000000..c6017e1 --- /dev/null +++ b/play-services-appset/core/build.gradle @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +dependencies { + api project(':play-services-appset') + + implementation project(':play-services-base-core') + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutineVersion" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion" +} + +android { + namespace "org.microg.gms.appset.core" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main { + java.srcDirs = ['src/main/kotlin'] + } + } + + lintOptions { + disable 'MissingTranslation' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } +} + +// Nothing to publish yet +//apply from: '../gradle/publish-android.gradle' + +description = 'microG service implementation for play-services-appset' diff --git a/play-services-appset/core/src/main/AndroidManifest.xml b/play-services-appset/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0df4322 --- /dev/null +++ b/play-services-appset/core/src/main/AndroidManifest.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/play-services-appset/core/src/main/kotlin/org/microg/gms/appset/AppSetService.kt b/play-services-appset/core/src/main/kotlin/org/microg/gms/appset/AppSetService.kt new file mode 100644 index 0000000..1f55cfe --- /dev/null +++ b/play-services-appset/core/src/main/kotlin/org/microg/gms/appset/AppSetService.kt @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.appset + +import android.util.Log +import com.google.android.gms.appset.AppSetIdInfo +import com.google.android.gms.appset.AppSetIdRequestParams +import com.google.android.gms.appset.AppSetInfoParcel +import com.google.android.gms.appset.internal.IAppSetIdCallback +import com.google.android.gms.appset.internal.IAppSetService +import com.google.android.gms.common.ConnectionResult +import com.google.android.gms.common.Feature +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.internal.ConnectionInfo +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import java.util.UUID + +private const val TAG = "AppSetService" +private val FEATURES = arrayOf(Feature("app_set_id", 1L)) + +class AppSetService : BaseService(TAG, GmsService.APP_SET) { + + override fun handleServiceRequest(callback: IGmsCallbacks?, request: GetServiceRequest?, service: GmsService?) { + callback?.onPostInitCompleteWithConnectionInfo( + ConnectionResult.SUCCESS, + AppSetServiceImpl().asBinder(), + ConnectionInfo().apply { features = FEATURES } + ) + } +} + +class AppSetServiceImpl : IAppSetService.Stub() { + override fun getAppSetIdInfo(params: AppSetIdRequestParams?, callback: IAppSetIdCallback?) { + Log.d(TAG, "AppSetServiceImp getAppSetIdInfo is called -> ${params?.toString()} ") + callback?.onAppSetInfo(Status.SUCCESS, AppSetInfoParcel(UUID.randomUUID().toString(), AppSetIdInfo.SCOPE_APP)) + } +} diff --git a/play-services-appset/src/main/AndroidManifest.xml b/play-services-appset/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8bdb7e1 --- /dev/null +++ b/play-services-appset/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetIdRequestParams.aidl b/play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetIdRequestParams.aidl new file mode 100644 index 0000000..5beef70 --- /dev/null +++ b/play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetIdRequestParams.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.appset; + +parcelable AppSetIdRequestParams; diff --git a/play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetInfoParcel.aidl b/play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetInfoParcel.aidl new file mode 100644 index 0000000..c2d4818 --- /dev/null +++ b/play-services-appset/src/main/aidl/com/google/android/gms/appset/AppSetInfoParcel.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.appset; + +parcelable AppSetInfoParcel; diff --git a/play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetIdCallback.aidl b/play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetIdCallback.aidl new file mode 100644 index 0000000..1b453de --- /dev/null +++ b/play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetIdCallback.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.appset.internal; + +import com.google.android.gms.appset.AppSetInfoParcel; +import com.google.android.gms.common.api.Status; + +interface IAppSetIdCallback { + void onAppSetInfo(in Status status, in AppSetInfoParcel info) = 0; +} \ No newline at end of file diff --git a/play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetService.aidl b/play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetService.aidl new file mode 100644 index 0000000..59dbb6f --- /dev/null +++ b/play-services-appset/src/main/aidl/com/google/android/gms/appset/internal/IAppSetService.aidl @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.appset.internal; + +import com.google.android.gms.appset.AppSetIdRequestParams; +import com.google.android.gms.appset.internal.IAppSetIdCallback; + +interface IAppSetService { + void getAppSetIdInfo(in AppSetIdRequestParams params, in IAppSetIdCallback callback) = 0; +} diff --git a/play-services-appset/src/main/java/com/google/android/gms/appset/AppSet.java b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSet.java new file mode 100644 index 0000000..f361652 --- /dev/null +++ b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSet.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.appset; + +import android.content.Context; +import androidx.annotation.NonNull; + +/** + * Entry point of the app set APIs. + */ +public class AppSet { + /** + * Creates a new instance of {@link AppSetIdClient}. + */ + @NonNull + public static AppSetIdClient getClient (Context context) { + throw new UnsupportedOperationException(); + } +} diff --git a/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdClient.java b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdClient.java new file mode 100644 index 0000000..91b6a67 --- /dev/null +++ b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdClient.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.appset; + +import androidx.annotation.NonNull; +import com.google.android.gms.tasks.Task; + +/** + * A client for interacting with the {@link AppSetIdInfo} API. + */ +public interface AppSetIdClient { + /** + * Gets the AppSetIdInfo asynchronously. + * + * @return a {@link Task} of the returned {@link AppSetIdInfo}. + */ + @NonNull + Task getAppSetIdInfo(); +} diff --git a/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdInfo.java b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdInfo.java new file mode 100644 index 0000000..29608f5 --- /dev/null +++ b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdInfo.java @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.appset; + +import androidx.annotation.IntDef; +import org.microg.gms.common.Hide; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Contains information about app set ID. + */ +public class AppSetIdInfo { + /** + * The app set ID is scoped to the app. + */ + public static final int SCOPE_APP = 1; + /** + * The app set ID is scoped to a developer account on an app store. All apps from the same developer on a device will have + * the same developer scoped app set ID. + */ + public static final int SCOPE_DEVELOPER = 2; + + private final String id; + private final @Scope int scope; + + @Hide + public AppSetIdInfo(String id, @Scope int scope) { + this.id = id; + this.scope = scope; + } + + /** + * Gets the app set ID. + * + * @return the app set ID. + */ + public String getId() { + return id; + } + + /** + * Returns the {@link AppSetIdInfo.Scope} of the app set ID. Possible values include {@link #SCOPE_APP} and {@link #SCOPE_DEVELOPER}. + * + * @return the app set ID's {@link AppSetIdInfo.Scope}. + */ + public @Scope int getScope() { + return scope; + } + + /** + * Allowed constants for {@link AppSetIdInfo#getScope()}. + *

+ * Supported constants: + *

    + *
  • {@link #SCOPE_APP}
  • + *
  • {@link #SCOPE_DEVELOPER}
  • + *
+ */ + @Target({ElementType.TYPE_USE}) + @Retention(RetentionPolicy.SOURCE) + @IntDef({SCOPE_APP, SCOPE_DEVELOPER}) + public @interface Scope { + + } +} diff --git a/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdRequestParams.java b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdRequestParams.java new file mode 100644 index 0000000..2bc9b0d --- /dev/null +++ b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetIdRequestParams.java @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.appset; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import org.microg.gms.common.Hide; +import org.microg.gms.utils.ToStringHelper; + +@SafeParcelable.Class +@Hide +public class AppSetIdRequestParams extends AbstractSafeParcelable { + @Field(1) + public final String version; + @Field(2) + public final String clientAppPackageName; + + @Constructor + public AppSetIdRequestParams(@Param(1) String version, @Param(2) String clientAppPackageName) { + this.version = version; + this.clientAppPackageName = clientAppPackageName; + } + + @NonNull + @Override + public String toString() { + return ToStringHelper.name("AppSetIdRequestParams").field("version", version).field("clientAppPackageName", clientAppPackageName).end(); + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(AppSetIdRequestParams.class); +} diff --git a/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetInfoParcel.java b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetInfoParcel.java new file mode 100644 index 0000000..dd47b94 --- /dev/null +++ b/play-services-appset/src/main/java/com/google/android/gms/appset/AppSetInfoParcel.java @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.appset; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@SafeParcelable.Class +@Hide +public class AppSetInfoParcel extends AbstractSafeParcelable { + @Field(1) + public final String id; + @Field(2) + public final int scope; + + @Constructor + public AppSetInfoParcel(@Param(1) String id, @Param(2) int scope) { + this.id = id; + this.scope = scope; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(AppSetInfoParcel.class); + +} diff --git a/play-services-appset/src/main/java/com/google/android/gms/appset/package-info.java b/play-services-appset/src/main/java/com/google/android/gms/appset/package-info.java new file mode 100644 index 0000000..e9ab491 --- /dev/null +++ b/play-services-appset/src/main/java/com/google/android/gms/appset/package-info.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: CC-BY-4.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ +/** + * For analytics or fraud prevention use cases, on a given device you may + need to correlate usage or actions across a set of apps owned by your organization. + */ +package com.google.android.gms.appset; diff --git a/play-services-auth-api-phone/build.gradle b/play-services-auth-api-phone/build.gradle new file mode 100644 index 0000000..18ddafa --- /dev/null +++ b/play-services-auth-api-phone/build.gradle @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +android { + namespace "com.google.android.gms.auth.api.phone" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + buildFeatures { + aidl = true + } + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } +} + +apply from: '../gradle/publish-android.gradle' + +description = 'microG implementation of play-services-auth-api-phone' + +dependencies { + // Dependencies from play-services-auth-api-phone:18.2.0 + api project(':play-services-base') + api project(':play-services-basement') + api project(':play-services-tasks') + api 'org.jetbrains.kotlin:kotlin-stdlib:1.8.21' + api 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21' + api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3' + // api 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.0' +} diff --git a/play-services-auth-api-phone/core/build.gradle b/play-services-auth-api-phone/core/build.gradle new file mode 100644 index 0000000..4530d26 --- /dev/null +++ b/play-services-auth-api-phone/core/build.gradle @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +dependencies { + api project(':play-services-auth-api-phone') + implementation project(':play-services-base-core') + + implementation "androidx.appcompat:appcompat:$appcompatVersion" +} + +android { + namespace "org.microg.gms.auth.phone" + + compileSdkVersion androidCompileSdk + buildToolsVersion "$androidBuildVersionTools" + + defaultConfig { + versionName version + minSdkVersion androidMinSdk + targetSdkVersion androidTargetSdk + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = 1.8 + } + + lintOptions { + disable 'MissingTranslation', 'GetLocales' + } +} diff --git a/play-services-auth-api-phone/core/src/main/AndroidManifest.xml b/play-services-auth-api-phone/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9c9cec5 --- /dev/null +++ b/play-services-auth-api-phone/core/src/main/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/AskPermissionActivity.kt b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/AskPermissionActivity.kt new file mode 100644 index 0000000..c78eecf --- /dev/null +++ b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/AskPermissionActivity.kt @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.phone + +import android.Manifest +import android.content.Intent +import android.os.Build.VERSION.SDK_INT +import android.os.Bundle +import android.os.Message +import android.os.Messenger +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.os.bundleOf + +private const val TAG = "AskPermission" +private const val REQUEST_CODE_PERMISSION = 101 +private val ALLOWED_PERMISSIONS = setOf(Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_CONTACTS) + +class AskPermissionActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val permissions = intent.getStringArrayExtra(EXTRA_PERMISSIONS) ?: arrayOf(Manifest.permission.RECEIVE_SMS) + Log.d(TAG, "Requesting permissions: ${permissions.toList()}") + if (SDK_INT < 23 || permissions.any { it !in ALLOWED_PERMISSIONS }) { + sendReply(RESULT_CANCELED) + finish() + } else { + ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE_PERMISSION) + } + } + + private fun sendReply(code: Int = RESULT_OK, extras: Bundle = Bundle.EMPTY) { + intent.getParcelableExtra(EXTRA_MESSENGER)?.let { + it.send(Message.obtain().apply { + what = code + data = extras + }) + } + setResult(code, Intent().apply { putExtras(extras) }) + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + if (requestCode == REQUEST_CODE_PERMISSION) { + sendReply(extras = bundleOf(EXTRA_GRANT_RESULTS to grantResults)) + finish() + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + } + } +} \ No newline at end of file diff --git a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt new file mode 100644 index 0000000..1969359 --- /dev/null +++ b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt @@ -0,0 +1,359 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.phone + +import android.Manifest.permission.READ_CONTACTS +import android.Manifest.permission.RECEIVE_SMS +import android.annotation.TargetApi +import android.app.Activity +import android.app.AlarmManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager.PERMISSION_GRANTED +import android.database.Cursor +import android.os.* +import android.os.Build.VERSION.SDK_INT +import android.provider.ContactsContract +import android.provider.ContactsContract.CommonDataKinds.Phone +import android.provider.Telephony +import android.telephony.SmsMessage +import android.text.TextUtils +import android.util.Base64 +import android.util.Log +import androidx.core.app.PendingIntentCompat +import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import com.google.android.gms.auth.api.phone.SmsRetriever +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.api.Status +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import org.microg.gms.auth.phone.SmsRetrieverRequestType.RETRIEVER +import org.microg.gms.auth.phone.SmsRetrieverRequestType.USER_CONSENT +import org.microg.gms.common.Constants +import org.microg.gms.utils.getSignatures +import java.nio.charset.StandardCharsets +import java.security.MessageDigest +import java.util.concurrent.atomic.AtomicInteger + + +private const val TAG = "SmsRetrieverCore" + +private const val ACTION_SMS_RETRIEVE_TIMEOUT = "org.microg.gms.auth.phone.ACTION_SMS_RETRIEVE_TIMEOUT" +private const val EXTRA_REQUEST_ID = "requestId" +private const val TIMEOUT = 1000 * 60 * 5 // 5 minutes +private const val MESSAGE_MAX_LEN = 140 + +class SmsRetrieverCore(private val context: Context, override val lifecycle: Lifecycle) : LifecycleOwner, DefaultLifecycleObserver { + private val requests: HashMap = hashMapOf() + private val requestIdCounter = AtomicInteger(0) + private lateinit var timeoutBroadcastReceiver: BroadcastReceiver + private lateinit var smsBroadcastReceiver: BroadcastReceiver + private var requestCode = 0 + private val alarmManager: AlarmManager + get() = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + + init { + lifecycle.addObserver(this) + } + + @TargetApi(19) + private fun configureBroadcastListenersIfNeeded() { + synchronized(this) { + if (!this::timeoutBroadcastReceiver.isInitialized) { + val intentFilter = IntentFilter(ACTION_SMS_RETRIEVE_TIMEOUT) + timeoutBroadcastReceiver = TimeoutReceiver() + ContextCompat.registerReceiver(context, timeoutBroadcastReceiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED) + } + if (!this::smsBroadcastReceiver.isInitialized) { + val intentFilter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION) + intentFilter.priority = 999 + smsBroadcastReceiver = SmsReceiver() + context.registerReceiver(smsBroadcastReceiver, intentFilter) + } + } + } + + private suspend fun ensureReady(permissions: Array): Boolean { + if (SDK_INT < 19) throw RuntimeException("Version not supported") + if (!ensurePermission(permissions)) return false + configureBroadcastListenersIfNeeded() + return true + } + + suspend fun startSmsRetriever(packageName: String) { + val appHashString = getHashString(packageName) + + if (!ensureReady(arrayOf(RECEIVE_SMS))) + throw RuntimeException("Initialization failed") + if (anyOtherPackageHasHashString(packageName, appHashString)) + throw RuntimeException("Collision in hash string, can't use SMS Retriever API") + if (requests.values.any { it.packageName == packageName && it.appHashString == appHashString && it.type == RETRIEVER }) + throw RuntimeException("App already listening") + + val request = SmsRetrieverRequest( + id = requestIdCounter.incrementAndGet(), + type = RETRIEVER, + packageName = packageName, + appHashString = appHashString, + timeoutPendingIntent = getTimeoutPendingIntent(context, packageName) + ) + requests[request.id] = request + alarmManager.set(AlarmManager.RTC, request.creation + TIMEOUT, request.timeoutPendingIntent) + } + + suspend fun startWithConsentPrompt(packageName: String, senderPhoneNumber: String?) { + if (!ensureReady(arrayOf(RECEIVE_SMS, READ_CONTACTS))) + throw RuntimeException("Initialization failed") + if (requests.values.any { it.packageName == packageName && it.senderPhoneNumber == senderPhoneNumber && it.type == USER_CONSENT }) + throw RuntimeException("App already listening") + + val request = SmsRetrieverRequest( + id = requestIdCounter.incrementAndGet(), + type = USER_CONSENT, + packageName = packageName, + senderPhoneNumber = senderPhoneNumber, + timeoutPendingIntent = getTimeoutPendingIntent(context, packageName) + ) + requests[request.id] = request + alarmManager.set(AlarmManager.RTC, request.creation + TIMEOUT, request.timeoutPendingIntent) + } + + fun hasOngoingUserConsentRequest(): Boolean { + return requests.values.any { it.type == USER_CONSENT } + } + + private fun sendRetrieverBroadcast(request: SmsRetrieverRequest, messageBody: String) { + sendReply(request, Status.SUCCESS, bundleOf(SmsRetriever.EXTRA_SMS_MESSAGE to messageBody)) + } + + private fun sendUserConsentBroadcast(request: SmsRetrieverRequest, messageBody: String) { + val userConsentIntent = Intent(context, UserConsentPromptActivity::class.java) + userConsentIntent.setPackage(Constants.GMS_PACKAGE_NAME) + userConsentIntent.putExtra(EXTRA_MESSENGER, Messenger(object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + if (Binder.getCallingUid() == Process.myUid()) { + if (msg.what == MSG_REQUEST_MESSAGE_BODY) { + msg.replyTo?.send(Message.obtain().apply { + what = 1 + data = bundleOf("message" to messageBody) + }) + } else if (msg.what == MSG_CONSUME_MESSAGE) { + finishRequest(request) + } + } + } + })) + + sendReply(request, Status.SUCCESS, bundleOf(SmsRetriever.EXTRA_CONSENT_INTENT to userConsentIntent), false) + } + + private fun getTimeoutPendingIntent(context: Context, packageName: String): PendingIntent { + val intent = Intent(ACTION_SMS_RETRIEVE_TIMEOUT) + intent.setPackage(packageName) + return PendingIntentCompat.getBroadcast(context, ++requestCode, intent, 0, false)!! + } + + private fun tryHandleIncomingMessageAsRetrieverMessage(messageBody: String): Boolean { + for (request in requests.values) { + if (request.type == RETRIEVER) { + // 11-digit hash code that uniquely identifies your app + if (request.appHashString.isNullOrBlank() || !messageBody.contains(request.appHashString)) continue + + sendRetrieverBroadcast(request, messageBody) + return true + } + } + return false + } + + private fun tryHandleIncomingMessageAsUserConsentMessage(senderPhoneNumber: String?, messageBody: String): Boolean { + val senderPhoneNumber = senderPhoneNumber ?: return false + + // 4-10 digit alphanumeric code containing at least one number + if (messageBody.split("[^A-Za-z0-9]".toRegex()).none { it.length in 4..10 && it.any(Char::isDigit) }) return false + + // Sender cannot be in the user's Contacts list + if (isPhoneNumberInContacts(context, senderPhoneNumber)) return false + + for (request in requests.values) { + if (request.type == USER_CONSENT) { + if (!request.senderPhoneNumber.isNullOrBlank() && request.senderPhoneNumber != senderPhoneNumber) continue + + sendUserConsentBroadcast(request, messageBody) + return true + } + } + return false + } + + private fun handleIncomingSmsMessage(senderPhoneNumber: String?, messageBody: String) { + Log.d(TAG, "handleIncomingSmsMessage: senderPhoneNumber:$senderPhoneNumber messageBody: $messageBody") + if (messageBody.isBlank()) return + + if (tryHandleIncomingMessageAsRetrieverMessage(messageBody)) return + if (tryHandleIncomingMessageAsUserConsentMessage(senderPhoneNumber, messageBody)) return + } + + fun handleTimeout(requestId: Int) { + val request = requests[requestId] ?: return + sendReply(request, Status(CommonStatusCodes.TIMEOUT)) + } + + private fun sendReply(request: SmsRetrieverRequest, status: Status, extras: Bundle = Bundle.EMPTY, finish: Boolean = true) { + Log.d(TAG, "Send reply to ${request.packageName} ${CommonStatusCodes.getStatusCodeString(status.statusCode)}") + + val intent = Intent(SmsRetriever.SMS_RETRIEVED_ACTION) + intent.setPackage(request.packageName) + intent.putExtras(extras) + intent.putExtra(SmsRetriever.EXTRA_STATUS, status) + context.sendBroadcast(intent) + + if (finish) finishRequest(request) + } + + fun finishRequest(request: SmsRetrieverRequest) { + alarmManager.cancel(request.timeoutPendingIntent) + requests.remove(request.id) + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + + if (this::smsBroadcastReceiver.isInitialized) context.unregisterReceiver(smsBroadcastReceiver) + if (this::timeoutBroadcastReceiver.isInitialized) context.unregisterReceiver(timeoutBroadcastReceiver) + + for (request in requests.values) { + sendReply(request, Status(CommonStatusCodes.TIMEOUT)) + } + + requests.clear() + } + + @TargetApi(19) + private inner class SmsReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION == intent.action) { + val messages = Telephony.Sms.Intents.getMessagesFromIntent(intent) + val messageBodyBuilder = StringBuilder() + var senderPhoneNumber: String? = null + for (message in messages) { + messageBodyBuilder.append(message.messageBody) + senderPhoneNumber = message.originatingAddress + } + try { + handleIncomingSmsMessage(senderPhoneNumber, messageBodyBuilder.toString()) + } catch (e: Exception) { + Log.w(TAG, "Error handling incoming SMS", e) + } + } + } + } + + private inner class TimeoutReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val requestId = intent.getIntExtra(EXTRA_REQUEST_ID, -1) + if (requestId != -1) { + handleTimeout(requestId) + } + } + } + + @TargetApi(19) + fun getHashString(packageName: String): String { + val signature = + context.packageManager.getSignatures(packageName).firstOrNull()?.toCharsString() ?: throw RuntimeException("No signature found for $packageName") + val appInfo = "$packageName $signature" + val messageDigest = MessageDigest.getInstance("SHA-256") + messageDigest.update(appInfo.toByteArray(StandardCharsets.UTF_8)) + return Base64.encodeToString(messageDigest.digest(), Base64.NO_PADDING or Base64.NO_WRAP).substring(0, 11) + } + + private fun anyOtherPackageHasHashString(packageName: String, hashString: String): Boolean { + val collision = context.packageManager.getInstalledPackages(0) + .firstOrNull { it.packageName != packageName && getHashString(it.packageName) == hashString } ?: return false + + Log.w(TAG, "Hash string collision between $packageName and ${collision.packageName} (both are $hashString)") + return true + } + + private fun isPhoneNumberInContacts(context: Context, phoneNumber: String): Boolean { + fun normalizePhoneNumber(input: String): String { + var output = "" + if (!TextUtils.isEmpty(input)) { + // only keep digits + val temp = input.replace("[^0-9]".toRegex(), "") + // trim leading zeroes + output = temp.replaceFirst("^0*".toRegex(), "") + } + return output + } + + val normalizePhoneNumber = normalizePhoneNumber(phoneNumber) + var cursor: Cursor? = null + try { + cursor = context.contentResolver.query(Phone.CONTENT_URI, arrayOf(Phone.NUMBER), null, null, null) ?: return false + while (cursor.moveToNext()) { + val addressIndex = cursor.getColumnIndex(Phone.NUMBER) + val contactPhoneNumber = normalizePhoneNumber(cursor.getString(addressIndex)) + if (!TextUtils.isEmpty(normalizePhoneNumber) && !TextUtils.isEmpty(contactPhoneNumber) && normalizePhoneNumber == contactPhoneNumber) { + return true + } + } + } catch (e: Exception) { + Log.w(TAG, e) + } finally { + cursor?.close() + } + return false + } + + private val activePermissionRequestLock = Mutex() + private var activePermissionRequest: Deferred? = null + + private suspend fun ensurePermission(permissions: Array): Boolean { + if (SDK_INT < 23) + return true + + if (permissions.all { ContextCompat.checkSelfPermission(context, it) == PERMISSION_GRANTED }) + return true + + val (completable, deferred) = activePermissionRequestLock.withLock { + if (activePermissionRequest == null) { + val completable = CompletableDeferred() + activePermissionRequest = completable + completable to activePermissionRequest!! + } else { + null to activePermissionRequest!! + } + } + if (completable != null) { + val intent = Intent(context, AskPermissionActivity::class.java) + intent.putExtra(EXTRA_MESSENGER, Messenger(object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + if (msg.what == Activity.RESULT_OK) { + val grantResults = msg.data?.getIntArray(EXTRA_GRANT_RESULTS) ?: IntArray(0) + completable.complete(grantResults.size == permissions.size && grantResults.all { it == PERMISSION_GRANTED }) + } else { + completable.complete(false) + } + } + })) + intent.putExtra(EXTRA_PERMISSIONS, permissions) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) + } + return deferred.await() + } +} \ No newline at end of file diff --git a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverRequest.kt b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverRequest.kt new file mode 100644 index 0000000..0f942df --- /dev/null +++ b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverRequest.kt @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.phone + +import android.app.PendingIntent + +data class SmsRetrieverRequest( + val id: Int, + val type: SmsRetrieverRequestType, + val packageName: String, + val timeoutPendingIntent: PendingIntent, + val appHashString: String? = null, + val creation: Long = System.currentTimeMillis(), + val senderPhoneNumber: String? = null +) + +enum class SmsRetrieverRequestType { + RETRIEVER, USER_CONSENT +} \ No newline at end of file diff --git a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverService.kt b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverService.kt new file mode 100644 index 0000000..76fe535 --- /dev/null +++ b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverService.kt @@ -0,0 +1,131 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.phone + +import android.util.Log +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.auth.api.phone.SmsRetrieverStatusCodes +import com.google.android.gms.auth.api.phone.internal.IAutofillPermissionStateCallback +import com.google.android.gms.auth.api.phone.internal.IOngoingSmsRequestCallback +import com.google.android.gms.auth.api.phone.internal.ISmsRetrieverApiService +import com.google.android.gms.auth.api.phone.internal.ISmsRetrieverResultCallback +import com.google.android.gms.common.Feature +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.api.internal.IStatusCallback +import com.google.android.gms.common.internal.ConnectionInfo +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.common.PackageUtils + + +private const val TAG = "SmsRetrieverService" +private val FEATURES = arrayOf( + Feature("sms_retrieve", 1), + Feature("user_consent", 3) +) + +class SmsRetrieverService : BaseService(TAG, GmsService.SMS_RETRIEVER) { + private val smsRetriever = SmsRetrieverCore(this, lifecycle) + + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + val packageName = PackageUtils.getAndCheckCallingPackage(this, request.packageName) + ?: throw IllegalArgumentException("Missing package name") + callback.onPostInitCompleteWithConnectionInfo( + CommonStatusCodes.SUCCESS, + SmsRetrieverServiceImpl(smsRetriever, packageName, lifecycle), + ConnectionInfo().apply { features = FEATURES } + ) + } +} + + +class SmsRetrieverServiceImpl(private val smsRetriever: SmsRetrieverCore, private val packageName: String, override val lifecycle: Lifecycle) : + ISmsRetrieverApiService.Stub(), LifecycleOwner { + + override fun startSmsRetriever(callback: ISmsRetrieverResultCallback) { + Log.d(TAG, "startSmsRetriever()") + lifecycleScope.launchWhenStarted { + val status = try { + smsRetriever.startSmsRetriever(packageName) + Status.SUCCESS + } catch (e: Exception) { + Status(CommonStatusCodes.INTERNAL_ERROR, e.message) + } + try { + callback.onResult(status) + } catch (e: Exception) { + Log.w(TAG, "Failed delivering $status for startSmsRetriever()", e) + } + } + } + + override fun startWithConsentPrompt(senderPhoneNumber: String?, callback: ISmsRetrieverResultCallback) { + Log.d(TAG, "startWithConsentPrompt($senderPhoneNumber)") + lifecycleScope.launchWhenStarted { + val status = try { + smsRetriever.startWithConsentPrompt(packageName, senderPhoneNumber) + Status.SUCCESS + } catch (e: Exception) { + Status(CommonStatusCodes.INTERNAL_ERROR, e.message) + } + try { + callback.onResult(status) + } catch (e: Exception) { + Log.w(TAG, "Failed delivering $status for startWithConsentPrompt()", e) + } + } + } + + override fun startSmsCodeAutofill(callback: IStatusCallback) { + Log.d(TAG, "startSmsCodeAutofill()") + try { + callback.onResult(Status(SmsRetrieverStatusCodes.API_NOT_AVAILABLE)) + } catch (e: Exception) { + Log.w(TAG, "Failed delivering result for startSmsCodeAutofill()", e) + } + } + + override fun checkAutofillPermissionState(callback: IAutofillPermissionStateCallback) { + Log.d(TAG, "checkAutofillPermissionState()") + try { + callback.onCheckPermissionStateResult(Status.SUCCESS, 1) + } catch (e: Exception) { + Log.w(TAG, "Failed delivering result for checkAutofillPermissionState()", e) + } + } + + override fun checkOngoingSmsRequest(packageName: String?, callback: IOngoingSmsRequestCallback) { + Log.d(TAG, "checkOngoingSmsRequest($packageName)") + lifecycleScope.launchWhenStarted { + val result = try { + smsRetriever.hasOngoingUserConsentRequest() + } catch (e: Exception) { + true + } + + try { + callback.onHasOngoingSmsRequestResult(Status.SUCCESS, result) + } catch (e: Exception) { + Log.w(TAG, "Failed delivering $result for checkOngoingSmsRequest()", e) + } + } + } + + + override fun startSmsCodeBrowser(callback: IStatusCallback) { + Log.d(TAG, "startSmsCodeBrowser()") + try { + callback.onResult(Status(SmsRetrieverStatusCodes.API_NOT_AVAILABLE)) + } catch (e: Exception) { + Log.w(TAG, "Failed delivering result for startSmsCodeBrowser()", e) + } + } +} \ No newline at end of file diff --git a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/UserConsentPromptActivity.kt b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/UserConsentPromptActivity.kt new file mode 100644 index 0000000..2ec81da --- /dev/null +++ b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/UserConsentPromptActivity.kt @@ -0,0 +1,79 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.phone + +import android.annotation.TargetApi +import android.content.Intent +import android.os.* +import android.text.Html +import android.view.Gravity +import android.view.ViewGroup.LayoutParams +import android.widget.Button +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import com.google.android.gms.auth.api.phone.SmsRetriever +import org.microg.gms.ui.buildAlertDialog +import org.microg.gms.utils.getApplicationLabel + +private const val TAG = "UserConsentPrompt" + +class UserConsentPromptActivity : AppCompatActivity() { + private val messenger: Messenger? + get() = intent.getParcelableExtra(EXTRA_MESSENGER) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val callingPackage = callingActivity?.packageName ?: return finish() + val messenger = messenger ?: return finish() + messenger.send(Message.obtain().apply { + what = MSG_REQUEST_MESSAGE_BODY + replyTo = Messenger(object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + if (msg.what == MSG_REQUEST_MESSAGE_BODY) { + val message = msg.data.getString("message") ?: return + showConsentDialog(callingPackage, message) + } + } + }) + }) + } + + @TargetApi(16) + private fun showConsentDialog(callingPackage: String, message: String) { + val view = layoutInflater.inflate(R.layout.dialog_sms_user_consent, null) + val dialog = buildAlertDialog() + .setCancelable(false) + .setView(view) + .create() + val appName = packageManager.getApplicationLabel(callingPackage) + + view.findViewById(android.R.id.title).text = Html.fromHtml(getString(R.string.sms_user_consent_title, Html.escapeHtml(appName))) + view.findViewById(android.R.id.text1).text = message + view.findViewById

+ * For the expected format of this JSON, please see IsReadyToPayRequest object reference documentation. + */ + public static IsReadyToPayRequest fromJson(String isReadyToPayRequestJson) { + return new IsReadyToPayRequest(isReadyToPayRequestJson); + } + + /** + * @return a builder for constructing the {@link IsReadyToPayRequest} object. + * @deprecated Use the JSON request format instead, see {@link #fromJson(String)}. + */ + public static IsReadyToPayRequest.Builder newBuilder() { + return new IsReadyToPayRequest().new Builder(); + } + + /** + * Returns {@link IsReadyToPayRequest} in JSON format. + *