From 8732ccf6e92831cffbe9dd8a16ebecc5d1e2873d Mon Sep 17 00:00:00 2001
From: joefspiro <97258781+joefspiro@users.noreply.github.com>
Date: Fri, 22 Aug 2025 15:42:07 -0400
Subject: [PATCH 1/5] Alters FCM readme to refer directly to permanent docs.
---
messaging/testapp/readme.md | 245 ++++--------------------------------
1 file changed, 26 insertions(+), 219 deletions(-)
diff --git a/messaging/testapp/readme.md b/messaging/testapp/readme.md
index ea47af73..6bed21a3 100644
--- a/messaging/testapp/readme.md
+++ b/messaging/testapp/readme.md
@@ -1,241 +1,48 @@
Firebase Cloud Messaging Quickstart
===================================
-The Firebase Cloud Messaging Test Application (testapp) demonstrates receiving
-Firebase Cloud Messages using the Firebase Cloud Messaging C++ SDK. This
+The Firebase Messaging C++ Sample (hereafter the 'test app') demonstrates receiving messages from [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/)
+using the [Firebase C++ SDK](https://firebase.google.com/docs/cpp/setup). This
application has no user interface and simply logs actions it's performing to the
console.
-Introduction
-------------
+## Set up, build and run the test app
-- [Read more about Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/)
+> **_NOTE:_** Do not implement the code changes of the subsequent linked instructions as this codebase already has those functionalities.
-Building and Running the testapp
---------------------------------
-### iOS
- - Link your iOS app to the Firebase libraries.
- - Get CocoaPods version 1 or later by running,
+1. Complete [Add Firebase to your C++ project](https://firebase.google.com/docs/cpp/setup) for your selected build platforms.
+1. [Set up a Firebase Cloud Messaging client app with C++](https://firebase.google.com/docs/cloud-messaging/cpp/client).
- ```
- sudo gem install cocoapods --pre
- ```
- - From the testapp directory, install the CocoaPods listed in the Podfile by
- running,
- ```
- pod install
- ```
- - Open the generated Xcode workspace (which now has the CocoaPods),
-
- ```
- open testapp.xcworkspace
- ```
- - For further details please refer to the
- [general instructions for setting up an iOS app with Firebase](https://firebase.google.com/docs/ios/setup).
-
- - Register your iOS app with Firebase.
- - Create a new app on
- [firebase.google.com/console](https://firebase.google.com/console/)
- , and attach your iOS app to it.
- - For Messaging, you will need an App Store ID. Use something random such
- as 12345678."
- - You can use "com.google.FirebaseCppMessagingTestApp.dev" as the iOS Bundle ID
- while you're testing.
- - Add the GoogleService-Info.plist that you downloaded from Firebase
- console to the testapp root directory. This file identifies your iOS app
- to the Firebase backend.
- - Download the Firebase C++ SDK linked from
- [https://firebase.google.com/docs/cpp/setup](https://firebase.google.com/docs/cpp/setup)
- and unzip it to a directory of your choice.
- - Add the following frameworks from the Firebase C++ SDK to the project:
- - frameworks/ios/universal/firebase.framework
- - frameworks/ios/universal/firebase_messaging.framework
- - You will need to either,
- 1. Check "Copy items if needed" when adding the frameworks, or
- 2. Add the framework path in "Framework Search Paths"
- - e.g. If you downloaded the Firebase C++ SDK to
- `/Users/me/firebase_cpp_sdk`,
- then you would add the path
- `/Users/me/firebase_cpp_sdk/frameworks/ios/universal`.
- - To add the path, in XCode, select your project in the project
- navigator, then select your target in the main window.
- Select the "Build Settings" tab, and click "All" to see all
- the build settings. Scroll down to "Search Paths", and add
- your path to "Framework Search Paths".
- - You need a valid
- [APNs](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html)
- certificate. If you don't already have one, see
- [Provisioning APNs SSL Certificates.](https://firebase.google.com/docs/cloud-messaging/ios/certs)
- - Configure the Xcode project for push messaging.
- - Select the `testapp` project from the `Navigator area`.
- - Select the `testapp` target from the `Editor area`.
- - Select the `General` tab from the `Editor area`.
- - Scroll down to `Linked Frameworks and Libraries` and click the `+`
- button to add a framework.
- - In the window that appears, scroll to `UserNotifications.framework`
- and click on that entry, then click on `Add`. This framework will only
- appear in Xcode version 8 and higher, required by this library.
- - Select the `Capabilities` tab from the `Editor area`.
- - Switch `Push Notifications` to `On`.
- - Scroll down to `Background Modes` and switch it to `On`.
- - Tick the `Remote notifications` box under `Background Modes`.
- - In XCode, build & run the sample on an iOS device or simulator.
- - The testapp has no user interface. The output of the app can be viewed
- via the console. In Xcode, select
- `View --> Debug Area --> Activate Console` from the menu.
-
-### Android
-**Register your Android app with Firebase.**
-
-- Create a new app on
-[firebase.google.com/console](https://firebase.google.com/console/)
-, and attach your Android app to it.
-- You can use "com.google.android.messaging.testapp" as the Package Name
-while you're testing.
-- To [generate a SHA1](https://developers.google.com/android/guides/client-auth)
-run this command (_Note: the default password is 'android'_):
- * Mac and Linux:
-
- ```
- keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
- ```
- * Windows:
-
- ```
- keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
- ```
-- If keytool reports that you do not have a debug.keystore, you can
-[create one](http://developer.android.com/tools/publishing/app-signing.html#signing-manually)
-with:
-
- ```
- keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"
- ```
-- Add the `google-services.json` file that you downloaded from Firebase
- console to the root directory of testapp. This file identifies your
- Android app to the Firebase backend.
-- For further details please refer to the
-[general instructions for setting up an Android app with Firebase](https://firebase.google.com/docs/android/setup).
-
-- Download the Firebase C++ SDK linked from
- [https://firebase.google.com/docs/cpp/setup](https://firebase.google.com/docs/cpp/setup)
- and unzip it to a directory of your choice.
-
-**Configure your SDK paths**
-
-- Configure the location of the Firebase C++ SDK by setting the
-`firebase_cpp_sdk.dir` Gradle property to the SDK install directory.
- * Run this command in the project directory, and modify the path to match your
- local installation path:
-
- ```
- echo "systemProp.firebase_cpp_sdk.dir=/User/$USER/firebase_cpp_sdk" >> gradle.properties
- ```
-- Ensure the Android SDK and NDK locations are set in Android Studio.
- * From the Android Studio launch menu, go to `File/Project Structure...` or
- `Configure/Project Defaults/Project Structure...`
- (Shortcut: Control + Alt + Shift + S on windows, Command + ";" on a mac)
- and download the SDK and NDK if the locations are not yet set.
- * Android Studio will write these paths to `local.properties`.
-
-**Optional: Configure your deep link URL**
-
-- To enable your app to receive deep links via FCM, you will need to add an
- intent filter to your AndroidManifest.xml in the native activity that
- associates your domain with your app.
-
-```
-
-
-
-
-
-
-
-```
-
-**Build & Run**
-
-- Open `build.gradle` in Android Studio.
- - From the Android Studio launch menu, "Open an existing Android Studio
- project", and select `build.gradle`.
-- Install the SDK Platforms that Android Studio reports missing.
-- Build the testapp and run it on an Android device or emulator.
-- See [below](#using_the_test_app) for usage instructions.
-
-### Desktop
- - Register your app with Firebase.
- - Create a new app on the [Firebase console](https://firebase.google.com/console/),
- following the above instructions for Android or iOS.
- - If you have an Android project, add the `google-services.json` file that
- you downloaded from the Firebase console to the root directory of the
- testapp.
- - If you have an iOS project, and don't wish to use an Android project,
- you can use the Python script `generate_xml_from_google_services_json.py --plist`,
- located in the Firebase C++ SDK, to convert your `GoogleService-Info.plist`
- file into a `google-services-desktop.json` file, which can then be
- placed in the root directory of the testapp.
- - Download the Firebase C++ SDK linked from
- [https://firebase.google.com/docs/cpp/setup](https://firebase.google.com/docs/cpp/setup)
- and unzip it to a directory of your choice.
- - Configure the testapp with the location of the Firebase C++ SDK.
- This can be done a couple different ways (in highest to lowest priority):
- - When invoking cmake, pass in the location with
- -DFIREBASE_CPP_SDK_DIR=/path/to/firebase_cpp_sdk.
- - Set an environment variable for FIREBASE_CPP_SDK_DIR to the path to use.
- - Edit the CMakeLists.txt file, changing the FIREBASE_CPP_SDK_DIR path
- to the appropriate location.
- - From the testapp directory, generate the build files by running,
- ```
- cmake .
- ```
- If you want to use XCode, you can use -G"Xcode" to generate the project.
- Similarly, to use Visual Studio, -G"Visual Studio 15 2017". For more
- information, see
- [CMake generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html).
- - Build the testapp, by either opening the generated project file based on
- the platform, or running,
- ```
- cmake --build .
- ```
- - Execute the testapp by running,
- ```
- ./desktop_testapp
- ```
- Note that the executable might be under another directory, such as Debug.
- - The testapp has no user interface, but the output can be viewed via the
- console. Note that Messaging uses a stubbed implementation on desktop,
- so functionality is not expected.
-
-Using the Test App
-------------------
+### Running the test app
+----------------------
- Install and run the test app on your iOS or Android device or emulator.
- The application has minimal user interface. The output of the app can be
viewed via the console:
- * **iOS**: Open select "View --> Debug Area --> Activate Console" from the
+ * **iOS**: Open select "View -> Debug Area -> Activate Console" from the
menu in Xcode.
* **Android**: View the logcat output in Android studio or by running
- "adb logcat" from the command line.
+ `adb logcat` from the command line.
- When you first run the app, it will print:
`Received Registration Token: `. Copy this code to a text editor.
-- Copy the ServerKey from the firebase console:
- - Open your project in the
- [Firebase Console](https://firebase.google.com/console/).
- - Click the gear icon then `Project settings` in the menu on the left
- - Select the `Cloud Messaging` tab.
- - Copy the `Server Key`
-- Replace `` and `` in this command and run it
-from the command line.
-```
-curl --header "Authorization: key=" --header "Content-Type: application/json" https://android.googleapis.com/gcm/send -d '{"notification":{"title":"Hi","body":"Hello from the Cloud"},"data":{"score":"lots"},"to":""}'
-```
-- Observe the command received in the app, via the console output.
-Support
--------
+### Send a message from your server environment
+-----------------------------------------------
+
+1. Navigate to the FCM REST API Docs for [Method: projects.messages.send](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages/send)
+1. Look for the "Try this method" panel
+ 1. This might require you to expand your browser window.
+1. Follow the API doc to understand what IDs and fields to fill in for your particular use case.
+ 1. Your project number is available from [Project settings](https://console.firebase.google.com/project/_/settings/general)
+1. Fill in the `Request body` referencing the [FCM REST API docs](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages).
+1. Execute.
+1. Observe the command received in the app, via the console output.
+
+Reminder, while this process is currently done from our website, it uses the FCM v1 Send API directly and provides the simplest starting point to switch to using the Send API or Admin SDKs in production.
-[https://firebase.google.com/support/](https://firebase.google.com/support/)
+## Troubleshooting and Support
+- [Firebase Cloud Messaging troubleshooting & FAQ](https://firebase.google.com/docs/cloud-messaging/troubleshooting)
+- [Firebase Support](https://firebase.google.com/support/)
License
-------
From 0618c447dd927c3faab803866af2b73080421244 Mon Sep 17 00:00:00 2001
From: joefspiro <97258781+joefspiro@users.noreply.github.com>
Date: Fri, 22 Aug 2025 15:43:24 -0400
Subject: [PATCH 2/5] Fixes a style issue.
---
messaging/testapp/readme.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messaging/testapp/readme.md b/messaging/testapp/readme.md
index 6bed21a3..c5a59969 100644
--- a/messaging/testapp/readme.md
+++ b/messaging/testapp/readme.md
@@ -38,7 +38,7 @@ viewed via the console:
1. Execute.
1. Observe the command received in the app, via the console output.
-Reminder, while this process is currently done from our website, it uses the FCM v1 Send API directly and provides the simplest starting point to switch to using the Send API or Admin SDKs in production.
+Reminder, while this process is currently done from our website, it uses the FCM v1 Send API directly and provides the simplest starting point to switch to using the v1 Send API or the Firebase Admin SDK in production.
## Troubleshooting and Support
- [Firebase Cloud Messaging troubleshooting & FAQ](https://firebase.google.com/docs/cloud-messaging/troubleshooting)
From 2c8628995edccd2569e8ef6debeb96868f88f410 Mon Sep 17 00:00:00 2001
From: Ben Knutson
Date: Wed, 18 Feb 2026 16:17:13 +0000
Subject: [PATCH 3/5] Refactor Github Action per b/485167538
---
.github/workflows/android.yml | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index e086d3f9..5caea503 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -30,12 +30,14 @@ jobs:
- id: set_outputs
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
- apis="${{ github.event.inputs.apis }}"
+ apis="${GITHUB_EVENT_INPUTS_APIS}"
else
apis="analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage"
fi
echo apis: ${apis}
echo "::set-output name=apis::${apis}"
+ env:
+ GITHUB_EVENT_INPUTS_APIS: ${{ github.event.inputs.apis }}
build:
name: android-${{ matrix.os }}-${{ matrix.architecture }}-${{ matrix.python_version }}
@@ -156,13 +158,15 @@ jobs:
run: |
set -x
python scripts/build_scripts/build_testapps.py --p Android \
- --t ${{ needs.check_and_prepare.outputs.apis }} \
+ --t ${NEEDS_CHECK_AND_PREPARE_OUTPUTS_APIS} \
--output_directory "${{ github.workspace }}" \
--artifact_name "android-${{ matrix.os }}" \
--noadd_timestamp \
--short_output_paths \
--gha_build \
--packaged_sdk /tmp/downloaded_sdk/firebase_cpp_sdk
+ env:
+ NEEDS_CHECK_AND_PREPARE_OUTPUTS_APIS: ${{ needs.check_and_prepare.outputs.apis }}
- name: Stats for ccache (mac and linux)
if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos')
@@ -204,6 +208,8 @@ jobs:
shell: bash
run: |
cat build-results-android-${{ matrix.os }}.log
- if [[ "${{ job.status }}" != "success" ]]; then
+ if [[ "${JOB_STATUS}" != "success" ]]; then
exit 1
fi
+ env:
+ JOB_STATUS: ${{ job.status }}
From fc0b9392d73a22eb5b27ba643ed4c83110dec6b8 Mon Sep 17 00:00:00 2001
From: a-maurice
Date: Mon, 23 Feb 2026 14:32:56 -0800
Subject: [PATCH 4/5] Update android.yml
---
.github/workflows/android.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 5caea503..9a597262 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -157,8 +157,9 @@ jobs:
shell: bash
run: |
set -x
+ CLEAN_APIS=$(echo ${NEEDS_CHECK_AND_PREPARE_OUTPUTS_APIS} | tr -d "'" | tr -d "\"")
python scripts/build_scripts/build_testapps.py --p Android \
- --t ${NEEDS_CHECK_AND_PREPARE_OUTPUTS_APIS} \
+ --t ${CLEAN_APIS} \
--output_directory "${{ github.workspace }}" \
--artifact_name "android-${{ matrix.os }}" \
--noadd_timestamp \
From 6ec1960dbe47ef1067e3089156beb1541b2409da Mon Sep 17 00:00:00 2001
From: a-maurice
Date: Tue, 24 Feb 2026 11:52:11 -0800
Subject: [PATCH 5/5] Remove unused workflows, and Dynamic Links (#167)
---
.github/workflows/android.yml | 216 -
.github/workflows/desktop.yml | 14 -
.github/workflows/ios.yml | 14 -
dynamic_links/testapp/AndroidManifest.xml | 23 -
dynamic_links/testapp/CMakeLists.txt | 118 -
dynamic_links/testapp/LICENSE | 202 -
dynamic_links/testapp/LaunchScreen.storyboard | 7 -
dynamic_links/testapp/Podfile | 7 -
dynamic_links/testapp/build.gradle | 76 -
dynamic_links/testapp/gradle.properties | 1 -
.../testapp/gradle/wrapper/gradle-wrapper.jar | Bin 49896 -> 0 bytes
.../gradle/wrapper/gradle-wrapper.properties | 7 -
dynamic_links/testapp/gradlew | 164 -
dynamic_links/testapp/gradlew.bat | 90 -
dynamic_links/testapp/proguard.pro | 2 -
dynamic_links/testapp/readme.md | 223 -
dynamic_links/testapp/res/layout/main.xml | 12 -
dynamic_links/testapp/res/values/strings.xml | 4 -
dynamic_links/testapp/settings.gradle | 36 -
.../testapp/src/android/android_main.cc | 255 -
.../google/firebase/example/LoggingUtils.java | 55 -
dynamic_links/testapp/src/common_main.cc | 203 -
.../testapp/src/desktop/desktop_main.cc | 125 -
dynamic_links/testapp/src/ios/ios_main.mm | 120 -
dynamic_links/testapp/src/main.h | 63 -
.../testapp/testapp.xcodeproj/project.pbxproj | 312 -
.../AppIcon.appiconset/Contents.json | 58 -
.../LaunchImage.launchimage/Contents.json | 51 -
dynamic_links/testapp/testapp/Info.plist | 55 -
functions/testapp/functions/package-lock.json | 8246 -----------------
.../build_scripts/android/install_prereqs.sh | 75 -
scripts/build_scripts/build_testapps.json | 170 -
scripts/build_scripts/build_testapps.py | 718 --
scripts/build_scripts/config_reader.py | 139 -
scripts/build_scripts/python_requirements.txt | 2 -
scripts/build_scripts/utils.py | 94 -
scripts/build_scripts/xcodebuild.py | 119 -
scripts/gha-encrypted/README | 3 -
.../analytics/GoogleService-Info.plist.gpg | Bin 670 -> 0 bytes
.../analytics/google-services.json.gpg | Bin 962 -> 0 bytes
.../auth/GoogleService-Info.plist.gpg | 3 -
.../auth/google-services.json.gpg | Bin 1007 -> 0 bytes
.../database/GoogleService-Info.plist.gpg | Bin 700 -> 0 bytes
.../database/google-services.json.gpg | Bin 725 -> 0 bytes
.../GoogleService-Info.plist.gpg | Bin 649 -> 0 bytes
.../dynamic_links/google-services.json.gpg | 3 -
.../firestore/GoogleService-Info.plist.gpg | Bin 597 -> 0 bytes
.../firestore/google-services.json.gpg | Bin 523 -> 0 bytes
.../functions/GoogleService-Info.plist.gpg | Bin 674 -> 0 bytes
.../functions/google-services.json.gpg | Bin 525 -> 0 bytes
.../gma/GoogleService-Info.plist.gpg | Bin 663 -> 0 bytes
.../gma/google-services.json.gpg | Bin 953 -> 0 bytes
.../messaging/GoogleService-Info.plist.gpg | Bin 681 -> 0 bytes
.../messaging/google-services.json.gpg | Bin 609 -> 0 bytes
.../GoogleService-Info.plist.gpg | Bin 614 -> 0 bytes
.../remote_config/google-services.json.gpg | Bin 848 -> 0 bytes
.../storage/GoogleService-Info.plist.gpg | Bin 641 -> 0 bytes
.../storage/google-services.json.gpg | Bin 779 -> 0 bytes
scripts/restore_secrets.py | 186 -
59 files changed, 12271 deletions(-)
delete mode 100644 .github/workflows/android.yml
delete mode 100644 .github/workflows/desktop.yml
delete mode 100644 .github/workflows/ios.yml
delete mode 100644 dynamic_links/testapp/AndroidManifest.xml
delete mode 100644 dynamic_links/testapp/CMakeLists.txt
delete mode 100644 dynamic_links/testapp/LICENSE
delete mode 100644 dynamic_links/testapp/LaunchScreen.storyboard
delete mode 100644 dynamic_links/testapp/Podfile
delete mode 100644 dynamic_links/testapp/build.gradle
delete mode 100644 dynamic_links/testapp/gradle.properties
delete mode 100644 dynamic_links/testapp/gradle/wrapper/gradle-wrapper.jar
delete mode 100644 dynamic_links/testapp/gradle/wrapper/gradle-wrapper.properties
delete mode 100755 dynamic_links/testapp/gradlew
delete mode 100644 dynamic_links/testapp/gradlew.bat
delete mode 100644 dynamic_links/testapp/proguard.pro
delete mode 100644 dynamic_links/testapp/readme.md
delete mode 100644 dynamic_links/testapp/res/layout/main.xml
delete mode 100644 dynamic_links/testapp/res/values/strings.xml
delete mode 100644 dynamic_links/testapp/settings.gradle
delete mode 100644 dynamic_links/testapp/src/android/android_main.cc
delete mode 100644 dynamic_links/testapp/src/android/java/com/google/firebase/example/LoggingUtils.java
delete mode 100644 dynamic_links/testapp/src/common_main.cc
delete mode 100644 dynamic_links/testapp/src/desktop/desktop_main.cc
delete mode 100644 dynamic_links/testapp/src/ios/ios_main.mm
delete mode 100644 dynamic_links/testapp/src/main.h
delete mode 100644 dynamic_links/testapp/testapp.xcodeproj/project.pbxproj
delete mode 100644 dynamic_links/testapp/testapp/Images.xcassets/AppIcon.appiconset/Contents.json
delete mode 100644 dynamic_links/testapp/testapp/Images.xcassets/LaunchImage.launchimage/Contents.json
delete mode 100644 dynamic_links/testapp/testapp/Info.plist
delete mode 100644 functions/testapp/functions/package-lock.json
delete mode 100755 scripts/build_scripts/android/install_prereqs.sh
delete mode 100644 scripts/build_scripts/build_testapps.json
delete mode 100644 scripts/build_scripts/build_testapps.py
delete mode 100644 scripts/build_scripts/config_reader.py
delete mode 100644 scripts/build_scripts/python_requirements.txt
delete mode 100644 scripts/build_scripts/utils.py
delete mode 100644 scripts/build_scripts/xcodebuild.py
delete mode 100644 scripts/gha-encrypted/README
delete mode 100644 scripts/gha-encrypted/analytics/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/analytics/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/auth/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/auth/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/database/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/database/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/dynamic_links/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/dynamic_links/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/firestore/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/firestore/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/functions/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/functions/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/gma/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/gma/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/messaging/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/messaging/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/remote_config/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/remote_config/google-services.json.gpg
delete mode 100644 scripts/gha-encrypted/storage/GoogleService-Info.plist.gpg
delete mode 100644 scripts/gha-encrypted/storage/google-services.json.gpg
delete mode 100644 scripts/restore_secrets.py
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
deleted file mode 100644
index 9a597262..00000000
--- a/.github/workflows/android.yml
+++ /dev/null
@@ -1,216 +0,0 @@
-name: Android Builds
-
-on:
- schedule:
- - cron: "0 9 * * *" # 9am UTC = 1am PST / 2am PDT. for all testapps except firestore
- pull_request:
- types: [opened, reopened, synchronize]
- workflow_dispatch:
- inputs:
- apis:
- description: 'CSV of apis to build and test'
- default: 'analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage'
- required: true
-
-env:
- CCACHE_DIR: ${{ github.workspace }}/ccache_dir
- GITHUB_TOKEN: ${{ github.token }}
- xcodeVersion: "13.3.1" # Only affects Mac runners, and only for prerequisites.
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.head_ref || github.ref }}
- cancel-in-progress: true
-
-jobs:
- check_and_prepare:
- runs-on: ubuntu-latest
- outputs:
- apis: ${{ steps.set_outputs.outputs.apis }}
- steps:
- - id: set_outputs
- run: |
- if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
- apis="${GITHUB_EVENT_INPUTS_APIS}"
- else
- apis="analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage"
- fi
- echo apis: ${apis}
- echo "::set-output name=apis::${apis}"
- env:
- GITHUB_EVENT_INPUTS_APIS: ${{ github.event.inputs.apis }}
-
- build:
- name: android-${{ matrix.os }}-${{ matrix.architecture }}-${{ matrix.python_version }}
- runs-on: ${{ matrix.os }}
- needs: [check_and_prepare]
- strategy:
- fail-fast: false
- matrix:
- os: [macos-12, ubuntu-latest, windows-latest]
- architecture: [x64]
- python_version: [3.7]
- steps:
- - name: setup Xcode version (macos)
- if: runner.os == 'macOS'
- run: sudo xcode-select -s /Applications/Xcode_${{ env.xcodeVersion }}.app/Contents/Developer
-
- - name: Store git credentials for all git commands
- # Forces all git commands to use authenticated https, to prevent throttling.
- shell: bash
- run: |
- git config --global credential.helper 'store --file /tmp/git-credentials'
- echo 'https://${{ github.token }}@github.com' > /tmp/git-credentials
-
- - name: Enable Git Long-paths Support
- if: runner.os == 'Windows'
- run: git config --system core.longpaths true
-
- - uses: actions/checkout@v2
- with:
- submodules: true
-
- - name: Set env variables for subsequent steps (all)
- shell: bash
- run: |
- echo "MATRIX_UNIQUE_NAME=${{ matrix.os }}-${{ matrix.architecture }}" >> $GITHUB_ENV
- echo "GHA_INSTALL_CCACHE=1" >> $GITHUB_ENV
-
- - name: Setup python
- uses: actions/setup-python@v2
- with:
- python-version: ${{ matrix.python_version }}
- architecture: ${{ matrix.architecture }}
-
- - name: Add msbuild to PATH
- if: startsWith(matrix.os, 'windows')
- uses: microsoft/setup-msbuild@v1.0.2
-
- - name: Cache NDK
- id: cache_ndk
- uses: actions/cache@v2
- with:
- path: /tmp/android-ndk-r21e
- key: android-ndk-${{ matrix.os }}-r21e
-
- - name: Check cached NDK
- shell: bash
- if: steps.cache_ndk.outputs.cache-hit != 'true'
- run: |
- # If the NDK failed to download from the cache, but there is a
- # /tmp/android-ndk-r21e directory, it's incomplete, so remove it.
- if [[ -d "/tmp/android-ndk-r21e" ]]; then
- echo "Removing incomplete download of NDK"
- rm -rf /tmp/android-ndk-r21e
- fi
-
- - name: Update homebrew (avoid bintray errors)
- uses: nick-invision/retry@v2
- if: startsWith(matrix.os, 'macos')
- with:
- timeout_minutes: 10
- max_attempts: 3
- command: |
- # Temporarily here until Github runners have updated their version of
- # homebrew. This prevents errors arising from the shut down of
- # binutils, used by older version of homebrew for hosting packages.
- brew update
-
- - name: Install prerequisites
- uses: nick-invision/retry@v2
- with:
- timeout_minutes: 10
- max_attempts: 3
- shell: bash
- command: |
- scripts/build_scripts/android/install_prereqs.sh
- echo "NDK_ROOT=/tmp/android-ndk-r21e" >> $GITHUB_ENV
- echo "ANDROID_NDK_HOME=/tmp/android-ndk-r21e" >> $GITHUB_ENV
- pip install -r scripts/build_scripts/python_requirements.txt
- python scripts/restore_secrets.py --passphrase "${{ secrets.TEST_SECRET }}"
-
- - name: Download C++ SDK
- shell: bash
- run: |
- set +e
- # Retry up to 10 times because Curl has a tendency to timeout on
- # Github runners.
- for retry in {1..10} error; do
- if [[ $retry == "error" ]]; then exit 5; fi
- curl -LSs \
- "https://firebase.google.com/download/cpp" \
- --output firebase_cpp_sdk.zip && break
- sleep 300
- done
- set -e
- mkdir /tmp/downloaded_sdk
- unzip -q firebase_cpp_sdk.zip -d /tmp/downloaded_sdk/
- rm -f firebase_cpp_sdk.zip
-
- - name: Cache ccache files
- id: cache_ccache
- uses: actions/cache@v2
- with:
- path: ccache_dir
- key: dev-test-ccache-${{ env.MATRIX_UNIQUE_NAME }}
-
- - name: Build testapp
- shell: bash
- run: |
- set -x
- CLEAN_APIS=$(echo ${NEEDS_CHECK_AND_PREPARE_OUTPUTS_APIS} | tr -d "'" | tr -d "\"")
- python scripts/build_scripts/build_testapps.py --p Android \
- --t ${CLEAN_APIS} \
- --output_directory "${{ github.workspace }}" \
- --artifact_name "android-${{ matrix.os }}" \
- --noadd_timestamp \
- --short_output_paths \
- --gha_build \
- --packaged_sdk /tmp/downloaded_sdk/firebase_cpp_sdk
- env:
- NEEDS_CHECK_AND_PREPARE_OUTPUTS_APIS: ${{ needs.check_and_prepare.outputs.apis }}
-
- - name: Stats for ccache (mac and linux)
- if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos')
- run: ccache -s
-
- - name: Prepare results summary artifact
- if: ${{ !cancelled() }}
- shell: bash
- run: |
- if [ ! -f build-results-android-${{ matrix.os }}.log.json ]; then
- echo "__SUMMARY_MISSING__" > build-results-android-${{ matrix.os }}.log.json
- fi
-
- - name: Upload Android integration tests artifact
- uses: actions/upload-artifact@v3
- if: ${{ !cancelled() }}
- with:
- name: testapps-android-${{ matrix.os }}
- path: testapps-android-${{ matrix.os }}
- retention-days: ${{ env.artifactRetentionDays }}
-
- - name: Upload Android build results artifact
- uses: actions/upload-artifact@v3
- if: ${{ !cancelled() }}
- with:
- name: log-artifact
- path: build-results-android-${{ matrix.os }}*
- retention-days: ${{ env.artifactRetentionDays }}
-
- - name: Download log artifacts
- if: ${{ needs.check_and_prepare.outputs.pr_number && failure() && !cancelled() }}
- uses: actions/download-artifact@v3
- with:
- path: test_results
- name: log-artifact
-
- - name: Summarize build results
- if: ${{ !cancelled() }}
- shell: bash
- run: |
- cat build-results-android-${{ matrix.os }}.log
- if [[ "${JOB_STATUS}" != "success" ]]; then
- exit 1
- fi
- env:
- JOB_STATUS: ${{ job.status }}
diff --git a/.github/workflows/desktop.yml b/.github/workflows/desktop.yml
deleted file mode 100644
index b606cea0..00000000
--- a/.github/workflows/desktop.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: Desktop builds
-
-on:
- workflow_dispatch:
- inputs:
- apis:
- description: 'CSV of apis whose quickstart examples we should build'
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - name: noop
- run: true
diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml
deleted file mode 100644
index 72c85f64..00000000
--- a/.github/workflows/ios.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: iOS builds
-
-on:
- workflow_dispatch:
- inputs:
- apis:
- description: 'CSV of apis whose quickstart examples we should build'
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - name: noop
- run: true
diff --git a/dynamic_links/testapp/AndroidManifest.xml b/dynamic_links/testapp/AndroidManifest.xml
deleted file mode 100644
index 2aa60f2d..00000000
--- a/dynamic_links/testapp/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/dynamic_links/testapp/CMakeLists.txt b/dynamic_links/testapp/CMakeLists.txt
deleted file mode 100644
index 5574b351..00000000
--- a/dynamic_links/testapp/CMakeLists.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-# User settings for Firebase samples.
-# 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()
- set(DEFAULT_FIREBASE_CPP_SDK_DIR "firebase_cpp_sdk")
-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()
-
-# 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)
-
-# Sample source files.
-set(FIREBASE_SAMPLE_COMMON_SRCS
- src/main.h
- src/common_main.cc
-)
-
-# The include directory for the testapp.
-include_directories(src)
-
-# Sample uses some features that require C++ 11, such as lambdas.
-set (CMAKE_CXX_STANDARD 11)
-
-if(ANDROID)
- # Build an Android application.
-
- # Source files used for the Android build.
- set(FIREBASE_SAMPLE_ANDROID_SRCS
- src/android/android_main.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")
-
- # Define the target as a shared library, as that is what gradle expects.
- set(target_name "android_main")
- add_library(${target_name} SHARED
- ${FIREBASE_SAMPLE_ANDROID_SRCS}
- ${FIREBASE_SAMPLE_COMMON_SRCS}
- )
-
- target_link_libraries(${target_name}
- log android atomic native_app_glue
- )
-
- target_include_directories(${target_name} PRIVATE
- ${ANDROID_NDK}/sources/android/native_app_glue)
-
- set(ADDITIONAL_LIBS)
-else()
- # Build a desktop application.
-
- # 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 sample.
- set(FIREBASE_SAMPLE_DESKTOP_SRCS
- src/desktop/desktop_main.cc
- )
-
- set(target_name "desktop_testapp")
- add_executable(${target_name}
- ${FIREBASE_SAMPLE_DESKTOP_SRCS}
- ${FIREBASE_SAMPLE_COMMON_SRCS}
- )
-
- if(APPLE)
- set(ADDITIONAL_LIBS pthread)
- elseif(MSVC)
- set(ADDITIONAL_LIBS)
- 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 ${config})
- add_custom_command(
- TARGET ${target_name} POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy
- ${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_dynamic_links firebase_app)
-target_link_libraries(${target_name} "${firebase_libs}" ${ADDITIONAL_LIBS})
diff --git a/dynamic_links/testapp/LICENSE b/dynamic_links/testapp/LICENSE
deleted file mode 100644
index d6456956..00000000
--- a/dynamic_links/testapp/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- 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/dynamic_links/testapp/LaunchScreen.storyboard b/dynamic_links/testapp/LaunchScreen.storyboard
deleted file mode 100644
index 673e0f7e..00000000
--- a/dynamic_links/testapp/LaunchScreen.storyboard
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/dynamic_links/testapp/Podfile b/dynamic_links/testapp/Podfile
deleted file mode 100644
index e983680a..00000000
--- a/dynamic_links/testapp/Podfile
+++ /dev/null
@@ -1,7 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '13.0'
-use_frameworks!
-# Dynamic Links test application.
-target 'testapp' do
- pod 'Firebase/DynamicLinks', '10.25.0'
-end
diff --git a/dynamic_links/testapp/build.gradle b/dynamic_links/testapp/build.gradle
deleted file mode 100644
index e7b828bb..00000000
--- a/dynamic_links/testapp/build.gradle
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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' }
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:4.2.1'
- classpath 'com.google.gms:google-services:4.0.1'
- }
-}
-
-allprojects {
- repositories {
- mavenLocal()
- maven { url 'https://maven.google.com' }
- jcenter()
- }
-}
-
-apply plugin: 'com.android.application'
-
-android {
- compileOptions {
- sourceCompatibility 1.8
- targetCompatibility 1.8
- }
- compileSdkVersion 34
- ndkPath System.getenv('ANDROID_NDK_HOME')
- buildToolsVersion '30.0.2'
-
- sourceSets {
- main {
- jniLibs.srcDirs = ['libs']
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src/android/java']
- res.srcDirs = ['res']
- }
- }
-
- defaultConfig {
- applicationId 'com.google.android.dynamiclinks.testapp'
- minSdkVersion 23
- targetSdkVersion 28
- versionCode 1
- versionName '1.0'
- externalNativeBuild.cmake {
- arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir"
- }
- }
- externalNativeBuild.cmake {
- path 'CMakeLists.txt'
- }
- buildTypes {
- release {
- minifyEnabled true
- proguardFile getDefaultProguardFile('proguard-android.txt')
- proguardFile file('proguard.pro')
- }
- }
- packagingOptions {
- pickFirst 'META-INF/**/coroutines.pro'
- }
- lintOptions {
- abortOnError false
- checkReleaseBuilds false
- }
-}
-
-apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
-firebaseCpp.dependencies {
- dynamicLinks
-}
-
-apply plugin: 'com.google.gms.google-services'
diff --git a/dynamic_links/testapp/gradle.properties b/dynamic_links/testapp/gradle.properties
deleted file mode 100644
index d7ba8f42..00000000
--- a/dynamic_links/testapp/gradle.properties
+++ /dev/null
@@ -1 +0,0 @@
-android.useAndroidX = true
diff --git a/dynamic_links/testapp/gradle/wrapper/gradle-wrapper.jar b/dynamic_links/testapp/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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