From 4f168743d4acaa28a53a6e8130b070bdb6be4bf2 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Thu, 3 Jul 2025 00:08:41 +0000
Subject: [PATCH 1/7] Remove deprecated Google Mobile Ads (GMA) C++ SDK
This commit removes the entire GMA C++ SDK from the Firebase C++ SDK, including all references to it across all platforms (iOS, Desktop, and Android).
Changes include:
- Deletion of the core `gma` directory and its contents.
- Removal of GMA from CMakeLists.txt files.
- Removal of GMA from Gradle build files.
- Removal of GMA from iOS Podfiles.
- Removal of GMA from integration tests and UI tests.
- Removal of GMA from build scripts and CI workflows.
- Updates to documentation (README.md, Doxyfile) to reflect the removal, while preserving release notes related to past GMA versions and adding a new note about its removal.
---
.github/workflows/integration_tests.yml | 4 +-
.github/workflows/update-dependencies.yml | 13 +-
Android/firebase_dependencies.gradle | 6 -
CMakeLists.txt | 8 +-
README.md | 11 +-
app/CMakeLists.txt | 12 -
build_scripts/ios/build.sh | 2 +-
build_scripts/packaging.conf | 2 +-
docs/Doxyfile | 2 +-
gma/CMakeLists.txt | 156 -
gma/build.gradle | 93 -
gma/gma_additional.pro | 2 -
gma/integration_test/AndroidManifest.xml | 53 -
gma/integration_test/CMakeLists.txt | 242 --
.../AppIcon.appiconset/Contents.json | 98 -
.../LaunchImage.launchimage/Contents.json | 51 -
gma/integration_test/Info.plist | 41 -
gma/integration_test/LaunchScreen.storyboard | 7 -
gma/integration_test/LibraryManifest.xml | 23 -
gma/integration_test/Podfile | 18 -
gma/integration_test/build.gradle | 108 -
gma/integration_test/empty.swift | 9 -
gma/integration_test/googletest.cmake | 35 -
gma/integration_test/gradle.properties | 2 -
.../gradle/wrapper/gradle-wrapper.jar | Bin 49896 -> 0 bytes
.../gradle/wrapper/gradle-wrapper.properties | 6 -
gma/integration_test/gradlew | 178 -
gma/integration_test/gradlew.bat | 104 -
.../project.pbxproj | 383 --
gma/integration_test/proguard.pro | 2 -
gma/integration_test/res/layout/main.xml | 28 -
gma/integration_test/res/values/strings.xml | 20 -
gma/integration_test/settings.gradle | 41 -
gma/integration_test/src/integration_test.cc | 3328 -----------------
ios_pod/Podfile | 1 -
.../Android/firebase_dependencies.gradle | 5 -
release_build_files/CMakeLists.txt | 1 -
release_build_files/readme.md | 29 +-
scripts/gha/build_ios_tvos.py | 13 +-
.../integration_testing/build_testapps.json | 15 -
scripts/gha/print_matrix_configuration.py | 10 +-
scripts/gha/report_build_status.py | 8 +-
.../com/google/firebase/uitest/UITest.java | 66 -
.../FirebaseCppUITestAppUITests.swift | 109 -
scripts/update_android_ios_dependencies.py | 21 +-
settings.gradle | 2 -
setup_integration_tests.py | 1 -
47 files changed, 35 insertions(+), 5334 deletions(-)
delete mode 100644 gma/CMakeLists.txt
delete mode 100644 gma/build.gradle
delete mode 100644 gma/gma_additional.pro
delete mode 100644 gma/integration_test/AndroidManifest.xml
delete mode 100644 gma/integration_test/CMakeLists.txt
delete mode 100644 gma/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json
delete mode 100644 gma/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json
delete mode 100644 gma/integration_test/Info.plist
delete mode 100644 gma/integration_test/LaunchScreen.storyboard
delete mode 100644 gma/integration_test/LibraryManifest.xml
delete mode 100644 gma/integration_test/Podfile
delete mode 100644 gma/integration_test/build.gradle
delete mode 100644 gma/integration_test/empty.swift
delete mode 100644 gma/integration_test/googletest.cmake
delete mode 100644 gma/integration_test/gradle.properties
delete mode 100644 gma/integration_test/gradle/wrapper/gradle-wrapper.jar
delete mode 100644 gma/integration_test/gradle/wrapper/gradle-wrapper.properties
delete mode 100755 gma/integration_test/gradlew
delete mode 100644 gma/integration_test/gradlew.bat
delete mode 100644 gma/integration_test/integration_test.xcodeproj/project.pbxproj
delete mode 100644 gma/integration_test/proguard.pro
delete mode 100644 gma/integration_test/res/layout/main.xml
delete mode 100644 gma/integration_test/res/values/strings.xml
delete mode 100644 gma/integration_test/settings.gradle
delete mode 100644 gma/integration_test/src/integration_test.cc
diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml
index 05c93a6188..2d4edf6f1d 100644
--- a/.github/workflows/integration_tests.yml
+++ b/.github/workflows/integration_tests.yml
@@ -17,7 +17,7 @@ on:
required: true
apis:
description: 'CSV of apis to build and test'
- default: 'analytics,app_check,auth,database,dynamic_links,firestore,functions,gma,installations,messaging,remote_config,storage,ump'
+ default: 'analytics,app_check,auth,database,dynamic_links,firestore,functions,installations,messaging,remote_config,storage,ump'
required: true
operating_systems:
description: 'CSV of VMs to run on'
@@ -186,7 +186,7 @@ jobs:
# list. Then we can use fromJson to define the field in the matrix for the tests job.
if [[ "${{ github.event.schedule }}" == "0 9 * * *" ]]; then
# at 1am PST/2am PDT. Running integration tests and generate test report for all testapps except firestore
- apis="analytics,app_check,auth,database,dynamic_links,functions,gma,installations,messaging,remote_config,storage,ump"
+ apis="analytics,app_check,auth,database,dynamic_links,functions,installations,messaging,remote_config,storage,ump"
echo "::warning ::Running main nightly tests"
elif [[ "${{ github.event.schedule }}" == "0 10 * * *" || "${{ github.event.schedule }}" == "0 11 * * *" ]]; then
# at 2am PST/3am PDT and 3am PST/4am PDT. Running integration tests for firestore and generate test report.
diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml
index 23db829d3e..3a0fd70d48 100644
--- a/.github/workflows/update-dependencies.yml
+++ b/.github/workflows/update-dependencies.yml
@@ -8,9 +8,6 @@ on:
updateiOS:
description: 'update iOS dependencies?'
default: 1
- includeGMA:
- description: 'include GMA?'
- default: 0
triggerTests:
description: 'trigger tests on PR?'
default: 1
@@ -68,20 +65,16 @@ jobs:
- name: Run update script
run: |
- gma_flag=
- if [[ ${{ github.event.inputs.includeGMA }} -eq 1 ]]; then
- gma_flag="--include_gma"
- fi
if [[ ${{ github.event.inputs.updateiOS }} -eq 1 ]]; then
if [[ ${{ github.event.inputs.updateAndroid }} -eq 1 ]]; then
# Update both
echo "Updating all dependencies"
- python scripts/update_android_ios_dependencies.py --logfile=${UPDATE_LOGFILE} ${gma_flag}
+ python scripts/update_android_ios_dependencies.py --logfile=${UPDATE_LOGFILE}
echo "CHOSEN_DEPS=mobile" >> $GITHUB_ENV
else
# Update iOS only
echo "Updating iOS dependencies only"
- python scripts/update_android_ios_dependencies.py --skip_android --logfile=${UPDATE_LOGFILE} ${gma_flag}
+ python scripts/update_android_ios_dependencies.py --skip_android --logfile=${UPDATE_LOGFILE}
echo "CHOSEN_DEPS=iOS" >> $GITHUB_ENV
fi
# iOS: Update Firestore external version to match Firestore Cocoapod version.
@@ -165,7 +158,7 @@ jobs:
elif [[ ${{ github.event.inputs.updateAndroid }} -eq 1 ]]; then
# Update Android only
echo "Updating Android dependencies only"
- python scripts/update_android_ios_dependencies.py --skip_ios --logfile=${UPDATE_LOGFILE} ${gma_flag}
+ python scripts/update_android_ios_dependencies.py --skip_ios --logfile=${UPDATE_LOGFILE}
echo "CHOSEN_DEPS=Android" >> $GITHUB_ENV
else
echo "::error ::Neither Android nor iOS selected. Exiting."
diff --git a/Android/firebase_dependencies.gradle b/Android/firebase_dependencies.gradle
index 94b39ec52c..c7a19de54b 100644
--- a/Android/firebase_dependencies.gradle
+++ b/Android/firebase_dependencies.gradle
@@ -27,8 +27,6 @@ def firebaseDependenciesMap = [
'dynamic_links' : ['com.google.firebase:firebase-dynamic-links'],
'firestore' : ['com.google.firebase:firebase-firestore'],
'functions' : ['com.google.firebase:firebase-functions'],
- 'gma' : ['com.google.android.gms:play-services-ads:23.0.0',
- 'com.google.android.ump:user-messaging-platform:2.2.0'],
'installations' : ['com.google.firebase:firebase-installations'],
'invites' : ['com.google.firebase:firebase-invites'],
// Messaging has an additional local dependency to include.
@@ -52,7 +50,6 @@ def firebaseResourceDependenciesMap = [
'auth' : [':auth:auth_resources'],
'database' : [':database:database_resources'],
'firestore' : [':firestore:firestore_resources'],
- 'gma' : [':gma:gma_resources'],
'remote_config' : [':remote_config:remote_config_resources'],
'storage' : [':storage:storage_resources'],
'ump' : [':ump:ump_resources']
@@ -94,9 +91,6 @@ class Dependencies {
def getFirestore() {
libSet.add('firestore')
}
- def getGma() {
- libSet.add('gma')
- }
def getFunctions() {
libSet.add('functions')
}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aea6d80a34..a5a505120e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,8 +48,6 @@ option(FIREBASE_INCLUDE_FIRESTORE
option(FIREBASE_INCLUDE_FUNCTIONS
"Include the Cloud Functions for Firebase library."
${FIREBASE_INCLUDE_LIBRARY_DEFAULT})
-option(FIREBASE_INCLUDE_GMA "Include the GMA library."
- ${FIREBASE_INCLUDE_LIBRARY_DEFAULT})
option(FIREBASE_INCLUDE_UMP "Include the UMP library."
${FIREBASE_INCLUDE_LIBRARY_DEFAULT})
option(FIREBASE_INCLUDE_INSTALLATIONS
@@ -125,9 +123,8 @@ if(FIREBASE_CPP_BUILD_TESTS OR FIREBASE_CPP_BUILD_STUB_TESTS)
endif()
if (PLATFORM STREQUAL TVOS OR PLATFORM STREQUAL SIMULATOR_TVOS)
- # GMA, UMP, and FDL are not supported on tvOS.
+ # UMP and FDL are not supported on tvOS.
set(FIREBASE_INCLUDE_DYNAMIC_LINKS OFF)
- set(FIREBASE_INCLUDE_GMA OFF)
set(FIREBASE_INCLUDE_UMP OFF)
endif()
@@ -635,9 +632,6 @@ endif()
if (FIREBASE_INCLUDE_FUNCTIONS)
add_subdirectory(functions)
endif()
-if (FIREBASE_INCLUDE_GMA)
- add_subdirectory(gma)
-endif()
if (FIREBASE_INCLUDE_UMP)
add_subdirectory(ump)
endif()
diff --git a/README.md b/README.md
index 6a829a9a07..55e38e9bab 100644
--- a/README.md
+++ b/README.md
@@ -10,9 +10,12 @@ iOS, and desktop platforms. It includes the following Firebase libraries:
|[Google Analytics for Firebase](https://firebase.google.com/docs/analytics/)|
|[Firebase Authentication](https://firebase.google.com/docs/auth/)|[Firebase Realtime Database](https://firebase.google.com/docs/database/)|
|[Firebase Dynamic Links](https://firebase.google.com/docs/dynamic-links/)|[Cloud Firestore](https://firebase.google.com/docs/firestore/)|
-|[Cloud Functions for Firebase](https://firebase.google.com/docs/functions/)|[Firebase Invites](https://firebase.google.com/docs/invites/)|
-|[Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/)|[Firebase Remote Config](https://firebase.google.com/docs/remote-config/)|
-|[Cloud Storage for Firebase](https://firebase.google.com/docs/storage/)|
+|[Cloud Functions for Firebase](https://firebase.google.com/docs/functions/)|[Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/)|
+|[Firebase Remote Config](https://firebase.google.com/docs/remote-config/)|[Cloud Storage for Firebase](https://firebase.google.com/docs/storage/)|
+
+
+
+**Note:** The Google Mobile Ads (GMA) C++ SDK has been deprecated and was removed from this SDK.
@@ -117,7 +120,6 @@ The CMake following targets are available to build and link with:
| Firebase Dynamic Links | firebase_dynamic_links |
| Cloud Firestore | firebase_firestore |
| Cloud Functions for Firebase | firebase_functions |
-| Firebase Invites | firebase_invites |
| Firebase Cloud Messaging | firebase_messaging |
| Firebase Remote Config | firebase_remote_config |
| Cloud Storage for Firebase | firebase_storage |
@@ -222,7 +224,6 @@ release version of each Firebase library is:
| Firebase Dynamic Links | :dynamic_links:assembleRelease |
| Cloud Firestore | :firestore:assembleRelease |
| Cloud Functions for Firebase | :functions:assembleRelease |
-| Firebase Invites | :invites:assembleRelease |
| Firebase Cloud Messaging | :messaging:assembleRelease |
| Firebase Remote Config | :remote_config:assembleRelease |
| Cloud Storage for Firebase | :storage:assembleRelease |
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 9b2d0b333a..6b1108ac31 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -541,17 +541,6 @@ if (IOS)
${FIREBASE_SOURCE_DIR}/functions/src/include/firebase/functions/callable_reference.h
${FIREBASE_SOURCE_DIR}/functions/src/include/firebase/functions/callable_result.h
${FIREBASE_SOURCE_DIR}/functions/src/include/firebase/functions/common.h)
- set(gma_HDRS
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/ad_view.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/interstitial_ad.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/internal/native_ad.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/internal/query_info.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/rewarded_ad.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/types.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/ump.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/ump/consent_info.h
- ${FIREBASE_SOURCE_DIR}/gma/src/include/firebase/gma/ump/types.h)
set(installations_HDRS
${FIREBASE_SOURCE_DIR}/installations/src/include/firebase/installations.h)
set(messaging_HDRS
@@ -580,7 +569,6 @@ if (IOS)
${dynamic_links_HDRS}
${firestore_HDRS}
${functions_HDRS}
- ${gma_HDRS}
${installations_HDRS}
${messaging_HDRS}
${remote_config_HDRS}
diff --git a/build_scripts/ios/build.sh b/build_scripts/ios/build.sh
index c466d35af7..f21e4ff36e 100755
--- a/build_scripts/ios/build.sh
+++ b/build_scripts/ios/build.sh
@@ -27,7 +27,7 @@ readonly SUPPORTED_PLATFORMS=(device simulator)
readonly SUPPORTED_ARCHITECTURES=(arm64 x86_64)
readonly DEVICE_ARCHITECTURES=(arm64)
readonly SIMULATOR_ARCHITECTURES=(arm64 x86_64)
-readonly SUPPORTED_TARGETS=(firebase_analytics firebase_auth firebase_app_check firebase_database firebase_dynamic_links firebase_firestore firebase_functions firebase_gma firebase_installations firebase_messaging firebase_remote_config firebase_storage firebase_ump)
+readonly SUPPORTED_TARGETS=(firebase_analytics firebase_auth firebase_app_check firebase_database firebase_dynamic_links firebase_firestore firebase_functions firebase_installations firebase_messaging firebase_remote_config firebase_storage firebase_ump)
# build default value
buildpath="ios_build"
diff --git a/build_scripts/packaging.conf b/build_scripts/packaging.conf
index 8f1ee6f401..5010b2c4a2 100644
--- a/build_scripts/packaging.conf
+++ b/build_scripts/packaging.conf
@@ -2,5 +2,5 @@
# List of all Firebase products to include in the binary SDK package.
readonly -a product_list=(analytics app app_check auth database
-dynamic_links firestore functions gma installations messaging
+dynamic_links firestore functions installations messaging
remote_config storage ump)
diff --git a/docs/Doxyfile b/docs/Doxyfile
index fabb54e5da..fea93c1f66 100644
--- a/docs/Doxyfile
+++ b/docs/Doxyfile
@@ -13,7 +13,7 @@ SORT_GROUP_NAMES = YES
JAVADOC_AUTOBRIEF = YES
# Firebase-specific options.
-PREDEFINED = DOXYGEN DOXYGEN_ADMOB FIREBASE_DEPRECATED FIREBASE_NAMESPACE=firebase
+PREDEFINED = DOXYGEN FIREBASE_DEPRECATED FIREBASE_NAMESPACE=firebase
MACRO_EXPANSION = YES # Expand FIREBASE_DEPRECATED macros.
EXPAND_ONLY_PREDEF = YES # Expand FIREBASE_DEPRECATED macros.
VERBATIM_HEADERS = NO
diff --git a/gma/CMakeLists.txt b/gma/CMakeLists.txt
deleted file mode 100644
index 2b0b225740..0000000000
--- a/gma/CMakeLists.txt
+++ /dev/null
@@ -1,156 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# 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.
-
-# CMake file for the firebase_gma library
-
-# Common source files used by all platforms
-set(common_SRCS
- src/common/ump/consent_info.cc
- src/common/ump/consent_info_internal.cc
- src/common/gma_common.cc
- src/common/ad_view.cc
- src/common/ad_view_internal.cc
- src/common/interstitial_ad.cc
- src/common/interstitial_ad_internal.cc
- src/common/full_screen_ad_event_listener.cc
- src/common/native_ad.cc
- src/common/native_ad_internal.cc
- src/common/query_info.cc
- src/common/query_info_internal.cc
- src/common/rewarded_ad.cc
- src/common/rewarded_ad_internal.cc)
-
-# Define the resource build needed for Android
-firebase_cpp_gradle(":gma:gma_resources:generateDexJarRelease"
- "${CMAKE_CURRENT_LIST_DIR}/gma_resources/build/gma_resources_lib.jar")
-binary_to_array("gma_resources"
- "${CMAKE_CURRENT_LIST_DIR}/gma_resources/build/gma_resources_lib.jar"
- "firebase_gma"
- "${FIREBASE_GEN_FILE_DIR}/gma")
-
-# Source files used by the Android implementation.
-set(android_SRCS
- ${gma_resources_source}
- src/android/ump/consent_info_internal_android.cc
- src/android/ad_request_converter.cc
- src/android/ad_error_android.cc
- src/android/adapter_response_info_android.cc
- src/android/gma_android.cc
- src/android/ad_view_internal_android.cc
- src/android/interstitial_ad_internal_android.cc
- src/android/native_ad_image_android.cc
- src/android/native_ad_internal_android.cc
- src/android/query_info_internal_android.cc
- src/android/response_info_android.cc
- src/android/rewarded_ad_internal_android.cc)
-
-# Source files used by the iOS implementation.
-set(ios_SRCS
- src/ios/ump/consent_info_internal_ios.mm
- src/ios/FADAdSize.mm
- src/ios/FADAdView.mm
- src/ios/FADInterstitialDelegate.mm
- src/ios/FADNativeDelegate.mm
- src/ios/FADRequest.mm
- src/ios/FADRewardedAdDelegate.mm
- src/ios/ad_error_ios.mm
- src/ios/adapter_response_info_ios.mm
- src/ios/gma_ios.mm
- src/ios/ad_view_internal_ios.mm
- src/ios/interstitial_ad_internal_ios.mm
- src/ios/native_ad_image_ios.mm
- src/ios/native_ad_internal_ios.mm
- src/ios/query_info_internal_ios.mm
- src/ios/response_info_ios.mm
- src/ios/rewarded_ad_internal_ios.mm)
-
-# Source files used by the stub implementation.
-set(stub_SRCS
- src/stub/ump/consent_info_internal_stub.cc
- src/stub/ad_error_stub.cc
- src/stub/adapter_response_info_stub.cc
- src/stub/gma_stub.cc
- src/stub/native_ad_image_stub.cc
- src/stub/response_info_stub.cc)
-
-if(ANDROID)
- set(gma_platform_SRCS
- "${android_SRCS}")
-elseif(IOS)
- set(gma_platform_SRCS
- "${ios_SRCS}")
-else()
- set(gma_platform_SRCS
- "${stub_SRCS}")
-endif()
-
-add_library(firebase_gma STATIC
- ${common_SRCS}
- ${gma_platform_SRCS})
-
-set_property(TARGET firebase_gma PROPERTY FOLDER "Firebase Cpp")
-
-# Set up the dependency on Firebase App.
-target_link_libraries(firebase_gma
- PUBLIC firebase_app)
-# Public headers all refer to each other relative to the src/include directory,
-# while private headers are relative to the entire C++ SDK directory.
-target_include_directories(firebase_gma
- PUBLIC
- ${CMAKE_CURRENT_LIST_DIR}/src/include
- PRIVATE
- ${FIREBASE_CPP_SDK_ROOT_DIR}
-)
-target_compile_definitions(firebase_gma
- PRIVATE
- -DINTERNAL_EXPERIMENTAL=1
-)
-# Automatically include headers that might not be declared.
-if(MSVC)
- add_definitions(/FI"assert.h" /FI"string.h" /FI"stdint.h")
-else()
- add_definitions(-include assert.h -include string.h)
-endif()
-
-if(ANDROID)
- firebase_cpp_proguard_file(gma)
-elseif(IOS)
- # GMA for iOS uses weak references, which requires enabling Automatic
- # Reference Counting (ARC). Also enable BitCode.
- target_compile_options(firebase_gma
- PUBLIC "-fobjc-arc" "-fembed-bitcode")
- target_link_libraries(firebase_gma
- PUBLIC "-fembed-bitcode")
-
- setup_pod_headers(
- firebase_gma
- POD_NAMES
- Google-Mobile-Ads-SDK
- GoogleUserMessagingPlatform
- )
-
- # GMA expects the header files to be in a subfolder, so set up a symlink to
- # accomplish that.
- symlink_pod_headers(firebase_gma Google-Mobile-Ads-SDK GoogleMobileAds)
- symlink_pod_headers(firebase_gma GoogleUserMessagingPlatform UserMessagingPlatform)
-
- if (FIREBASE_XCODE_TARGET_FORMAT STREQUAL "frameworks")
- set_target_properties(firebase_gma PROPERTIES
- FRAMEWORK TRUE
- )
- endif()
-endif()
-
-cpp_pack_library(firebase_gma "")
-cpp_pack_public_headers()
diff --git a/gma/build.gradle b/gma/build.gradle
deleted file mode 100644
index 9b54eea9f6..0000000000
--- a/gma/build.gradle
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// 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.
-
-buildscript {
- repositories {
- google()
- mavenCentral()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:7.4.2'
- }
-}
-allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-apply plugin: 'com.android.library'
-
-android {
- compileSdkVersion 34
- ndkPath System.getenv('ANDROID_NDK_HOME')
- buildToolsVersion '32.0.0'
-
- sourceSets {
- main {
- manifest.srcFile '../android_build_files/AndroidManifest.xml'
- }
- }
-
- externalNativeBuild {
- cmake {
- path '../CMakeLists.txt'
- }
- }
-
- defaultConfig {
- minSdkVersion 23
- targetSdkVersion 34
- versionCode 1
- versionName "1.0"
-
- buildTypes {
- release {
- minifyEnabled false
- }
- }
-
- externalNativeBuild {
- cmake {
- targets 'firebase_gma'
- // Args are: Re-use app library prebuilt by app gradle project.
- // Don't configure all the cmake subprojects.
- // Only include needed project.
- arguments '-DFIREBASE_CPP_USE_PRIOR_GRADLE_BUILD=ON',
- '-DFIREBASE_INCLUDE_LIBRARY_DEFAULT=OFF',
- '-DFIREBASE_INCLUDE_GMA=ON'
- }
- }
- }
-
- lintOptions {
- abortOnError false
- }
-}
-
-dependencies {
- implementation project(':app')
-}
-apply from: "$rootDir/android_build_files/android_abis.gradle"
-apply from: "$rootDir/android_build_files/extract_and_dex.gradle"
-apply from: "$rootDir/android_build_files/generate_proguard.gradle"
-project.afterEvaluate {
- generateProguardFile('gma')
- setupDexDependencies(':gma:gma_resources')
- preBuild.dependsOn(':app:build')
- project.tasks.withType(com.android.build.gradle.internal.tasks.CheckAarMetadataTask) {
- enabled = false
- }
-}
diff --git a/gma/gma_additional.pro b/gma/gma_additional.pro
deleted file mode 100644
index 57edbf9017..0000000000
--- a/gma/gma_additional.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-# Additional ProGuard rules needed for the AdMob library.
--keep class com.google.ads.mediation.admob.AdMobAdapter { *; }
diff --git a/gma/integration_test/AndroidManifest.xml b/gma/integration_test/AndroidManifest.xml
deleted file mode 100644
index 8aa98a1958..0000000000
--- a/gma/integration_test/AndroidManifest.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/gma/integration_test/CMakeLists.txt b/gma/integration_test/CMakeLists.txt
deleted file mode 100644
index 29c6a6e4d1..0000000000
--- a/gma/integration_test/CMakeLists.txt
+++ /dev/null
@@ -1,242 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# 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.
-
-# Cmake file for a single C++ integration test build.
-
-cmake_minimum_required(VERSION 2.8)
-
-find_program(FIREBASE_PYTHON_EXECUTABLE
- NAMES python3 python
- DOC "The Python interpreter to use, such as one from a venv"
- REQUIRED
-)
-
-# User settings for Firebase integration tests.
-# Path to Firebase SDK.
-# Try to read the path to the Firebase C++ SDK from an environment variable.
-if (NOT "$ENV{FIREBASE_CPP_SDK_DIR}" STREQUAL "")
- set(DEFAULT_FIREBASE_CPP_SDK_DIR "$ENV{FIREBASE_CPP_SDK_DIR}")
-else()
- if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/../../cpp_sdk_version.json")
- set(DEFAULT_FIREBASE_CPP_SDK_DIR "${CMAKE_CURRENT_LIST_DIR}/../..")
- else()
- set(DEFAULT_FIREBASE_CPP_SDK_DIR "firebase_cpp_sdk")
- endif()
-endif()
-if ("${FIREBASE_CPP_SDK_DIR}" STREQUAL "")
- set(FIREBASE_CPP_SDK_DIR ${DEFAULT_FIREBASE_CPP_SDK_DIR})
-endif()
-if(NOT EXISTS ${FIREBASE_CPP_SDK_DIR})
- message(FATAL_ERROR "The Firebase C++ SDK directory does not exist: ${FIREBASE_CPP_SDK_DIR}. See the readme.md for more information")
-endif()
-
-# Copy all prerequisite files for integration tests to run.
-if(NOT ANDROID)
- if (EXISTS ${CMAKE_CURRENT_LIST_DIR}/../../setup_integration_tests.py)
- # If this is running from inside the SDK directory, run the setup script.
- execute_process(
- COMMAND
- ${FIREBASE_PYTHON_EXECUTABLE}
- "${CMAKE_CURRENT_LIST_DIR}/../../setup_integration_tests.py"
- "${CMAKE_CURRENT_LIST_DIR}"
- RESULT_VARIABLE
- FIREBASE_PYTHON_EXECUTABLE_RESULT
- )
- if(NOT FIREBASE_PYTHON_EXECUTABLE_RESULT EQUAL 0)
- message(FATAL_ERROR "Failed to run setup_integration_tests.py")
- endif()
- endif()
-endif()
-
-# Windows runtime mode, either MD or MT depending on whether you are using
-# /MD or /MT. For more information see:
-# https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
-set(MSVC_RUNTIME_MODE MD)
-
-project(firebase_testapp)
-
-# Integration test source files.
-set(FIREBASE_APP_FRAMEWORK_SRCS
- src/app_framework.cc
- src/app_framework.h
-)
-
-set(FIREBASE_TEST_FRAMEWORK_SRCS
- src/firebase_test_framework.h
- src/firebase_test_framework.cc
-)
-
-set(FIREBASE_INTEGRATION_TEST_SRCS
- src/integration_test.cc
-)
-
-# The include directory for the testapp.
-include_directories(src)
-
-# Firebase C++ SDK requires C++14.
-set (CMAKE_CXX_STANDARD 14)
-set (CMAKE_CXX_STANDARD_REQUIRED YES) # Don't fall back to an earlier version.
-
-# Download and unpack googletest (and googlemock) at configure time
-set(GOOGLETEST_ROOT ${CMAKE_CURRENT_LIST_DIR}/external/googletest)
-# Note: Once googletest is downloaded once, it won't be updated or
-# downloaded again unless you delete the "external/googletest"
-# directory.
-if (NOT EXISTS ${GOOGLETEST_ROOT}/src/googletest/src/gtest-all.cc)
- configure_file(googletest.cmake
- ${CMAKE_CURRENT_LIST_DIR}/external/googletest/CMakeLists.txt COPYONLY)
- execute_process(COMMAND ${CMAKE_COMMAND} .
- RESULT_VARIABLE result
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/external/googletest )
- if(result)
- message(FATAL_ERROR "CMake step for googletest failed: ${result}")
- endif()
- execute_process(COMMAND ${CMAKE_COMMAND} --build .
- RESULT_VARIABLE result
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/external/googletest )
- if(result)
- message(FATAL_ERROR "Build step for googletest failed: ${result}")
- endif()
-endif()
-
-if(ANDROID)
- # Build an Android application.
-
- # Source files used for the Android build.
- set(FIREBASE_APP_FRAMEWORK_ANDROID_SRCS
- src/android/android_app_framework.cc
- )
-
- # Source files used for the Android build.
- set(FIREBASE_TEST_FRAMEWORK_ANDROID_SRCS
- src/android/android_firebase_test_framework.cc
- )
-
- # Build native_app_glue as a static lib
- add_library(native_app_glue STATIC
- ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
-
- # Export ANativeActivity_onCreate(),
- # Refer to: https://github.com/android-ndk/ndk/issues/381.
- set(CMAKE_SHARED_LINKER_FLAGS
- "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
-
- add_library(gtest STATIC
- ${GOOGLETEST_ROOT}/src/googletest/src/gtest-all.cc)
- target_include_directories(gtest
- PRIVATE ${GOOGLETEST_ROOT}/src/googletest
- PUBLIC ${GOOGLETEST_ROOT}/src/googletest/include)
- add_library(gmock STATIC
- ${GOOGLETEST_ROOT}/src/googlemock/src/gmock-all.cc)
- target_include_directories(gmock
- PRIVATE ${GOOGLETEST_ROOT}/src/googletest
- PRIVATE ${GOOGLETEST_ROOT}/src/googlemock
- PUBLIC ${GOOGLETEST_ROOT}/src/googletest/include
- PUBLIC ${GOOGLETEST_ROOT}/src/googlemock/include)
-
- # Define the target as a shared library, as that is what gradle expects.
- set(integration_test_target_name "android_integration_test_main")
- add_library(${integration_test_target_name} SHARED
- ${FIREBASE_APP_FRAMEWORK_SRCS}
- ${FIREBASE_APP_FRAMEWORK_ANDROID_SRCS}
- ${FIREBASE_INTEGRATION_TEST_SRCS}
- ${FIREBASE_TEST_FRAMEWORK_SRCS}
- ${FIREBASE_TEST_FRAMEWORK_ANDROID_SRCS}
- )
-
- target_include_directories(${integration_test_target_name} PRIVATE
- ${ANDROID_NDK}/sources/android/native_app_glue)
-
- set(ADDITIONAL_LIBS log android atomic native_app_glue)
-else()
- # Build a desktop application.
- add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
-
- # Prevent overriding the parent project's compiler/linker
- # settings on Windows
- set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-
- # Add googletest directly to our build. This defines
- # the gtest and gtest_main targets.
- add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/external/googletest/src
- ${CMAKE_CURRENT_LIST_DIR}/external/googletest/build
- EXCLUDE_FROM_ALL)
-
- # The gtest/gtest_main targets carry header search path
- # dependencies automatically when using CMake 2.8.11 or
- # later. Otherwise we have to add them here ourselves.
- if (CMAKE_VERSION VERSION_LESS 2.8.11)
- include_directories("${gtest_SOURCE_DIR}/include")
- include_directories("${gmock_SOURCE_DIR}/include")
- endif()
-
- # Windows runtime mode, either MD or MT depending on whether you are using
- # /MD or /MT. For more information see:
- # https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
- set(MSVC_RUNTIME_MODE MD)
-
- # Platform abstraction layer for the desktop integration test.
- set(FIREBASE_APP_FRAMEWORK_DESKTOP_SRCS
- src/desktop/desktop_app_framework.cc
- src/desktop/desktop_firebase_test_framework.cc
- )
-
- set(integration_test_target_name "integration_test")
- add_executable(${integration_test_target_name}
- ${FIREBASE_APP_FRAMEWORK_SRCS}
- ${FIREBASE_APP_FRAMEWORK_DESKTOP_SRCS}
- ${FIREBASE_TEST_FRAMEWORK_SRCS}
- ${FIREBASE_INTEGRATION_TEST_SRCS}
- )
-
- if(APPLE)
- set(ADDITIONAL_LIBS
- gssapi_krb5
- pthread
- "-framework CoreFoundation"
- "-framework Foundation"
- "-framework GSS"
- "-framework Security"
- )
- elseif(MSVC)
- set(ADDITIONAL_LIBS advapi32 ws2_32 crypt32)
- else()
- set(ADDITIONAL_LIBS pthread)
- endif()
-
- # If a config file is present, copy it into the binary location so that it's
- # possible to create the default Firebase app.
- set(FOUND_JSON_FILE FALSE)
- foreach(config "google-services-desktop.json" "google-services.json")
- if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/${config}")
- add_custom_command(
- TARGET ${integration_test_target_name} POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy
- "${CMAKE_CURRENT_LIST_DIR}/${config}" $)
- set(FOUND_JSON_FILE TRUE)
- break()
- endif()
- endforeach()
- if(NOT FOUND_JSON_FILE)
- message(WARNING "Failed to find either google-services-desktop.json or google-services.json. See the readme.md for more information.")
- endif()
-endif()
-
-# Add the Firebase libraries to the target using the function from the SDK.
-add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL)
-# Note that firebase_app needs to be last in the list.
-set(firebase_libs firebase_gma firebase_app)
-set(gtest_libs gtest gmock)
-target_link_libraries(${integration_test_target_name} ${firebase_libs}
- ${gtest_libs} ${ADDITIONAL_LIBS})
diff --git a/gma/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json b/gma/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index d8db8d65fd..0000000000
--- a/gma/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "iphone",
- "size" : "20x20",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "20x20",
- "scale" : "3x"
- },
- {
- "idiom" : "iphone",
- "size" : "29x29",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "29x29",
- "scale" : "3x"
- },
- {
- "idiom" : "iphone",
- "size" : "40x40",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "40x40",
- "scale" : "3x"
- },
- {
- "idiom" : "iphone",
- "size" : "60x60",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "60x60",
- "scale" : "3x"
- },
- {
- "idiom" : "ipad",
- "size" : "20x20",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "20x20",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "29x29",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "29x29",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "40x40",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "40x40",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "76x76",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "76x76",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "83.5x83.5",
- "scale" : "2x"
- },
- {
- "idiom" : "ios-marketing",
- "size" : "1024x1024",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/gma/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json b/gma/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json
deleted file mode 100644
index 6f870a4629..0000000000
--- a/gma/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "images" : [
- {
- "orientation" : "portrait",
- "idiom" : "iphone",
- "extent" : "full-screen",
- "minimum-system-version" : "7.0",
- "scale" : "2x"
- },
- {
- "orientation" : "portrait",
- "idiom" : "iphone",
- "subtype" : "retina4",
- "extent" : "full-screen",
- "minimum-system-version" : "7.0",
- "scale" : "2x"
- },
- {
- "orientation" : "portrait",
- "idiom" : "ipad",
- "extent" : "full-screen",
- "minimum-system-version" : "7.0",
- "scale" : "1x"
- },
- {
- "orientation" : "landscape",
- "idiom" : "ipad",
- "extent" : "full-screen",
- "minimum-system-version" : "7.0",
- "scale" : "1x"
- },
- {
- "orientation" : "portrait",
- "idiom" : "ipad",
- "extent" : "full-screen",
- "minimum-system-version" : "7.0",
- "scale" : "2x"
- },
- {
- "orientation" : "landscape",
- "idiom" : "ipad",
- "extent" : "full-screen",
- "minimum-system-version" : "7.0",
- "scale" : "2x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/gma/integration_test/Info.plist b/gma/integration_test/Info.plist
deleted file mode 100644
index 953571e326..0000000000
--- a/gma/integration_test/Info.plist
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
- GADApplicationIdentifier
- ca-app-pub-3940256099942544~1458002511
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- 1.0
- CFBundleVersion
- 1
- LSRequiresIPhoneOS
-
- UILaunchStoryboardName
- LaunchScreen
- NSUserTrackingUsageDescription
- This identifier will be used to deliver personalized ads to you.
- CFBundleURLTypes
-
-
- CFBundleURLSchemes
-
- REPLACE_WITH_REVERSED_CLIENT_ID
- firebase-game-loop
- firebase-ui-test
-
-
-
-
-
diff --git a/gma/integration_test/LaunchScreen.storyboard b/gma/integration_test/LaunchScreen.storyboard
deleted file mode 100644
index 673e0f7e68..0000000000
--- a/gma/integration_test/LaunchScreen.storyboard
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/gma/integration_test/LibraryManifest.xml b/gma/integration_test/LibraryManifest.xml
deleted file mode 100644
index a5db8d174d..0000000000
--- a/gma/integration_test/LibraryManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
diff --git a/gma/integration_test/Podfile b/gma/integration_test/Podfile
deleted file mode 100644
index c0d08178b1..0000000000
--- a/gma/integration_test/Podfile
+++ /dev/null
@@ -1,18 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '13.0'
-# Firebase GMA test application.
-use_frameworks! :linkage => :static
-
-target 'integration_test' do
- platform :ios, '13.0'
- pod 'Firebase/CoreOnly', '11.14.0'
- pod 'Google-Mobile-Ads-SDK', '11.2.0'
- pod 'GoogleUserMessagingPlatform', '2.3.0'
-end
-
-post_install do |installer|
- # If this is running from inside the SDK directory, run the setup script.
- system("if [[ -r ../../setup_integration_tests.py ]]; then python3 ../../setup_integration_tests.py .; fi")
- system("python3 ./download_googletest.py")
-end
-
diff --git a/gma/integration_test/build.gradle b/gma/integration_test/build.gradle
deleted file mode 100644
index 16f9d2b87e..0000000000
--- a/gma/integration_test/build.gradle
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// 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.
-
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-buildscript {
- repositories {
- mavenLocal()
- maven { url 'https://maven.google.com' }
- mavenCentral()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:7.4.2'
- // r8 on this version of the Android tools has a bug,
- // so specify a different version to use.
- classpath 'com.android.tools:r8:8.3.37'
- classpath 'com.google.gms:google-services:4.4.1'
- }
-}
-
-allprojects {
- repositories {
- mavenLocal()
- maven { url 'https://maven.google.com' }
- mavenCentral()
- }
-}
-
-apply plugin: 'com.android.application'
-
-android {
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
- }
- compileSdkVersion 34
- ndkPath System.getenv('ANDROID_NDK_HOME')
- buildToolsVersion '32.0.0'
-
- sourceSets {
- main {
- jniLibs.srcDirs = ['libs']
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src/android/java']
- res.srcDirs = ['res']
- }
- }
-
- defaultConfig {
- applicationId 'com.google.android.admob.testapp'
- minSdkVersion 23
- targetSdkVersion 34
- versionCode 1
- versionName '1.0'
- externalNativeBuild.cmake {
- arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir"
- }
- multiDexEnabled true
- }
- externalNativeBuild.cmake {
- path 'CMakeLists.txt'
- }
- buildTypes {
- release {
- minifyEnabled true
- proguardFile getDefaultProguardFile('proguard-android.txt')
- proguardFile file('proguard.pro')
- }
- }
- lintOptions {
- abortOnError false
- }
-}
-
-apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
-firebaseCpp.dependencies {
- gma
-}
-
-apply plugin: 'com.google.gms.google-services'
-
-task copyIntegrationTestFiles(type:Exec) {
- // If this is running form inside the SDK directory, run the setup script.
- if (project.file('../../setup_integration_tests.py').exists()) {
- commandLine 'python3', '../../setup_integration_tests.py', project.projectDir.toString()
- }
- else {
- commandLine 'echo', ''
- }
-}
-
-build.dependsOn(copyIntegrationTestFiles)
-
-project.afterEvaluate {
- project.tasks.withType(com.android.build.gradle.internal.tasks.CheckAarMetadataTask) {
- enabled = false
- }
-}
diff --git a/gma/integration_test/empty.swift b/gma/integration_test/empty.swift
deleted file mode 100644
index b637790955..0000000000
--- a/gma/integration_test/empty.swift
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// empty.swift
-// integration_test
-//
-// Created by David Della Bitta on 5/12/22.
-// Copyright © 2022 Google. All rights reserved.
-//
-
-import Foundation
diff --git a/gma/integration_test/googletest.cmake b/gma/integration_test/googletest.cmake
deleted file mode 100644
index a643a3e2f2..0000000000
--- a/gma/integration_test/googletest.cmake
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# 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.
-
-# Download GoogleTest from GitHub as an external project.
-# Pin to 1.11.0 because we touch internal GoogleTest structures that could change in the future.
-
-# This CMake file is taken from:
-# https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-into-an-existing-cmake-project
-
-cmake_minimum_required(VERSION 2.8.2)
-
-project(googletest-download NONE)
-
-include(ExternalProject)
-ExternalProject_Add(googletest
- GIT_REPOSITORY https://github.com/google/googletest.git
- GIT_TAG "release-1.11.0"
- SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/src"
- BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/build"
- CONFIGURE_COMMAND ""
- BUILD_COMMAND ""
- INSTALL_COMMAND ""
- TEST_COMMAND ""
-)
diff --git a/gma/integration_test/gradle.properties b/gma/integration_test/gradle.properties
deleted file mode 100644
index ac891ac594..0000000000
--- a/gma/integration_test/gradle.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-android.useAndroidX = true
-org.gradle.jvmargs=-Xmx2560m
diff --git a/gma/integration_test/gradle/wrapper/gradle-wrapper.jar b/gma/integration_test/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 8c0fb64a8698b08ecc4158d828ca593c4928e9dd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 49896
zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~
zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR
z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN
z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+
z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl-
zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo
z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy
z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I
zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~
z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu
z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J
z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa
zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5
zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh
zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK
zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A
zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw
zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E%
zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1
zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S|
zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh**
z
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