From 906f28a0f2eb9e4e1b90672aa1803510a1f9d929 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 29 Nov 2019 10:42:25 +0300 Subject: [PATCH 01/21] v5.0.0 --- CHANGELOG.md | 8 + README.md | 2 + doc/README.md | 2 + doc/crashlytics.md | 52 +++++ doc/performance.md | 36 ++++ package.json | 2 +- plugin.xml | 83 ++++---- project/android/build.gradle | 13 +- project/android/firebase/build.gradle | 22 ++- .../firebase/src/main/AndroidManifest.xml | 10 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- src/android/build-extras.gradle | 1 + .../firebase/analytics/Analytics.kt | 74 +++---- .../firebase/analytics/AnalyticsHandler.kt | 26 +-- .../firebase/crashlytics/Crashlytics.kt | 40 ++++ .../crashlytics/CrashlyticsHandler.kt | 27 +++ .../firebase/messaging/Messaging.kt | 184 +++++++++--------- .../firebase/performance/Performance.kt | 31 +++ .../performance/PerformanceHandler.kt | 28 +++ types/index.d.ts | 23 ++- www/Crashlytics.js | 70 +++++++ www/Performance.js | 36 ++++ 22 files changed, 579 insertions(+), 195 deletions(-) create mode 100644 doc/crashlytics.md create mode 100644 doc/performance.md create mode 100644 src/android/com/eclipsesource/firebase/crashlytics/Crashlytics.kt create mode 100644 src/android/com/eclipsesource/firebase/crashlytics/CrashlyticsHandler.kt create mode 100644 src/android/com/eclipsesource/firebase/performance/Performance.kt create mode 100644 src/android/com/eclipsesource/firebase/performance/PerformanceHandler.kt create mode 100644 www/Crashlytics.js create mode 100644 www/Performance.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e54189..270347f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ Change Log ========== +## Version 5.0.0 + +(thx to [fax1ty](https://github.com/fax1ty)) + +* Firebase Performance implementation (Android only) +* Firebase Crashlytics implementation (Android only) +* Android project dependencies versions have been increased + ## Version 4.0.0 * Compatible with Tabris.js version 3.0.0+ diff --git a/README.md b/README.md index d285b07..a7f47c5 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ Feature | Supported platforms --- | --- [Firebase Cloud Messaging](doc/cloud-messaging.md) | Android, iOS [Firebase Analytics](doc/analytics.md) | Android, iOS +[Firebase Crashlytics](doc/crashlytics.md) | Android +[Firebase Performance](doc/performance.md) | Android ## Compatibility diff --git a/doc/README.md b/doc/README.md index ced2c55..dc24d36 100644 --- a/doc/README.md +++ b/doc/README.md @@ -4,3 +4,5 @@ The Tabris.js Firebase Plugin documentation consists of the following pages: * [Firebase Cloud Messaging](cloud-messaging.md) * [Firebase Analytics](analytics.md) +* [Firebase Crashlytics](crashlytics.md) +* [Firebase Performance](performance.md) \ No newline at end of file diff --git a/doc/crashlytics.md b/doc/crashlytics.md new file mode 100644 index 0000000..47ad33d --- /dev/null +++ b/doc/crashlytics.md @@ -0,0 +1,52 @@ +# Firebase Crashlytics + +## Enable analytics tracking +By default the plugin does _NOT_ track any usage data. You have to enable crash reports sending by setting `crashlyticsCollectionEnabled` to `true`: + +```js +firebase.Crashlytics.setCrashlyticsCollectionEnabled(true); +``` + +**Note:** changes will only be applied after restarting the application. + +## API + +The firebase crashlytics API is represented as the global object `firebase.Crashlytics`. + +### `Crashlytics` + +#### Methods + +##### `setCrashlyticsCollectionEnabled(enabled)` + +* Enables or disables the collection of data about crashes. + +**Note:** changes will only be applied after restarting the application. + +##### `setUserIdentifier(id)` + +* Specify a user identifier which will be visible in the Crashlytics UI. + +##### `makeCrash()` + +* The easiest way to cause a crash - great for testing! + +##### `log(value)` + +* Add text logging that will be sent with your next report. This logging will only be visible in your Crashlytics dashboard, and will be associated with the next crash or logged exception for this app execution. Newline characters ('\n') will be stripped from msg. The log is rolling with a maximum size of 64k, such that messages are removed (oldest first) if the max size is exceeded. + +##### `log(priority, tag, value)` + +* Add text logging that will be sent with your next report, using log(value). The message will also be printed to LogCat. + +##### `setBool(key, value)` + +* Sets a value to be associated with a given key for your crash data. + +##### `setString(key, value)` + +* Sets a value to be associated with a given key for your crash data. + +##### `setInt(key, value)` + +* Sets a value to be associated with a given key for your crash data. \ No newline at end of file diff --git a/doc/performance.md b/doc/performance.md new file mode 100644 index 0000000..85b4ade --- /dev/null +++ b/doc/performance.md @@ -0,0 +1,36 @@ +# Firebase Crashlytics + +## Enable analytics tracking +By default the plugin does _NOT_ track any usage data. You have to enable performance monitoring by setting `performanceCollectionEnabled` to `true`: + +```js +firebase.Performance.performanceCollectionEnabled = true; +``` + +## API + +The firebase performance API is represented as the global object `firebase.Performance`. + +### `Performance` + +#### Properties + +All `Performance` properties are _write only_. + +##### `performanceCollectionEnabled` : _boolean_ + +* Enables performance data collection for this app. To make use of firebase performance data collection _has to be enabled_ by the developer. The enablement persists across sessions. + +#### Methods + +##### `startTrace(name)` + +* Creates a Trace object with given name and start the trace. + +##### `stopTrace(name)` + +* Stops a Trace with given name. + +##### `incrementMetrics(name, counter, value)` + +* Atomically increments the metric with the given name in this trace by the incrementBy value. diff --git a/package.json b/package.json index 0c7a6df..a3a82ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tabris-plugin-firebase", - "version": "4.0.0", + "version": "5.0.0", "description": "A firebase plugin for Tabris.js", "types": "./types/index.d.ts", "peerDependencies": { diff --git a/plugin.xml b/plugin.xml index a903a5c..07cd7fd 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,8 +1,6 @@ - + Tabris.js Firebase Plugin A firebase for Tabris.js. The plugin allows to handle cloud messages. @@ -24,6 +22,14 @@ + + + + + + + + @@ -51,16 +57,16 @@ - - - + + + + + + + + + @@ -70,22 +76,23 @@ + + + + + + + + + + + + + + - - - - - - - - + + @@ -97,28 +104,28 @@ - - ESFBMessaging - ESFBAnalytics - + + ESFBMessaging + ESFBAnalytics + - development + development - production + production - - remote-notification - + + remote-notification + - + diff --git a/project/android/build.gradle b/project/android/build.gradle index 954f975..824cf3b 100644 --- a/project/android/build.gradle +++ b/project/android/build.gradle @@ -1,16 +1,21 @@ buildscript { ext { - playServicesVersion = '12.0.1' - kotlinVersion = '1.3.21' + playServicesVersion = '15.0.0' + kotlinVersion = '1.3.50' + crashlyticsVersion = '2.10.1' } repositories { google() jcenter() + maven { + url 'https://maven.fabric.io/public' + } } dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' - classpath 'com.google.gms:google-services:3.1.2' + classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.google.gms:google-services:4.3.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" + classpath 'io.fabric.tools:gradle:1.31.2' } } diff --git a/project/android/firebase/build.gradle b/project/android/firebase/build.gradle index c3d15d6..388eaf1 100644 --- a/project/android/firebase/build.gradle +++ b/project/android/firebase/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' dependencies { - implementation 'com.eclipsesource.tabris.android:tabris:3.0.0' implementation "com.google.firebase:firebase-core:$playServicesVersion" implementation "com.google.firebase:firebase-messaging:$playServicesVersion" implementation "com.google.firebase:firebase-analytics:$playServicesVersion" @@ -11,16 +10,22 @@ dependencies { testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.13.0' testImplementation 'com.squareup.assertj:assertj-android:1.2.0' - testImplementation 'org.robolectric:robolectric:3.8' + testImplementation 'org.robolectric:robolectric:4.2.1' + + implementation 'com.eclipsesource.tabris.android:tabris:3.2.1' + implementation "com.eclipsesource.j2v8:j2v8_win32_x86_64:4.6.0" + + implementation "com.crashlytics.sdk.android:crashlytics:$crashlyticsVersion" + implementation "com.google.firebase:firebase-perf:$playServicesVersion" } android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { minSdkVersion 21 - targetSdkVersion 28 + targetSdkVersion 29 } lintOptions { @@ -28,8 +33,12 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = "1.8" } sourceSets { @@ -42,3 +51,4 @@ android { // the firebase plugin has to be at the bottom of the gradle file apply plugin: 'com.google.gms.google-services' +apply plugin: 'io.fabric' \ No newline at end of file diff --git a/project/android/firebase/src/main/AndroidManifest.xml b/project/android/firebase/src/main/AndroidManifest.xml index 6800fa2..2f31f90 100644 --- a/project/android/firebase/src/main/AndroidManifest.xml +++ b/project/android/firebase/src/main/AndroidManifest.xml @@ -1,10 +1,18 @@ + package="com.eclipsesource.firebase"> + + + + \ No newline at end of file diff --git a/project/android/gradle/wrapper/gradle-wrapper.properties b/project/android/gradle/wrapper/gradle-wrapper.properties index 95cb607..b9e7610 100644 --- a/project/android/gradle/wrapper/gradle-wrapper.properties +++ b/project/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 22 11:49:41 CEST 2018 +#Thu Nov 28 23:01:53 MSK 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/src/android/build-extras.gradle b/src/android/build-extras.gradle index bbb347b..0b71b8a 100644 --- a/src/android/build-extras.gradle +++ b/src/android/build-extras.gradle @@ -1,3 +1,4 @@ ext.postBuildExtras = { apply plugin: 'com.google.gms.google-services' + apply plugin: 'io.fabric' } diff --git a/src/android/com/eclipsesource/firebase/analytics/Analytics.kt b/src/android/com/eclipsesource/firebase/analytics/Analytics.kt index cbd2fd7..499a107 100644 --- a/src/android/com/eclipsesource/firebase/analytics/Analytics.kt +++ b/src/android/com/eclipsesource/firebase/analytics/Analytics.kt @@ -12,46 +12,46 @@ import java.util.* class Analytics(private val activity: Activity) { - private val firebaseAnalytics = FirebaseAnalytics.getInstance(activity.applicationContext) - - fun setAnalyticsCollectionEnabled(enabled: Boolean) = firebaseAnalytics.setAnalyticsCollectionEnabled(enabled) - - fun setScreenName(name: String?) = firebaseAnalytics.setCurrentScreen(activity, name, null) - - fun setUserProperty(key: String, value: String?) = firebaseAnalytics.setUserProperty(key, value) - - fun setUserId(userId: String?) = firebaseAnalytics.setUserId(userId) - - fun logEvent(name: String, data: V8Object?) = firebaseAnalytics.logEvent(name, createLogDataBundle(data)) - - private fun createLogDataBundle(data: V8Object?): Bundle { - with(Bundle()) { - data?.forEach { key, value -> - when (value) { - is String -> putString(key, value) - is Long -> putLong(key, value) - is Int -> putLong(key, value.toLong()) - is Double -> putDouble(key, value) - is Float -> putDouble(key, value.toDouble()) - is V8Object -> putParcelable(key, createLogDataBundle(value)) - is V8Array -> { - if (value.asSequence().all { it is String }) - putStringArrayList(key, ArrayList(value.asSequence().toList())) - else - putParcelableArrayList(key, ArrayList(value.asSequence().map { mapListValue(it) }.toList())) - } + private val firebaseAnalytics = FirebaseAnalytics.getInstance(activity.applicationContext) + + fun setAnalyticsCollectionEnabled(enabled: Boolean) = firebaseAnalytics.setAnalyticsCollectionEnabled(enabled) + + fun setScreenName(name: String?) = firebaseAnalytics.setCurrentScreen(activity, name, null) + + fun setUserProperty(key: String, value: String?) = firebaseAnalytics.setUserProperty(key, value) + + fun setUserId(userId: String?) = firebaseAnalytics.setUserId(userId) + + fun logEvent(name: String, data: V8Object?) = firebaseAnalytics.logEvent(name, createLogDataBundle(data)) + + private fun createLogDataBundle(data: V8Object?): Bundle { + with(Bundle()) { + data?.forEach { key, value -> + when (value) { + is String -> putString(key, value) + is Long -> putLong(key, value) + is Int -> putLong(key, value.toLong()) + is Double -> putDouble(key, value) + is Float -> putDouble(key, value.toDouble()) + is V8Object -> putParcelable(key, createLogDataBundle(value)) + is V8Array -> { + if (value.asSequence().all { it is String }) + putStringArrayList(key, ArrayList(value.asSequence().toList())) + else + putParcelableArrayList(key, ArrayList(value.asSequence().map { mapListValue(it) }.toList())) + } + } + } + return this } - } - return this; } - } - private fun mapListValue(value: Any?): Parcelable { - return when (value) { - is V8Object -> createLogDataBundle(value) - is V8Array -> mapListValue(value) - else -> throw IllegalArgumentException("V8Arrays may only contain V8Objects or V8Arrays.") + private fun mapListValue(value: Any?): Parcelable { + return when (value) { + is V8Object -> createLogDataBundle(value) + is V8Array -> mapListValue(value) + else -> throw IllegalArgumentException("V8Arrays may only contain V8Objects or V8Arrays.") + } } - } } diff --git a/src/android/com/eclipsesource/firebase/analytics/AnalyticsHandler.kt b/src/android/com/eclipsesource/firebase/analytics/AnalyticsHandler.kt index b8bd086..9fe7fab 100644 --- a/src/android/com/eclipsesource/firebase/analytics/AnalyticsHandler.kt +++ b/src/android/com/eclipsesource/firebase/analytics/AnalyticsHandler.kt @@ -8,20 +8,22 @@ import com.eclipsesource.v8.V8Object @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") class AnalyticsHandler(private val scope: ActivityScope) : ObjectHandler { - override val type = "com.eclipsesource.firebase.Analytics" + override val type = "com.eclipsesource.firebase.Analytics" - override val properties = listOf>( - BooleanProperty("analyticsCollectionEnabled", { setAnalyticsCollectionEnabled(it ?: false) }), - StringProperty("screenName", { setScreenName(it) }), - StringProperty("userId", { setUserId(it.orEmpty()) }) - ) + override val properties = listOf>( + BooleanProperty("analyticsCollectionEnabled", { + setAnalyticsCollectionEnabled(it ?: false) + }), + StringProperty("screenName", { setScreenName(it) }), + StringProperty("userId", { setUserId(it.orEmpty()) }) + ) - override fun create(id: String, properties: V8Object) = Analytics(scope.activity) + override fun create(id: String, properties: V8Object) = Analytics(scope.activity) - override fun call(analytics: Analytics, method: String, properties: V8Object) = when (method) { - "logEvent" -> analytics.logEvent(properties.getString("name"), properties.getObjectOrNull("data")) - "setUserProperty" -> analytics.setUserProperty(properties.getString("key"), properties.getStringOrNull("value")) - else -> null - } + override fun call(analytics: Analytics, method: String, properties: V8Object) = when (method) { + "logEvent" -> analytics.logEvent(properties.getString("name"), properties.getObjectOrNull("data")) + "setUserProperty" -> analytics.setUserProperty(properties.getString("key"), properties.getStringOrNull("value")) + else -> null + } } diff --git a/src/android/com/eclipsesource/firebase/crashlytics/Crashlytics.kt b/src/android/com/eclipsesource/firebase/crashlytics/Crashlytics.kt new file mode 100644 index 0000000..5cd8d04 --- /dev/null +++ b/src/android/com/eclipsesource/firebase/crashlytics/Crashlytics.kt @@ -0,0 +1,40 @@ +package com.eclipsesource.firebase.crashlytics + +import android.app.Activity +import android.content.Context +import com.crashlytics.android.Crashlytics +import com.crashlytics.android.core.CrashlyticsCore +import io.fabric.sdk.android.Fabric + +class Crashlytics(private val activity: Activity) { + + private var firebaseCrashlytics: CrashlyticsCore? = null + + fun setCrashlyticsCollectionEnabled(enabled: Boolean) { + activity.getPreferences(Context.MODE_PRIVATE).edit().putBoolean("crashlyticsCollectionEnabled", enabled).apply() + } + + fun init() { + val enabled = activity.getPreferences(Context.MODE_PRIVATE).getBoolean("crashlyticsCollectionEnabled", false) + val core = Crashlytics.Builder() + .core(CrashlyticsCore.Builder().disabled(!enabled).build()) + .build() + Fabric.with(activity.applicationContext, core) + firebaseCrashlytics = core.core + } + + fun setUserIdentifier(id: String) = firebaseCrashlytics?.setUserIdentifier(id) + + fun makeCrash() = firebaseCrashlytics?.crash() + + fun log(value: String) = firebaseCrashlytics?.log(value) + + fun log(priority: Int, tag: String, value: String) = firebaseCrashlytics?.log(priority, tag, value) + + // Customizing + fun setBool(key: String, value: Boolean) = firebaseCrashlytics?.setBool(key, value) + + fun setInt(key: String, value: Int) = firebaseCrashlytics?.setInt(key, value) + + fun setString(key: String, value: String) = firebaseCrashlytics?.setString(key, value) +} \ No newline at end of file diff --git a/src/android/com/eclipsesource/firebase/crashlytics/CrashlyticsHandler.kt b/src/android/com/eclipsesource/firebase/crashlytics/CrashlyticsHandler.kt new file mode 100644 index 0000000..ffa61e5 --- /dev/null +++ b/src/android/com/eclipsesource/firebase/crashlytics/CrashlyticsHandler.kt @@ -0,0 +1,27 @@ +package com.eclipsesource.firebase.crashlytics + +import com.eclipsesource.tabris.android.ActivityScope +import com.eclipsesource.tabris.android.ObjectHandler +import com.eclipsesource.v8.V8Object + +class CrashlyticsHandler(private val scope: ActivityScope) : ObjectHandler { + override val type = "com.eclipsesource.firebase.Crashlytics" + + override fun create(id: String, properties: V8Object) = Crashlytics(scope.activity).also { it.init() } + + override fun call(crashlytics: Crashlytics, method: String, properties: V8Object) = when (method) { + "setCrashlyticsCollectionEnabled" -> crashlytics.setCrashlyticsCollectionEnabled(properties.getBoolean("enabled")) + "setUserIdentifier" -> crashlytics.setUserIdentifier(properties.getString("id")) + "makeCrash" -> crashlytics.makeCrash() + "log" -> { + if (properties.contains("priority")) crashlytics.log(properties.getInteger("priority"), properties.getString("tag"), properties.getString("value")) + else crashlytics.log(properties.getString("value")) + } + // Customizing + "setBool" -> crashlytics.setBool(properties.getString("key"), properties.getBoolean("value")) + "setString" -> crashlytics.setString(properties.getString("key"), properties.getString("value")) + "setInt" -> crashlytics.setInt(properties.getString("key"), properties.getInteger("value")) + else -> null + } + +} \ No newline at end of file diff --git a/src/android/com/eclipsesource/firebase/messaging/Messaging.kt b/src/android/com/eclipsesource/firebase/messaging/Messaging.kt index 13ed643..4133898 100644 --- a/src/android/com/eclipsesource/firebase/messaging/Messaging.kt +++ b/src/android/com/eclipsesource/firebase/messaging/Messaging.kt @@ -11,9 +11,7 @@ import android.util.Log import androidx.core.app.NotificationManagerCompat import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.eclipsesource.tabris.android.* -import com.eclipsesource.tabris.android.ActivityState.NEW_INTENT -import com.eclipsesource.tabris.android.ActivityState.START -import com.eclipsesource.tabris.android.ActivityState.STOP +import com.eclipsesource.tabris.android.ActivityState.* import com.google.firebase.iid.FirebaseInstanceId import java.io.IOException import java.io.Serializable @@ -27,112 +25,112 @@ internal const val EXTRA_TOKEN = "com.eclipsesource.firebase.messaging.EXTRA_TOK class Messaging(private val scope: ActivityScope) : Events.ActivityStateListener { - val launchData: Serializable? = scope.activityCreationIntent.getSerializableExtra(EXTRA_DATA) - - private val tokenReceiver = TokenReceiver() - private val messageReceiver = MessageReceiver() - private val launchTabrisActivityReceiver = LaunchTabrisActivityReceiver() - private val broadcastManager = LocalBroadcastManager.getInstance(scope.context) - - init { - scope.events.addActivityStateListener(this) - registerMessageReceiver() - registerTokenReceiver() - registerLaunchTabrisActivityReceiver() - } - - override fun activityStateChanged(activityState: ActivityState, intent: Intent?) { - when (activityState) { - START -> registerMessageReceiver() - NEW_INTENT -> notifyOfMessage(intent) - STOP -> broadcastManager.unregisterReceiver(messageReceiver) - else -> Unit + val launchData: Serializable? = scope.activityCreationIntent.getSerializableExtra(EXTRA_DATA) + + private val tokenReceiver = TokenReceiver() + private val messageReceiver = MessageReceiver() + private val launchTabrisActivityReceiver = LaunchTabrisActivityReceiver() + private val broadcastManager = LocalBroadcastManager.getInstance(scope.context) + + init { + scope.events.addActivityStateListener(this) + registerMessageReceiver() + registerTokenReceiver() + registerLaunchTabrisActivityReceiver() } - } - - private fun registerMessageReceiver() { - broadcastManager.unregisterReceiver(messageReceiver) - broadcastManager.registerReceiver(messageReceiver, IntentFilter(ACTION_MESSAGE)) - } - - private fun registerTokenReceiver() { - broadcastManager.registerReceiver(tokenReceiver, IntentFilter(ACTION_TOKEN_REFRESH)) - } - - private fun registerLaunchTabrisActivityReceiver() { - broadcastManager.registerReceiver(launchTabrisActivityReceiver, IntentFilter(ACTION_LAUNCH_TABRIS_ACTIVITY)) - } - - fun unregisterAllListeners() { - with(broadcastManager) { - unregisterReceiver(tokenReceiver) - unregisterReceiver(messageReceiver) - unregisterReceiver(launchTabrisActivityReceiver) + + override fun activityStateChanged(activityState: ActivityState, intent: Intent?) { + when (activityState) { + START -> registerMessageReceiver() + NEW_INTENT -> notifyOfMessage(intent) + STOP -> broadcastManager.unregisterReceiver(messageReceiver) + else -> Unit + } } - } - private fun notifyOfMessage(intent: Intent?) { - intent?.getSerializableExtra(EXTRA_DATA)?.let { - scope.remoteObject(this)?.notify("message", "data", it) + private fun registerMessageReceiver() { + broadcastManager.unregisterReceiver(messageReceiver) + broadcastManager.registerReceiver(messageReceiver, IntentFilter(ACTION_MESSAGE)) } - } - - fun resetInstanceId() { - Executors.newSingleThreadExecutor().submit { - try { - val instanceId = FirebaseInstanceId.getInstance() - instanceId.deleteInstanceId() - scope.post { remoteObject(this)?.notify("instanceIdChanged", "instanceId", instanceId.id) } - instanceId.token // will trigger a "tokenChanged" event - } catch (e: IOException) { - Log.e(Messaging::class.java.simpleName, "Could not reset firebase messaging instance id", e) - } + + private fun registerTokenReceiver() { + broadcastManager.registerReceiver(tokenReceiver, IntentFilter(ACTION_TOKEN_REFRESH)) } - } - - fun clearAllPendingMessages() { - NotificationManagerCompat.from(scope.context).cancelAll() - } - - fun getAllPendingMessages(): List { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return (scope.context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).activeNotifications - .asSequence() - .sortedBy { it.postTime } - .map { it.notification.extras.getSerializable(EXTRA_DATA) } - .toList() + + private fun registerLaunchTabrisActivityReceiver() { + broadcastManager.registerReceiver(launchTabrisActivityReceiver, IntentFilter(ACTION_LAUNCH_TABRIS_ACTIVITY)) } - return emptyList() - } - private class LaunchTabrisActivityReceiver : BroadcastReceiver() { + fun unregisterAllListeners() { + with(broadcastManager) { + unregisterReceiver(tokenReceiver) + unregisterReceiver(messageReceiver) + unregisterReceiver(launchTabrisActivityReceiver) + } + } - override fun onReceive(context: Context, intent: Intent) { - context.startActivity(Intent(context, TabrisActivity::class.java).apply { - addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP) - putExtra(EXTRA_DATA, intent.getSerializableExtra(EXTRA_DATA)) - }) + private fun notifyOfMessage(intent: Intent?) { + intent?.getSerializableExtra(EXTRA_DATA)?.let { + scope.remoteObject(this)?.notify("message", "data", it) + } } - } - private inner class TokenReceiver : BroadcastReceiver() { + fun resetInstanceId() { + Executors.newSingleThreadExecutor().submit { + try { + val instanceId = FirebaseInstanceId.getInstance() + instanceId.deleteInstanceId() + scope.post { remoteObject(this)?.notify("instanceIdChanged", "instanceId", instanceId.id) } + instanceId.token // will trigger a "tokenChanged" event + } catch (e: IOException) { + Log.e(Messaging::class.java.simpleName, "Could not reset firebase messaging instance id", e) + } + } + } - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == ACTION_TOKEN_REFRESH) { - scope.remoteObject(this)?.notify("tokenChanged", "token", intent.getStringExtra(EXTRA_TOKEN)) - } + fun clearAllPendingMessages() { + NotificationManagerCompat.from(scope.context).cancelAll() } - } + fun getAllPendingMessages(): List { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return (scope.context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).activeNotifications + .asSequence() + .sortedBy { it.postTime } + .map { it.notification.extras.getSerializable(EXTRA_DATA) } + .toList() + } + return emptyList() + } - private inner class MessageReceiver : BroadcastReceiver() { + private class LaunchTabrisActivityReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == ACTION_MESSAGE) { - notifyOfMessage(intent) - } + override fun onReceive(context: Context, intent: Intent) { + context.startActivity(Intent(context, TabrisActivity::class.java).apply { + addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP) + putExtra(EXTRA_DATA, intent.getSerializableExtra(EXTRA_DATA)) + }) + } } - } + private inner class TokenReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == ACTION_TOKEN_REFRESH) { + scope.remoteObject(this)?.notify("tokenChanged", "token", intent.getStringExtra(EXTRA_TOKEN)) + } + } + + } + + private inner class MessageReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == ACTION_MESSAGE) { + notifyOfMessage(intent) + } + } + + } } diff --git a/src/android/com/eclipsesource/firebase/performance/Performance.kt b/src/android/com/eclipsesource/firebase/performance/Performance.kt new file mode 100644 index 0000000..bfa38b6 --- /dev/null +++ b/src/android/com/eclipsesource/firebase/performance/Performance.kt @@ -0,0 +1,31 @@ +package com.eclipsesource.firebase.performance + +import android.app.Activity +import com.google.firebase.perf.FirebasePerformance +import com.google.firebase.perf.metrics.Trace + +class Performance(private val activity: Activity) { + + private val firebasePerformance = FirebasePerformance.getInstance() + + fun setPerformanceCollectionEnabled(enabled: Boolean) { + firebasePerformance.isPerformanceCollectionEnabled = enabled + } + + private val traces = hashMapOf() + + fun startTrace(name: String) { + if (traces.containsKey(name)) { + traces[name]?.start() + } else { + val trace = firebasePerformance.newTrace(name) + traces[name] = trace + trace.start() + } + } + + fun stopTrace(name: String) = traces[name]?.stop() + + fun incrementMetrics(name: String, counter: String, value: Long) = traces[name]?.incrementCounter(counter, value) + +} \ No newline at end of file diff --git a/src/android/com/eclipsesource/firebase/performance/PerformanceHandler.kt b/src/android/com/eclipsesource/firebase/performance/PerformanceHandler.kt new file mode 100644 index 0000000..28e5e37 --- /dev/null +++ b/src/android/com/eclipsesource/firebase/performance/PerformanceHandler.kt @@ -0,0 +1,28 @@ +package com.eclipsesource.firebase.performance + +import com.eclipsesource.tabris.android.ActivityScope +import com.eclipsesource.tabris.android.BooleanProperty +import com.eclipsesource.tabris.android.ObjectHandler +import com.eclipsesource.tabris.android.Property +import com.eclipsesource.tabris.android.internal.ktx.getLong +import com.eclipsesource.v8.V8Object + +class PerformanceHandler(private val scope: ActivityScope) : ObjectHandler { + override val type = "com.eclipsesource.firebase.Performance" + + override val properties = listOf>( + BooleanProperty("performanceCollectionEnabled", { + setPerformanceCollectionEnabled(it ?: false) + }) + ) + + override fun create(id: String, properties: V8Object) = Performance(scope.activity) + + override fun call(performance: Performance, method: String, properties: V8Object) = when (method) { + "startTrace" -> performance.startTrace(properties.getString("name")) + "stopTrace" -> performance.stopTrace(properties.getString("name")) + "incrementMetrics" -> performance.incrementMetrics(properties.getString("name"), properties.getString("counter"), properties.getLong("value")) + else -> null + } + +} \ No newline at end of file diff --git a/types/index.d.ts b/types/index.d.ts index ae5e6b6..fca6ac5 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -2,6 +2,27 @@ import { EventObject, NativeObject, PropertyChangedEvent, Widget, WidgetEvents, declare global { namespace firebase { + const Performance: Performance; + interface Performance extends NativeObject { + performanceCollectionEnabled: boolean; + startTrace(name: string): void; + stopTrace(name: string): void; + incrementMetrics(name1: string, name2: string): void; + incrementMetrics(name1: string, name2: string, value: number): void; + } + const Crashlytics: Crashlytics; + interface Crashlytics extends NativeObject { + setCrashlyticsCollectionEnabled(enabled: boolean): void; + setUserIdentifier(id: string): void; + makeCrash(): void; + log(value: string): void; + log(priority: 0 | 1 | 2 | 3 | 4, tag: string, value: string): void; + // Customizing + setBool(key: string, value: boolean): void; + setString(key: string, value: string): void; + setInt(key: string, value: number): void; + } + const Analytics: Analytics; const Messaging: Messaging; const MessagingEvents: MessagingEvents; @@ -53,4 +74,4 @@ declare global { } } -export {}; +export { }; diff --git a/www/Crashlytics.js b/www/Crashlytics.js new file mode 100644 index 0000000..f120f0d --- /dev/null +++ b/www/Crashlytics.js @@ -0,0 +1,70 @@ +var Crashlytics = tabris.NativeObject.extend('com.eclipsesource.firebase.Crashlytics'); + +Crashlytics.prototype._dispose = function () { + throw new Error('Crashlytics can not be disposed'); +}; + +Crashlytics.prototype.setCrashlyticsCollectionEnabled = function (enabled) { + if (typeof enabled !== 'boolean') + throw new Error('Invoking "setCrashlyticsCollectionEnabled" requires a boolean parameter "enabled" but received ' + enabled); + this._nativeCall('setCrashlyticsCollectionEnabled', { enabled: enabled }); + return this; +} + +Crashlytics.prototype.setUserIdentifier = function (id) { + if (typeof id !== 'string') + throw new Error('Invoking "setUserIdentifier" requires a string parameter "id" but received ' + id); + this._nativeCall('setUserIdentifier', { id: id }); + return this; +} + +Crashlytics.prototype.makeCrash = function () { + this._nativeCall('makeCrash', { id: id }); + return this; +} + +Crashlytics.prototype.log = function (st, nd, rd) { + if (typeof st == 'number') { + if (typeof nd !== 'string') + throw new Error('Invoking "log" requires a string parameter "tag" but received ' + nd); + if (typeof rd !== 'string') + throw new Error('Invoking "log" requires a string parameter "value" but received ' + rd); + this._nativeCall('log', { priority: st, tag: nd, value: rd }); + } + else { + if (typeof st !== 'string') + throw new Error('Invoking "log" requires a string parameter "value" but received ' + st); + this._nativeCall('log', { value: st }); + } + return this; +} + +// Customizing +Crashlytics.prototype.setBool = function (key, value) { + if (typeof key !== 'string') + throw new Error('Invoking "setBool" requires a string parameter "key" but received ' + key); + if (typeof value !== 'boolean') + throw new Error('Invoking "setBool" requires a boolean parameter "value" but received ' + value); + this._nativeCall('setBool', { key: key, value: value }); + return this; +} + +Crashlytics.prototype.setString = function (key, value) { + if (typeof key !== 'string') + throw new Error('Invoking "setString" requires a string parameter "key" but received ' + key); + if (typeof value !== 'string') + throw new Error('Invoking "setString" requires a string parameter "value" but received ' + value); + this._nativeCall('setString', { key: key, value: value }); + return this; +} + +Crashlytics.prototype.setInt = function (key, value) { + if (typeof key !== 'string') + throw new Error('Invoking "setInt" requires a string parameter "key" but received ' + key); + if (typeof value !== 'number') + throw new Error('Invoking "setInt" requires a number parameter "value" but received ' + value); + this._nativeCall('setInt', { key: key, value: value }); + return this; +} + +module.exports = new Crashlytics(); diff --git a/www/Performance.js b/www/Performance.js new file mode 100644 index 0000000..4c60682 --- /dev/null +++ b/www/Performance.js @@ -0,0 +1,36 @@ +var Performance = tabris.NativeObject.extend('com.eclipsesource.firebase.Performance'); + +Performance.prototype._dispose = function () { + throw new Error('Performance can not be disposed'); +}; + +Performance.prototype.startTrace = function (name) { + if (typeof name !== 'string') + throw new Error('Invoking "startTrace" requires a string parameter "name" but received ' + name); + this._nativeCall('startTrace', { name: name }); + return this; +} + +Performance.prototype.stopTrace = function (name) { + if (typeof name !== 'string') + throw new Error('Invoking "stopTrace" requires a string parameter "name" but received ' + name); + this._nativeCall('stopTrace', { name: name }); + return this; +} + +Performance.prototype.incrementMetrics = function (name, counter, value) { + if (typeof name !== 'string') + throw new Error('Invoking "incrementMetrics" requires a string parameter "name" but received ' + name); + if (typeof counter !== 'string') + throw new Error('Invoking "incrementMetrics" requires a string parameter "counter" but received ' + counter); + if (typeof value !== 'number') + throw new Error('Invoking "incrementMetrics" requires a number parameter "value" but received ' + value); + this._nativeCall('incrementMetrics', { name: name, counter: counter, value: value }); + return this; +} + +tabris.NativeObject.defineProperties(Performance.prototype, { + performanceCollectionEnabled: { type: 'boolean', default: null } +}); + +module.exports = new Performance(); From 43db7610e68635f611548ebd66f4c342aad9724e Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 29 Nov 2019 11:12:52 +0300 Subject: [PATCH 02/21] Firebase Performance import fix --- project/android/build.gradle | 1 + src/android/build-extras.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/project/android/build.gradle b/project/android/build.gradle index 824cf3b..8f06b38 100644 --- a/project/android/build.gradle +++ b/project/android/build.gradle @@ -16,6 +16,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath 'io.fabric.tools:gradle:1.31.2' + classpath 'com.google.firebase:perf-plugin:1.3.1' } } diff --git a/src/android/build-extras.gradle b/src/android/build-extras.gradle index 0b71b8a..f564da1 100644 --- a/src/android/build-extras.gradle +++ b/src/android/build-extras.gradle @@ -1,4 +1,5 @@ ext.postBuildExtras = { apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' + apply plugin: 'com.google.firebase.firebase-perf' } From cac1c838b36c8c0b58a29d22f3138411a35dab1c Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 00:26:08 +0400 Subject: [PATCH 03/21] A few more import-related fixes --- .gitignore | 1 + plugin.xml | 10 ++++++---- src/android/build-extras.gradle | 19 ++++++++++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index a8fc0b5..5a6f171 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ plugins/ *.iml local.properties npm-debug.log* +.vscode/ \ No newline at end of file diff --git a/plugin.xml b/plugin.xml index 07cd7fd..87d0adb 100644 --- a/plugin.xml +++ b/plugin.xml @@ -35,6 +35,8 @@ + + @@ -74,10 +76,10 @@ - - - - + + + + diff --git a/src/android/build-extras.gradle b/src/android/build-extras.gradle index f564da1..37d4e97 100644 --- a/src/android/build-extras.gradle +++ b/src/android/build-extras.gradle @@ -1,5 +1,22 @@ +buildscript { + repositories { + google() + jcenter() + maven { + url 'https://maven.fabric.io/public' + } + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.google.gms:google-services:4.3.3' + classpath 'io.fabric.tools:gradle:1.31.2' + classpath 'com.google.firebase:perf-plugin:1.3.1' + } +} + ext.postBuildExtras = { apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' apply plugin: 'com.google.firebase.firebase-perf' -} +} \ No newline at end of file From 30f2e60ebc40634518e91ace5ccb69899ef42679 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 01:00:24 +0400 Subject: [PATCH 04/21] A few more import-related fixes (v2) --- plugin.xml | 2 +- .../{build-extras.gradle => build.gradle} | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) rename src/android/{build-extras.gradle => build.gradle} (55%) diff --git a/plugin.xml b/plugin.xml index 87d0adb..64242cc 100644 --- a/plugin.xml +++ b/plugin.xml @@ -74,7 +74,7 @@ - + diff --git a/src/android/build-extras.gradle b/src/android/build.gradle similarity index 55% rename from src/android/build-extras.gradle rename to src/android/build.gradle index 37d4e97..8ea14dc 100644 --- a/src/android/build-extras.gradle +++ b/src/android/build.gradle @@ -1,22 +1,28 @@ buildscript { repositories { - google() jcenter() - maven { - url 'https://maven.fabric.io/public' - } + mavenCentral() } - dependencies { classpath 'com.android.tools.build:gradle:3.5.2' classpath 'com.google.gms:google-services:4.3.3' - classpath 'io.fabric.tools:gradle:1.31.2' - classpath 'com.google.firebase:perf-plugin:1.3.1' + } +} +repositories { + mavenCentral() + maven { + url "https://maven.google.com" + } +} + +dependencies { + compile('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { + transitive = true } } -ext.postBuildExtras = { +cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' apply plugin: 'com.google.firebase.firebase-perf' -} \ No newline at end of file +}) \ No newline at end of file From 616ed808fddea40e3c82faadf4b7f281441d0a83 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 01:10:03 +0400 Subject: [PATCH 05/21] A few more import-related fixes (v3) --- src/android/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index 8ea14dc..eeade64 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -1,14 +1,16 @@ buildscript { repositories { + google() jcenter() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:+' classpath 'com.google.gms:google-services:4.3.3' } } repositories { + google() mavenCentral() maven { url "https://maven.google.com" From ed5236dbb50709d20c7d4c068ccf490eea639eae Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 01:19:03 +0400 Subject: [PATCH 06/21] A few more import-related fixes (v4) --- src/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index eeade64..1957fb2 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:+' + classpath 'com.android.tools.build:gradle:3.+' classpath 'com.google.gms:google-services:4.3.3' } } From 2e1e39d5df6952e923c2a94d8623074f0eb0a024 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 01:31:24 +0400 Subject: [PATCH 07/21] A few more import-related fixes (v5) --- src/android/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/android/build.gradle b/src/android/build.gradle index 1957fb2..f08aad3 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -7,6 +7,8 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.+' classpath 'com.google.gms:google-services:4.3.3' + classpath 'io.fabric.tools:gradle:1.31.2' + classpath 'com.google.firebase:perf-plugin:1.3.1' } } repositories { From ffa0780603d80b5867b0e758af71716598200e81 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 01:39:25 +0400 Subject: [PATCH 08/21] A few more import-related fixes (v6) --- src/android/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index f08aad3..3d5f3b3 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -3,6 +3,7 @@ buildscript { google() jcenter() mavenCentral() + maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'com.android.tools.build:gradle:3.+' @@ -14,9 +15,8 @@ buildscript { repositories { google() mavenCentral() - maven { - url "https://maven.google.com" - } + maven { url "https://maven.google.com" } + maven { url 'https://maven.fabric.io/public' } } dependencies { From f17adf0dc53d1a72c0642f801d1c7a8a76563652 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 01:55:47 +0400 Subject: [PATCH 09/21] A few more import-related fixes (v7) --- src/android/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index 3d5f3b3..d828abc 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -6,7 +6,7 @@ buildscript { maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.+' + classpath 'com.android.tools.build:gradle:3.5.2' classpath 'com.google.gms:google-services:4.3.3' classpath 'io.fabric.tools:gradle:1.31.2' classpath 'com.google.firebase:perf-plugin:1.3.1' @@ -27,6 +27,6 @@ dependencies { cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' - apply plugin: 'io.fabric' + apply plugin: 'com.crashlytics.tools.gradle.CrashlyticsPlugin' apply plugin: 'com.google.firebase.firebase-perf' }) \ No newline at end of file From 212e8b82644f2a5a5f592ee162f01ec34df7c14c Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 02:09:44 +0400 Subject: [PATCH 10/21] A few more import-related fixes (v8) --- src/android/build.gradle | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index d828abc..3be33dd 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -2,8 +2,9 @@ buildscript { repositories { google() jcenter() - mavenCentral() - maven { url 'https://maven.fabric.io/public' } + maven { + url 'https://maven.fabric.io/public' + } } dependencies { classpath 'com.android.tools.build:gradle:3.5.2' @@ -12,21 +13,9 @@ buildscript { classpath 'com.google.firebase:perf-plugin:1.3.1' } } -repositories { - google() - mavenCentral() - maven { url "https://maven.google.com" } - maven { url 'https://maven.fabric.io/public' } -} - -dependencies { - compile('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { - transitive = true - } -} cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' - apply plugin: 'com.crashlytics.tools.gradle.CrashlyticsPlugin' apply plugin: 'com.google.firebase.firebase-perf' + apply plugin: 'io.fabric' }) \ No newline at end of file From 4ba61ab2e841f6c18d25831b10b0ee4145055929 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 02:21:39 +0400 Subject: [PATCH 11/21] A few more import-related fixes (v9) --- src/android/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/build.gradle b/src/android/build.gradle index 3be33dd..27afa15 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -7,6 +7,7 @@ buildscript { } } dependencies { + classpath 'com.google.firebase:firebase-plugins:2.0.0' classpath 'com.android.tools.build:gradle:3.5.2' classpath 'com.google.gms:google-services:4.3.3' classpath 'io.fabric.tools:gradle:1.31.2' From c72fb4c6bb28ce0105fe20ced2d86c16701aaccc Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 02:49:24 +0400 Subject: [PATCH 12/21] A few more import-related fixes (v10) --- plugin.xml | 14 ++++++++------ src/android/build.gradle | 7 ++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/plugin.xml b/plugin.xml index 64242cc..a014f24 100644 --- a/plugin.xml +++ b/plugin.xml @@ -35,8 +35,10 @@ - - + + + + @@ -76,10 +78,10 @@ - - - - + + + + diff --git a/src/android/build.gradle b/src/android/build.gradle index 27afa15..250300a 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -7,7 +7,6 @@ buildscript { } } dependencies { - classpath 'com.google.firebase:firebase-plugins:2.0.0' classpath 'com.android.tools.build:gradle:3.5.2' classpath 'com.google.gms:google-services:4.3.3' classpath 'io.fabric.tools:gradle:1.31.2' @@ -15,6 +14,12 @@ buildscript { } } +repositories { + google() + jcenter() +} + + cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.firebase-perf' From 2829a0482e45bfcfb3636e76022203d1c8f66b46 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 03:07:27 +0400 Subject: [PATCH 13/21] A few more import-related fixes (v11) --- src/android/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index 250300a..f3444d3 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -2,6 +2,7 @@ buildscript { repositories { google() jcenter() + mavenCentral() maven { url 'https://maven.fabric.io/public' } @@ -17,11 +18,11 @@ buildscript { repositories { google() jcenter() + mavenCentral() } cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' - apply plugin: 'com.google.firebase.firebase-perf' apply plugin: 'io.fabric' }) \ No newline at end of file From b190cb9fb27b4ab3ab81443caa19d0a5778ac8e7 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 03:26:33 +0400 Subject: [PATCH 14/21] A few more import-related fixes (v11-last_try) --- src/android/build.gradle | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/android/build.gradle b/src/android/build.gradle index f3444d3..ece95a5 100644 --- a/src/android/build.gradle +++ b/src/android/build.gradle @@ -15,13 +15,14 @@ buildscript { } } -repositories { - google() - jcenter() - mavenCentral() +allprojects { + repositories { + google() + jcenter() + mavenCentral() + } } - cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' From 6bb9fa55efb420a5762e48028684d75bd7b33065 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Mon, 2 Dec 2019 22:24:43 +0400 Subject: [PATCH 15/21] v6.0.0 --- CHANGELOG.md | 7 ++- README.md | 1 + doc/README.md | 3 +- doc/remote-config.md | 43 +++++++++++++++++ package.json | 2 +- plugin.xml | 4 ++ project/android/build.gradle | 2 - project/android/firebase/build.gradle | 9 ++-- .../firebase/performance/Performance.kt | 2 +- .../firebase/remote_config/RemoteConfig.kt | 35 ++++++++++++++ .../remote_config/RemoteConfigHandler.kt | 30 ++++++++++++ types/index.d.ts | 11 ++++- www/RemoteConfig.js | 46 +++++++++++++++++++ 13 files changed, 182 insertions(+), 13 deletions(-) create mode 100644 doc/remote-config.md create mode 100644 src/android/com/eclipsesource/firebase/remote_config/RemoteConfig.kt create mode 100644 src/android/com/eclipsesource/firebase/remote_config/RemoteConfigHandler.kt create mode 100644 www/RemoteConfig.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 270347f..c9005be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ Change Log ========== -## Version 5.0.0 +## Version 6.0.0 + +* Firebase Remote Config implementation (Android only) +* Added variables to specify the version of dependencies -(thx to [fax1ty](https://github.com/fax1ty)) +## Version 5.0.0 * Firebase Performance implementation (Android only) * Firebase Crashlytics implementation (Android only) diff --git a/README.md b/README.md index a7f47c5..94b3535 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ Feature | Supported platforms [Firebase Analytics](doc/analytics.md) | Android, iOS [Firebase Crashlytics](doc/crashlytics.md) | Android [Firebase Performance](doc/performance.md) | Android +[Firebase Remote Config](doc/remote-config.md) | Android ## Compatibility diff --git a/doc/README.md b/doc/README.md index dc24d36..310d96b 100644 --- a/doc/README.md +++ b/doc/README.md @@ -5,4 +5,5 @@ The Tabris.js Firebase Plugin documentation consists of the following pages: * [Firebase Cloud Messaging](cloud-messaging.md) * [Firebase Analytics](analytics.md) * [Firebase Crashlytics](crashlytics.md) -* [Firebase Performance](performance.md) \ No newline at end of file +* [Firebase Performance](performance.md) +* [Firebase Remote Config](remote-config.md) \ No newline at end of file diff --git a/doc/remote-config.md b/doc/remote-config.md new file mode 100644 index 0000000..04a034f --- /dev/null +++ b/doc/remote-config.md @@ -0,0 +1,43 @@ +# Firebase Remote Config + +## API + +The firebase remote config API is represented as the global object `firebase.RemoteConfig`. + +### `RemoteConfig` + +#### Properties + +##### `minimumFetchIntervalInSeconds` : _number_ + +* Specified minimum config fetch interval. + +#### Methods + +##### `setDefaults(values)` + +* Asynchronously sets default configs using the given key-value JSON Object. + +The values in defaults must be one of the following types: + +* byte[] +* Boolean +* Double +* Long +* String + +##### `getBoolean(key)` + +* Returns the parameter value for the given key as a boolean. + +##### `getDouble(key)` + +* Returns the parameter value for the given key as a double (number). + +##### `getLong(key)` + +* Returns the parameter value for the given key as a long. (number). + +##### `getString(key)` + +* Returns the parameter value for the given key as a String. \ No newline at end of file diff --git a/package.json b/package.json index a3a82ad..03addbe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tabris-plugin-firebase", - "version": "5.0.0", + "version": "6.0.0", "description": "A firebase plugin for Tabris.js", "types": "./types/index.d.ts", "peerDependencies": { diff --git a/plugin.xml b/plugin.xml index a014f24..c1f5817 100644 --- a/plugin.xml +++ b/plugin.xml @@ -65,6 +65,7 @@ + @@ -98,6 +99,9 @@ + + + diff --git a/project/android/build.gradle b/project/android/build.gradle index 8f06b38..3f9864a 100644 --- a/project/android/build.gradle +++ b/project/android/build.gradle @@ -1,8 +1,6 @@ buildscript { ext { - playServicesVersion = '15.0.0' kotlinVersion = '1.3.50' - crashlyticsVersion = '2.10.1' } repositories { google() diff --git a/project/android/firebase/build.gradle b/project/android/firebase/build.gradle index 388eaf1..dd94ed0 100644 --- a/project/android/firebase/build.gradle +++ b/project/android/firebase/build.gradle @@ -2,9 +2,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' dependencies { - implementation "com.google.firebase:firebase-core:$playServicesVersion" - implementation "com.google.firebase:firebase-messaging:$playServicesVersion" - implementation "com.google.firebase:firebase-analytics:$playServicesVersion" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" testImplementation 'junit:junit:4.12' @@ -15,8 +12,10 @@ dependencies { implementation 'com.eclipsesource.tabris.android:tabris:3.2.1' implementation "com.eclipsesource.j2v8:j2v8_win32_x86_64:4.6.0" - implementation "com.crashlytics.sdk.android:crashlytics:$crashlyticsVersion" - implementation "com.google.firebase:firebase-perf:$playServicesVersion" + implementation "com.google.firebase:firebase-messaging:20.0.1" + implementation "com.google.firebase:firebase-analytics:17.2.1" + implementation "com.crashlytics.sdk.android:crashlytics:2.10.1" + implementation "com.google.firebase:firebase-perf:19.0.2" } android { diff --git a/src/android/com/eclipsesource/firebase/performance/Performance.kt b/src/android/com/eclipsesource/firebase/performance/Performance.kt index bfa38b6..d03f109 100644 --- a/src/android/com/eclipsesource/firebase/performance/Performance.kt +++ b/src/android/com/eclipsesource/firebase/performance/Performance.kt @@ -26,6 +26,6 @@ class Performance(private val activity: Activity) { fun stopTrace(name: String) = traces[name]?.stop() - fun incrementMetrics(name: String, counter: String, value: Long) = traces[name]?.incrementCounter(counter, value) + fun incrementMetrics(name: String, counter: String, value: Long) = traces[name]?.incrementMetric(counter, value) } \ No newline at end of file diff --git a/src/android/com/eclipsesource/firebase/remote_config/RemoteConfig.kt b/src/android/com/eclipsesource/firebase/remote_config/RemoteConfig.kt new file mode 100644 index 0000000..bf56a80 --- /dev/null +++ b/src/android/com/eclipsesource/firebase/remote_config/RemoteConfig.kt @@ -0,0 +1,35 @@ +package com.eclipsesource.firebase.remote_config + +import android.app.Activity +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings + +class RemoteConfig(private val activity: Activity) { + + private val firebaseRemoteConfig = FirebaseRemoteConfig.getInstance() + private var minimumFetchIntervalInSeconds: Long = 0 + + fun setMinimumFetchIntervalInSeconds(interval: Long) { + minimumFetchIntervalInSeconds = interval + firebaseRemoteConfig.setConfigSettingsAsync( + FirebaseRemoteConfigSettings.Builder() + .setMinimumFetchIntervalInSeconds(interval) + .build() + ) + } + + fun getMinimumFetchIntervalInSeconds(): Long { + return minimumFetchIntervalInSeconds + } + + fun setDefaults(values: Map) = firebaseRemoteConfig.setDefaultsAsync(values)!! + + fun getBoolean(key: String) = firebaseRemoteConfig.getBoolean(key) + + fun getDouble(key: String) = firebaseRemoteConfig.getDouble(key) + + fun getLong(key: String) = firebaseRemoteConfig.getLong(key) + + fun getString(key: String) = firebaseRemoteConfig.getString(key) + +} \ No newline at end of file diff --git a/src/android/com/eclipsesource/firebase/remote_config/RemoteConfigHandler.kt b/src/android/com/eclipsesource/firebase/remote_config/RemoteConfigHandler.kt new file mode 100644 index 0000000..8303451 --- /dev/null +++ b/src/android/com/eclipsesource/firebase/remote_config/RemoteConfigHandler.kt @@ -0,0 +1,30 @@ +package com.eclipsesource.firebase.remote_config + +import com.eclipsesource.tabris.android.ActivityScope +import com.eclipsesource.tabris.android.LongProperty +import com.eclipsesource.tabris.android.ObjectHandler +import com.eclipsesource.tabris.android.Property +import com.eclipsesource.tabris.android.internal.ktx.toMap +import com.eclipsesource.v8.V8Object + +class RemoteConfigHandler(private val scope: ActivityScope) : ObjectHandler { + override val type = "com.eclipsesource.firebase.RemoteConfig" + + override val properties = listOf>( + LongProperty("minimumFetchIntervalInSeconds", { + setMinimumFetchIntervalInSeconds(it ?: 3600) + }, { return@LongProperty getMinimumFetchIntervalInSeconds() }) + ) + + override fun create(id: String, properties: V8Object) = RemoteConfig(scope.activity).also { it.setMinimumFetchIntervalInSeconds(3600) } + + override fun call(performance: RemoteConfig, method: String, properties: V8Object) = when (method) { + "setDefaults"-> performance.setDefaults(properties.getObject("values").toMap()) + "getBoolean" -> performance.getBoolean(properties.getString("key")) + "getDouble" -> performance.getDouble(properties.getString("key")) + "getLong" -> performance.getLong(properties.getString("key")) + "getString" -> performance.getString(properties.getString("key")) + else -> null + } + +} \ No newline at end of file diff --git a/types/index.d.ts b/types/index.d.ts index fca6ac5..3e58b72 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,4 +1,4 @@ -import { EventObject, NativeObject, PropertyChangedEvent, Widget, WidgetEvents, WidgetProperties } from 'tabris'; +import { EventObject, NativeObject, PropertyChangedEvent, Widget } from 'tabris'; declare global { namespace firebase { @@ -22,6 +22,15 @@ declare global { setString(key: string, value: string): void; setInt(key: string, value: number): void; } + const RemoteConfig: RemoteConfig; + interface RemoteConfig extends NativeObject { + minimumFetchIntervalInSeconds: number; + setDefaults(values: Object): void; + getBoolean(key: string): boolean; + getDouble(key: string): number; + getLong(key: string): number; + getString(key: string): string; + } const Analytics: Analytics; const Messaging: Messaging; diff --git a/www/RemoteConfig.js b/www/RemoteConfig.js new file mode 100644 index 0000000..384e07b --- /dev/null +++ b/www/RemoteConfig.js @@ -0,0 +1,46 @@ +var RemoteConfig = tabris.NativeObject.extend('com.eclipsesource.firebase.RemoteConfig'); + +RemoteConfig.prototype._dispose = function () { + throw new Error('RemoteConfig can not be disposed'); +}; + +RemoteConfig.prototype.setDefaults = function (values) { + if (typeof values == 'undefined') + throw new Error('Invoking "setDefaults" requires a not null parameter "values" but received ' + values); + this._nativeCall('setDefaults', { values: values }); + return this; +} + +RemoteConfig.prototype.getBoolean = function (key) { + if (typeof key == 'string') + throw new Error('Invoking "getBoolean" requires a string parameter "key" but received ' + key); + this._nativeCall('getBoolean', { key: key }); + return this; +} + +RemoteConfig.prototype.getDouble = function (key) { + if (typeof key == 'string') + throw new Error('Invoking "getDouble" requires a string parameter "key" but received ' + key); + this._nativeCall('getDouble', { key: key }); + return this; +} + +RemoteConfig.prototype.getLong = function (key) { + if (typeof key == 'string') + throw new Error('Invoking "getLong" requires a string parameter "key" but received ' + key); + this._nativeCall('getLong', { key: key }); + return this; +} + +RemoteConfig.prototype.getString = function (key) { + if (typeof key == 'string') + throw new Error('Invoking "getString" requires a string parameter "key" but received ' + key); + this._nativeCall('getString', { key: key }); + return this; +} + +tabris.NativeObject.defineProperties(RemoteConfig.prototype, { + minimumFetchIntervalInSeconds: { type: 'number', default: 3600 } +}); + +module.exports = new RemoteConfig(); From a72b0ac8112494493ba87512a1f65645b0442c69 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 6 Dec 2019 14:38:05 +0400 Subject: [PATCH 16/21] A few more import-related fixes (v12) --- plugin.xml | 2 +- src/android/build.gradle | 29 ----------------------------- src/android/firebase_build.gradle | 20 ++++++++++++++++++++ 3 files changed, 21 insertions(+), 30 deletions(-) delete mode 100644 src/android/build.gradle create mode 100644 src/android/firebase_build.gradle diff --git a/plugin.xml b/plugin.xml index c1f5817..04e6824 100644 --- a/plugin.xml +++ b/plugin.xml @@ -77,7 +77,7 @@ - + diff --git a/src/android/build.gradle b/src/android/build.gradle deleted file mode 100644 index ece95a5..0000000 --- a/src/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenCentral() - maven { - url 'https://maven.fabric.io/public' - } - } - dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' - classpath 'com.google.gms:google-services:4.3.3' - classpath 'io.fabric.tools:gradle:1.31.2' - classpath 'com.google.firebase:perf-plugin:1.3.1' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenCentral() - } -} - -cdvPluginPostBuildExtras.add({ - apply plugin: 'com.google.gms.google-services' - apply plugin: 'io.fabric' -}) \ No newline at end of file diff --git a/src/android/firebase_build.gradle b/src/android/firebase_build.gradle new file mode 100644 index 0000000..3212651 --- /dev/null +++ b/src/android/firebase_build.gradle @@ -0,0 +1,20 @@ +repositories{ + google() + jcenter() + mavenCentral() + maven { + url 'https://maven.fabric.io/public' + } +} + +dependencies { + classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.google.gms:google-services:4.3.3' + classpath 'io.fabric.tools:gradle:1.31.2' + classpath 'com.google.firebase:perf-plugin:1.3.1' +} + +cdvPluginPostBuildExtras.add({ + apply plugin: 'com.google.gms.google-services' + apply plugin: 'io.fabric' +}) \ No newline at end of file From 8c5e08c9536e47009f9cde7e9fc23b984f3c4046 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 6 Dec 2019 14:56:19 +0400 Subject: [PATCH 17/21] v13 --- src/android/firebase_build.gradle | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/android/firebase_build.gradle b/src/android/firebase_build.gradle index 3212651..dc27844 100644 --- a/src/android/firebase_build.gradle +++ b/src/android/firebase_build.gradle @@ -1,3 +1,4 @@ +buildscript { repositories{ google() jcenter() @@ -13,8 +14,9 @@ dependencies { classpath 'io.fabric.tools:gradle:1.31.2' classpath 'com.google.firebase:perf-plugin:1.3.1' } +} -cdvPluginPostBuildExtras.add({ - apply plugin: 'com.google.gms.google-services' - apply plugin: 'io.fabric' -}) \ No newline at end of file +ext.postBuildExtras = { + apply plugin: 'com.google.gms.googleservices.GoogleServicesPlugin' + apply plugin: 'io.fabric.tools.gradle.CrashlyticsPlugin' +} \ No newline at end of file From a9144354131d6f5854df734bcc547bd09e6e7a63 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 6 Dec 2019 15:06:32 +0400 Subject: [PATCH 18/21] v14 --- src/android/firebase_build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/android/firebase_build.gradle b/src/android/firebase_build.gradle index dc27844..8ac8b99 100644 --- a/src/android/firebase_build.gradle +++ b/src/android/firebase_build.gradle @@ -17,6 +17,6 @@ dependencies { } ext.postBuildExtras = { - apply plugin: 'com.google.gms.googleservices.GoogleServicesPlugin' - apply plugin: 'io.fabric.tools.gradle.CrashlyticsPlugin' + apply plugin: 'com.google.gms.google-services' + apply plugin: 'com.crashlytics.tools.gradle.CrashlyticsPlugin' } \ No newline at end of file From 7c746dfb434a79f8af5919c66735a9da483ca3c4 Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 6 Dec 2019 23:42:07 +0400 Subject: [PATCH 19/21] v15 --- src/android/firebase_build.gradle | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/android/firebase_build.gradle b/src/android/firebase_build.gradle index 8ac8b99..0abfe7d 100644 --- a/src/android/firebase_build.gradle +++ b/src/android/firebase_build.gradle @@ -16,7 +16,15 @@ dependencies { } } + +dependencies { + compile('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { + transitive = true + } +} + + ext.postBuildExtras = { apply plugin: 'com.google.gms.google-services' - apply plugin: 'com.crashlytics.tools.gradle.CrashlyticsPlugin' + apply plugin: 'io.fabric' } \ No newline at end of file From ae2113401273778e648e3c4a971176e7960a929b Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Fri, 6 Dec 2019 23:50:36 +0400 Subject: [PATCH 20/21] just for test --- src/android/firebase_build.gradle | 63 ++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/src/android/firebase_build.gradle b/src/android/firebase_build.gradle index 0abfe7d..72485c2 100644 --- a/src/android/firebase_build.gradle +++ b/src/android/firebase_build.gradle @@ -1,30 +1,59 @@ +// buildscript { +// repositories{ +// google() +// jcenter() +// mavenCentral() +// maven { +// url 'https://maven.fabric.io/public' +// } +// } + +// dependencies { +// classpath 'com.android.tools.build:gradle:3.5.2' +// classpath 'com.google.gms:google-services:4.3.3' +// classpath 'io.fabric.tools:gradle:1.31.2' +// classpath 'com.google.firebase:perf-plugin:1.3.1' +// } +// } + + +// dependencies { +// compile('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { +// transitive = true +// } +// } + + +// ext.postBuildExtras = { +// apply plugin: 'com.google.gms.google-services' +// apply plugin: 'io.fabric' +// } + buildscript { -repositories{ - google() - jcenter() + repositories { + jcenter() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:+' + classpath 'com.google.gms:google-services:4.1.0' + } +} +repositories { mavenCentral() maven { - url 'https://maven.fabric.io/public' + url "https://maven.google.com" } } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' - classpath 'com.google.gms:google-services:4.3.3' - classpath 'io.fabric.tools:gradle:1.31.2' - classpath 'com.google.firebase:perf-plugin:1.3.1' -} -} - - -dependencies { - compile('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { + compile 'com.google.firebase:firebase-auth:+' + compile('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') { transitive = true } } - -ext.postBuildExtras = { +cdvPluginPostBuildExtras.add({ apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' -} \ No newline at end of file +}) \ No newline at end of file From d1488d43293bf61ebe76e487c348f4558da0ecfd Mon Sep 17 00:00:00 2001 From: Artyom Davydov Date: Sat, 7 Dec 2019 00:13:24 +0400 Subject: [PATCH 21/21] idk --- src/android/firebase_build.gradle | 40 +++++-------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/src/android/firebase_build.gradle b/src/android/firebase_build.gradle index 72485c2..cffc692 100644 --- a/src/android/firebase_build.gradle +++ b/src/android/firebase_build.gradle @@ -1,42 +1,15 @@ -// buildscript { -// repositories{ -// google() -// jcenter() -// mavenCentral() -// maven { -// url 'https://maven.fabric.io/public' -// } -// } - -// dependencies { -// classpath 'com.android.tools.build:gradle:3.5.2' -// classpath 'com.google.gms:google-services:4.3.3' -// classpath 'io.fabric.tools:gradle:1.31.2' -// classpath 'com.google.firebase:perf-plugin:1.3.1' -// } -// } - - -// dependencies { -// compile('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { -// transitive = true -// } -// } - - -// ext.postBuildExtras = { -// apply plugin: 'com.google.gms.google-services' -// apply plugin: 'io.fabric' -// } - buildscript { repositories { jcenter() mavenCentral() + maven { + url 'https://maven.fabric.io/public' + } } dependencies { - classpath 'com.android.tools.build:gradle:+' - classpath 'com.google.gms:google-services:4.1.0' + classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.google.gms:google-services:4.3.3' + classpath 'com.google.firebase:perf-plugin:1.3.1' } } repositories { @@ -47,7 +20,6 @@ repositories { } dependencies { - compile 'com.google.firebase:firebase-auth:+' compile('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') { transitive = true }