Skip to content

Commit fa07fae

Browse files
authored
Merge pull request #443 from firebase/feature/tvos-support
Feature/tvos support
2 parents 5c7390c + e4ac5c0 commit fa07fae

40 files changed

+1582
-88
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ if(FIREBASE_CPP_BUILD_TESTS)
107107
${CMAKE_BINARY_DIR})
108108
endif()
109109

110+
if (PLATFORM STREQUAL TVOS OR PLATFORM STREQUAL SIMULATOR_TVOS)
111+
# AdMob, FDL are not supported on tvOS.
112+
set(FIREBASE_INCLUDE_ADMOB OFF)
113+
set(FIREBASE_INCLUDE_DYNAMIC_LINKS OFF)
114+
endif()
115+
110116
# Occasionally ANDROID is not being set correctly when invoked by gradle, so
111117
# set it manually if ANDROID_NDK has been defined.
112118
if(DEFINED ANDROID_NDK)

admob/src/common/banner_view_internal.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424

2525
#if FIREBASE_PLATFORM_ANDROID
2626
#include "admob/src/android/banner_view_internal_android.h"
27-
#elif FIREBASE_PLATFORM_IOS
27+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
2828
#include "admob/src/ios/banner_view_internal_ios.h"
2929
#else
3030
#include "admob/src/stub/banner_view_internal_stub.h"
31-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
31+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
32+
// FIREBASE_PLATFORM_TVOS
3233

3334
namespace firebase {
3435
namespace admob {
@@ -40,11 +41,12 @@ BannerViewInternal::BannerViewInternal(BannerView* base)
4041
BannerViewInternal* BannerViewInternal::CreateInstance(BannerView* base) {
4142
#if FIREBASE_PLATFORM_ANDROID
4243
return new BannerViewInternalAndroid(base);
43-
#elif FIREBASE_PLATFORM_IOS
44+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
4445
return new BannerViewInternalIOS(base);
4546
#else
4647
return new BannerViewInternalStub(base);
47-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
48+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
49+
// FIREBASE_PLATFORM_TVOS
4850
}
4951

5052
void BannerViewInternal::SetListener(BannerView::Listener* listener) {

admob/src/common/interstitial_ad_internal.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424

2525
#if FIREBASE_PLATFORM_ANDROID
2626
#include "admob/src/android/interstitial_ad_internal_android.h"
27-
#elif FIREBASE_PLATFORM_IOS
27+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
2828
#include "admob/src/ios/interstitial_ad_internal_ios.h"
2929
#else
3030
#include "admob/src/stub/interstitial_ad_internal_stub.h"
31-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
31+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
32+
// FIREBASE_PLATFORM_TVOS
3233

3334
namespace firebase {
3435
namespace admob {
@@ -41,11 +42,12 @@ InterstitialAdInternal* InterstitialAdInternal::CreateInstance(
4142
InterstitialAd* base) {
4243
#if FIREBASE_PLATFORM_ANDROID
4344
return new InterstitialAdInternalAndroid(base);
44-
#elif FIREBASE_PLATFORM_IOS
45+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
4546
return new InterstitialAdInternalIOS(base);
4647
#else
4748
return new InterstitialAdInternalStub(base);
48-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
49+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
50+
// FIREBASE_PLATFORM_TVOS
4951
}
5052

5153
void InterstitialAdInternal::SetListener(InterstitialAd::Listener* listener) {

admob/src/common/native_express_ad_view_internal.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424

2525
#if FIREBASE_PLATFORM_ANDROID
2626
#include "admob/src/android/native_express_ad_view_internal_android.h"
27-
#elif FIREBASE_PLATFORM_IOS
27+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
2828
#include "admob/src/ios/native_express_ad_view_internal_ios.h"
2929
#else
3030
#include "admob/src/stub/native_express_ad_view_internal_stub.h"
31-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
31+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
32+
// FIREBASE_PLATFORM_TVOS
3233

3334
namespace firebase {
3435
namespace admob {
@@ -44,11 +45,12 @@ NativeExpressAdViewInternal* NativeExpressAdViewInternal::CreateInstance(
4445
NativeExpressAdView* base) {
4546
#if FIREBASE_PLATFORM_ANDROID
4647
return new NativeExpressAdViewInternalAndroid(base);
47-
#elif FIREBASE_PLATFORM_IOS
48+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
4849
return new NativeExpressAdViewInternalIOS(base);
4950
#else
5051
return new NativeExpressAdViewInternalStub(base);
51-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
52+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
53+
// FIREBASE_PLATFORM_TVOS
5254
}
5355

5456
void NativeExpressAdViewInternal::SetListener(

admob/src/common/rewarded_video_internal.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424

2525
#if FIREBASE_PLATFORM_ANDROID
2626
#include "admob/src/android/rewarded_video_internal_android.h"
27-
#elif FIREBASE_PLATFORM_IOS
27+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
2828
#include "admob/src/ios/rewarded_video_internal_ios.h"
2929
#else
3030
#include "admob/src/stub/rewarded_video_internal_stub.h"
31-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
31+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
32+
// FIREBASE_PLATFORM_TVOS
3233

3334
namespace firebase {
3435
namespace admob {
@@ -41,11 +42,12 @@ RewardedVideoInternal::RewardedVideoInternal()
4142
RewardedVideoInternal* RewardedVideoInternal::CreateInstance() {
4243
#if FIREBASE_PLATFORM_ANDROID
4344
return new RewardedVideoInternalAndroid();
44-
#elif FIREBASE_PLATFORM_IOS
45+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
4546
return new RewardedVideoInternalIOS();
4647
#else
4748
return new RewardedVideoInternalStub();
48-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
49+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
50+
// FIREBASE_PLATFORM_TVOS
4951
}
5052

5153
void RewardedVideoInternal::SetListener(Listener* listener) {

admob/src/include/firebase/admob/types.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121

2222
#if FIREBASE_PLATFORM_ANDROID
2323
#include <jni.h>
24-
#elif FIREBASE_PLATFORM_IOS
24+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
2525
extern "C" {
2626
#include <objc/objc.h>
2727
} // extern "C"
28-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
28+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
29+
// FIREBASE_PLATFORM_TVOS
2930

3031
namespace firebase {
3132
namespace admob {
@@ -40,13 +41,14 @@ namespace admob {
4041
#if FIREBASE_PLATFORM_ANDROID
4142
/// An Android Activity from Java.
4243
typedef jobject AdParent;
43-
#elif FIREBASE_PLATFORM_IOS
44+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
4445
/// A pointer to an iOS UIView.
4546
typedef id AdParent;
4647
#else
4748
/// A void pointer for stub classes.
4849
typedef void *AdParent;
49-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
50+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS,
51+
// FIREBASE_PLATFORM_TVOS
5052

5153
#ifdef INTERNAL_EXPERIMENTAL
5254
// LINT.IfChange

app/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@ set(app_ios_SRCS
156156
src/invites/ios/invites_receiver_internal_ios.mm
157157
src/invites/ios/invites_ios_startup.mm
158158
src/uuid_ios_darwin.mm)
159+
if (PLATFORM STREQUAL TVOS OR PLATFORM STREQUAL SIMULATOR_TVOS)
160+
# TVOS does not have a web browser and does not support dynamic links.
161+
# Remove these files if we are building for TVOS.
162+
list(REMOVE_ITEM app_ios_SRCS
163+
src/invites/ios/invites_receiver_internal_ios.mm
164+
src/invites/ios/invites_ios_startup.mm)
165+
endif()
166+
159167
set(app_desktop_SRCS
160168
src/app_desktop.cc
161169
src/heartbeat_date_storage_desktop.cc

app/src/app_common.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ const char* kCpuArchitecture = "arm32";
9090
const char* kCppRuntimeOrStl = "libcpp";
9191
#if FIREBASE_PLATFORM_IOS
9292
const char* kOperatingSystem = "ios";
93+
#elif FIREBASE_PLATFORM_TVOS
94+
const char* kOperatingSystem = "tvos";
9395
#elif FIREBASE_PLATFORM_OSX
9496
const char* kOperatingSystem = "darwin";
9597
#else

app/src/include/firebase/app.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include <map>
2727
#include <string>
2828

29-
#if FIREBASE_PLATFORM_IOS
29+
#if FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
3030
#ifdef __OBJC__
3131
@class FIRApp;
3232
#endif // __OBJC__
@@ -718,14 +718,14 @@ class App {
718718
/// @return Global reference to the FirebaseApp. The returned reference
719719
/// most be deleted after use.
720720
jobject GetPlatformApp() const;
721-
#elif FIREBASE_PLATFORM_IOS
721+
#elif FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
722722
#ifdef __OBJC__
723723
/// Get the platform specific app implementation referenced by this object.
724724
///
725725
/// @return Reference to the FIRApp object owned by this app.
726726
FIRApp* GetPlatformApp() const;
727727
#endif // __OBJC__
728-
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS
728+
#endif // FIREBASE_PLATFORM_ANDROID, FIREBASE_PLATFORM_IOS, FIREBASE_PLATFORM_TVOS
729729
#endif // INTERNAL_EXPERIMENTAL
730730

731731
private:

app/src/include/firebase/internal/platform.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
#define FIREBASE_PLATFORM_ANDROID 0
3838
#define FIREBASE_PLATFORM_IOS 0
39+
#define FIREBASE_PLATFORM_TVOS 0
3940
#define FIREBASE_PLATFORM_OSX 0
4041
#define FIREBASE_PLATFORM_WINDOWS 0
4142
#define FIREBASE_PLATFORM_LINUX 0
@@ -51,6 +52,9 @@
5152
#elif defined(TARGET_OS_IOS) && TARGET_OS_IOS
5253
#undef FIREBASE_PLATFORM_IOS
5354
#define FIREBASE_PLATFORM_IOS 1
55+
#elif defined(TARGET_OS_TV) && TARGET_OS_TV
56+
#undef FIREBASE_PLATFORM_TVOS
57+
#define FIREBASE_PLATFORM_TVOS 1
5458
#elif defined(TARGET_OS_OSX) && TARGET_OS_OSX
5559
#undef FIREBASE_PLATFORM_OSX
5660
#define FIREBASE_PLATFORM_OSX 1

app/src/locale.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include "app/src/include/firebase/internal/platform.h"
2020
#include "app/src/log.h"
2121

22-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
22+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
2323
#error "This file does not support iOS and OS X, use locale_apple.mm instead."
2424
#elif FIREBASE_PLATFORM_ANDROID
2525
#error "This file is not support on Android."

app/src/semaphore.h

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@
3636

3737
#include <cassert>
3838

39-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
39+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
4040
#include "app/src/mutex.h"
4141
#include "app/src/pthread_condvar.h"
42-
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
42+
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS ||
43+
// FIREBASE_PLATFORM_TVOS
4344

4445
#if !defined(FIREBASE_NAMESPACE)
4546
#define FIREBASE_NAMESPACE firebase
@@ -50,7 +51,7 @@ namespace FIREBASE_NAMESPACE {
5051
class Semaphore {
5152
public:
5253
explicit Semaphore(int initial_count) {
53-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
54+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
5455
// MacOS requires named semaphores, and does not support unnamed.
5556
// Generate a unique string for the semaphore name:
5657
static const char kPrefix[] = "/firebase-";
@@ -94,7 +95,7 @@ class Semaphore {
9495
}
9596

9697
~Semaphore() {
97-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
98+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
9899
// Because we use named semaphores on MacOS, we need to close them.
99100
bool success = (sem_close(semaphore_) == 0);
100101
assert(success);
@@ -110,9 +111,10 @@ class Semaphore {
110111
}
111112

112113
void Post() {
113-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
114+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
114115
MutexLock lock(cond_mutex_);
115-
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
116+
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS ||
117+
// FIREBASE_PLATFORM_TVOS
116118

117119
#if !FIREBASE_PLATFORM_WINDOWS
118120
bool success = (sem_post(semaphore_) == 0);
@@ -124,10 +126,11 @@ class Semaphore {
124126
(void)success;
125127
#endif
126128

127-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
129+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
128130
// Notify any potential timedWait calls that are waiting for this.
129131
cond_.NotifyAll();
130-
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
132+
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS ||
133+
// FIREBASE_PLATFORM_TVOS
131134
}
132135

133136
void Wait() {
@@ -164,7 +167,7 @@ class Semaphore {
164167
// before returning.
165168
// Returns false if it was unable to acquire a lock, true otherwise.
166169
bool TimedWait(int milliseconds) {
167-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
170+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
168171
MutexLock lock(cond_mutex_);
169172
return cond_.TimedWait(
170173
cond_mutex_.native_handle(), [this] { return this->TryWait(); },
@@ -184,14 +187,15 @@ class Semaphore {
184187
HANDLE semaphore_;
185188
#endif
186189

187-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
190+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
188191
// Apple implementations need a condition variable to make TimedWait() work.
189192
Mutex cond_mutex_;
190193
internal::ConditionVariable cond_;
191194
#elif !FIREBASE_PLATFORM_WINDOWS
192195
// On non-Mac POSIX systems, we keep our own sem_t object.
193196
sem_t semaphore_value_;
194-
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
197+
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS ||
198+
// FIREBASE_PLATFORM_TVOS
195199
};
196200

197201
// NOLINTNEXTLINE - allow namespace overridden

app/src/time.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929
#include <unistd.h>
3030
#endif // FIREBASE_PLATFORM_WINDOWS
3131

32-
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
32+
#if FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
3333
#include <mach/mach.h>
3434
#include <mach/mach_time.h>
35-
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
35+
#endif // FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS ||
36+
// FIREBASE_PLATFORM_TVOS
3637

3738
#if !defined(FIREBASE_NAMESPACE)
3839
#define FIREBASE_NAMESPACE firebase
@@ -124,10 +125,10 @@ inline uint64_t GetTimestamp() {
124125
#if FIREBASE_PLATFORM_WINDOWS
125126
// return the elapse time since the system is started in milliseconds
126127
return GetTickCount64();
127-
#elif FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS
128+
#elif FIREBASE_PLATFORM_OSX || FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
128129
// clock_gettime is only supported on macOS after 10.10 Sierra.
129130
// mach_absolute_time() returns absolute time in nano seconds.
130-
#if FIREBASE_PLATFORM_IOS
131+
#if FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
131132
// Note that the same function does NOT return nano seconds in iOS. Requires
132133
// mach_timebase_info_data_t to convert returned value into nano seconds.
133134
// However, the conversion may have potential risk to introduce overflow or

app/tests/app_test.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
#include "TargetConditionals.h"
6060
#endif // __APPLE__
6161

62-
#if FIREBASE_PLATFORM_IOS
62+
#if FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
6363
// Declared in the Obj-C header fake/FIRApp.h.
6464
extern "C" {
6565
void FIRAppCreateUsingDefaultOptions(const char* name);
@@ -106,7 +106,7 @@ class AppTest : public ::testing::Test {
106106

107107
// Create a mobile app instance using the fake options from resources.
108108
void CreateMobileApp(const char* name) {
109-
#if FIREBASE_PLATFORM_IOS
109+
#if FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
110110
FIRAppCreateUsingDefaultOptions(name ? name : "__FIRAPP_DEFAULT");
111111
#endif // FIREBASE_PLATFORM_IOS
112112
#if FIREBASE_ANDROID_FOR_DESKTOP
@@ -146,7 +146,7 @@ class AppTest : public ::testing::Test {
146146
// Clear all C++ firebase::App objects and any mobile SDK instances.
147147
void ClearAppInstances() {
148148
app_common::DestroyAllApps();
149-
#if FIREBASE_PLATFORM_IOS
149+
#if FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
150150
FIRAppResetApps();
151151
#endif // FIREBASE_PLATFORM_IOS
152152
#if FIREBASE_ANDROID_FOR_DESKTOP
@@ -241,7 +241,7 @@ TEST_F(AppTest, LoadDefault) {
241241
EXPECT_STREQ("fake messaging sender id from resource",
242242
options.messaging_sender_id());
243243
EXPECT_STREQ("fake database url from resource", options.database_url());
244-
#if FIREBASE_PLATFORM_IOS
244+
#if FIREBASE_PLATFORM_IOS || FIREBASE_PLATFORM_TVOS
245245
// GA tracking ID can currently only be configured on iOS.
246246
EXPECT_STREQ("fake ga tracking id from resource", options.ga_tracking_id());
247247
#endif // FIREBASE_PLATFORM_IOS

0 commit comments

Comments
 (0)