From f4bad84b5d541bff743f281f18df9998800d2572 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Mon, 18 Nov 2019 19:18:42 -0600 Subject: [PATCH 01/14] Build against latest Kotlin release --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 420a5aef..2978ffca 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.3.60' repositories { google() From 5a02d94b127a089559875cee7ada75556e774d26 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Mon, 18 Nov 2019 23:42:55 -0600 Subject: [PATCH 02/14] Lib updates --- app/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 58a716cf..3ceef684 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'io.fabric.tools:gradle:1.31.0' + classpath 'io.fabric.tools:gradle:1.31.2' } } @@ -95,9 +95,9 @@ dependencies { // implemented by hand (and as such, might not be worth it.) implementation 'com.getbase:floatingactionbutton:1.10.1' - releaseImplementation 'com.google.firebase:firebase-core:17.2.0' - releaseImplementation 'com.google.firebase:firebase-analytics:17.2.0' - releaseImplementation 'com.google.firebase:firebase-perf:19.0.0' + releaseImplementation 'com.google.firebase:firebase-core:17.2.1' + releaseImplementation 'com.google.firebase:firebase-analytics:17.2.1' + releaseImplementation 'com.google.firebase:firebase-perf:19.0.2' releaseImplementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' // Segment From 569f6c613b8d02e5a5bd1fd3144cc8b867b7d712 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Mon, 18 Nov 2019 23:43:04 -0600 Subject: [PATCH 03/14] Fixes ch39530 --- .../io/particle/android/sdk/tinker/TinkerApplication.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/io/particle/android/sdk/tinker/TinkerApplication.kt b/app/src/main/java/io/particle/android/sdk/tinker/TinkerApplication.kt index 76383f3a..03dc7875 100644 --- a/app/src/main/java/io/particle/android/sdk/tinker/TinkerApplication.kt +++ b/app/src/main/java/io/particle/android/sdk/tinker/TinkerApplication.kt @@ -4,6 +4,8 @@ import android.app.Application import android.content.Context import android.content.pm.PackageManager import android.os.Build +import android.util.Log +import io.particle.android.sdk.cloud.ParticleCloudSDK import io.particle.android.sdk.devicesetup.BuildConfig import io.particle.android.sdk.devicesetup.ParticleDeviceSetupLibrary import io.particle.android.sdk.onApplicationCreated @@ -38,6 +40,11 @@ class TinkerApplication : Application() { "OS version=${Build.VERSION.RELEASE},\n" + "App version=$appVersionName," } + + // Use `Log` class to only log this to the system log, and not the separate logs we store + // on disk for export on user request + val last4 = ParticleCloudSDK.getCloud().accessToken?.takeLast(4) ?: "No token stored yet!" + Log.i("ParticleAuth", "Last 4 digits of auth token: $last4") } } From 3788026183b7b6be7d212fd4af0c73d5a9453205 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Mon, 18 Nov 2019 23:46:25 -0600 Subject: [PATCH 04/14] Fixes ch39999 --- .../io/particle/android/sdk/cloud/ApiDefs.kt | 15 ------------- .../android/sdk/cloud/ParticleCloud.kt | 21 +------------------ 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ApiDefs.kt b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ApiDefs.kt index 7a1dc593..be028aab 100644 --- a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ApiDefs.kt +++ b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ApiDefs.kt @@ -284,20 +284,5 @@ class ApiDefs { @POST("/v1/user/password-reset") fun requestPasswordReset(@Field("username") email: String): Response - @FormUrlEncoded - @POST("/v1/products/{productId}/customers/reset_password") - fun requestPasswordResetForCustomer( - @Field("email") email: String, - @Path("productId") productId: Int? - ): Response - - @FormUrlEncoded - @POST("/v1/orgs/{orgName}/customers/reset_password") - @Deprecated("") - fun requestPasswordResetForCustomer( - @Field("email") email: String, - @Path("orgName") orgName: String - ): Response - } } diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleCloud.kt b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleCloud.kt index 6f64355e..f401ba39 100644 --- a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleCloud.kt +++ b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleCloud.kt @@ -409,26 +409,6 @@ class ParticleCloud internal constructor( } catch (error: RetrofitError) { throw ParticleCloudException(error) } - - } - - @WorkerThread - @Throws(ParticleCloudException::class) - fun requestPasswordResetForCustomer(email: String, productId: Int) { - return runHandlingCommonErrors { - identityApi.requestPasswordResetForCustomer(email, productId) - } - } - - @WorkerThread - @Deprecated("") - @Throws(ParticleCloudException::class) - fun requestPasswordResetForCustomer(email: String, organizationSlug: String) { - return runHandlingCommonErrors { - log.w("Use product id instead of organization slug.") - @Suppress("DEPRECATION") - identityApi.requestPasswordResetForCustomer(email, organizationSlug) - } } @WorkerThread @@ -1060,6 +1040,7 @@ class ParticleCloud internal constructor( "int32" -> VariableType.INT "double" -> VariableType.DOUBLE "string" -> VariableType.STRING + "bool" -> VariableType.BOOLEAN else -> null } } From cc4e1adcec0819cc14d0f367786ec135f4c0d1f6 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Mon, 18 Nov 2019 23:55:45 -0600 Subject: [PATCH 05/14] Add boolean support to the cloud SDK and the app; fixes ch40227 --- .../android/sdk/ui/FunctionsAndVariablesFragment.kt | 10 ++++------ .../io/particle/android/sdk/cloud/ParticleDevice.kt | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/particle/android/sdk/ui/FunctionsAndVariablesFragment.kt b/app/src/main/java/io/particle/android/sdk/ui/FunctionsAndVariablesFragment.kt index 19638b8e..696d164d 100644 --- a/app/src/main/java/io/particle/android/sdk/ui/FunctionsAndVariablesFragment.kt +++ b/app/src/main/java/io/particle/android/sdk/ui/FunctionsAndVariablesFragment.kt @@ -344,19 +344,16 @@ private class DataListAdapter( override fun callApi(particleDevice: ParticleDevice): String { return try { if (variable.variableType === VariableType.INT) { + // sometimes ints are serialized as floats, sometimes they're + // serialized as actual ints. Depends on size, I guess? ¯\_(ツ)_/¯ val value = device.getVariable(variable.name).toString() - val dotIndex = value.indexOf(".") - value.substring( - 0, - if (dotIndex > 0) dotIndex else value.length - ) + value.toFloat().toInt().toString() } else { device.getVariable(variable.name).toString() } } catch (e: ParticleDevice.VariableDoesNotExistException) { throw ParticleCloudException(e) } - } override fun onSuccess(value: String) { @@ -391,6 +388,7 @@ private class DataListAdapter( VariableType.INT -> "(Integer)" VariableType.DOUBLE -> "(Double)" VariableType.STRING -> "(String)" + VariableType.BOOLEAN -> "(Boolean)" } holder.type.text = type } diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt index b5eb305b..db76fbd9 100644 --- a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt +++ b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt @@ -216,7 +216,8 @@ class ParticleDevice internal constructor( enum class VariableType { INT, DOUBLE, - STRING + STRING, + BOOLEAN } From 3203fac7022be75cdbf856ab089b59575baca6c0 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Tue, 19 Nov 2019 00:46:03 -0600 Subject: [PATCH 06/14] Disable this by default so the community can build the app without needing the google services JSON file. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3ceef684..99e585e2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -144,4 +144,4 @@ dependencies { testImplementation 'junit:junit:4.12' } -apply plugin: 'com.google.gms.google-services' /* uncomment for release builds */ +//apply plugin: 'com.google.gms.google-services' /* uncomment for release builds */ From 255af1c45e53800fc7b7cf753fa554defa2d9f89 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Tue, 19 Nov 2019 00:47:03 -0600 Subject: [PATCH 07/14] This should be initialized immediately, before creating the view --- .../main/java/io/particle/android/sdk/ui/InspectorActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/particle/android/sdk/ui/InspectorActivity.kt b/app/src/main/java/io/particle/android/sdk/ui/InspectorActivity.kt index ac06778e..fb085f9b 100644 --- a/app/src/main/java/io/particle/android/sdk/ui/InspectorActivity.kt +++ b/app/src/main/java/io/particle/android/sdk/ui/InspectorActivity.kt @@ -78,10 +78,10 @@ class InspectorActivity : BaseActivity() { return } + device = intent.getParcelableExtra(EXTRA_DEVICE) + setContentView(R.layout.activity_inspector) - device = intent.getParcelableExtra(EXTRA_DEVICE) - // Show the Up button in the action bar. supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowTitleEnabled(true) From 65fe5a96ac01d7cd15b1c24743e46b43f2686b9c Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Tue, 19 Nov 2019 23:19:42 -0600 Subject: [PATCH 08/14] Convert ParticleEvent to Kotlin to give it a proper nullability contract --- .../android/sdk/cloud/ParticleEvent.java | 35 ------------------- .../android/sdk/cloud/ParticleEvent.kt | 17 +++++++++ 2 files changed, 17 insertions(+), 35 deletions(-) delete mode 100644 cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.java create mode 100644 cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.kt diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.java b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.java deleted file mode 100644 index 01f7fd98..00000000 --- a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.particle.android.sdk.cloud; - -import com.google.gson.annotations.SerializedName; - -import java.util.Date; - -import javax.annotation.ParametersAreNonnullByDefault; - - -// Normally it's bad form to use network data models as API data models, but considering that -// for the moment, they'd be a 1:1 mapping, we'll just reuse this data model class. If the -// network API changes, then we can write new classes for the network API models, without -// impacting the public API of the SDK. -@ParametersAreNonnullByDefault -public class ParticleEvent { - - @SerializedName("coreid") - public final String deviceId; - - @SerializedName("data") - public final String dataPayload; - - @SerializedName("published_at") - public final Date publishedAt; - - @SerializedName("ttl") - public final int timeToLive; - - public ParticleEvent(String deviceId, String dataPayload, Date publishedAt, int timeToLive) { - this.deviceId = deviceId; - this.dataPayload = dataPayload; - this.publishedAt = publishedAt; - this.timeToLive = timeToLive; - } -} diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.kt b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.kt new file mode 100644 index 00000000..488a2cf8 --- /dev/null +++ b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleEvent.kt @@ -0,0 +1,17 @@ +package io.particle.android.sdk.cloud + +import com.google.gson.annotations.SerializedName +import java.util.* +import javax.annotation.ParametersAreNonnullByDefault + +// Normally it's bad form to use network data models as API data models, but considering that +// for the moment, they'd be a 1:1 mapping, we'll just reuse this data model class. If the +// network API changes, then we can write new classes for the network API models, without +// impacting the public API of the SDK. +@ParametersAreNonnullByDefault +class ParticleEvent( + @SerializedName("coreid") val deviceId: String, + @SerializedName("data") val dataPayload: String?, + @SerializedName("published_at") val publishedAt: Date, + @SerializedName("ttl") val timeToLive: Int? +) \ No newline at end of file From e6df8bce29159d56e05cefe23bc1de557dfea52b Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Wed, 20 Nov 2019 22:03:16 -0600 Subject: [PATCH 09/14] Lib updates in the SDK example app --- sdk_example_app/build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk_example_app/build.gradle b/sdk_example_app/build.gradle index 49ccabc7..fe410a5c 100644 --- a/sdk_example_app/build.gradle +++ b/sdk_example_app/build.gradle @@ -35,8 +35,9 @@ dependencies { // // comment out the above, and // UNCOMMENT THE FOLLOWING TO USE A PUBLISHED VERSION OF THE SDK: - // implementation 'io.particle:cloudsdk:0.3.3' +// implementation 'io.particle:cloudsdk:1.0.0' - implementation 'androidx.fragment:fragment:1.0.0' - implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.fragment:fragment:1.1.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'org.greenrobot:eventbus:3.0.0' } From fdb6b7b5af8eb3feb0492d098fd2074aa15b78cb Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Wed, 20 Nov 2019 22:04:05 -0600 Subject: [PATCH 10/14] Change the reference in the device setup lib to match current cloud SDK version (even though it's commented out for daily usage) --- devicesetup/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devicesetup/build.gradle b/devicesetup/build.gradle index 0d45080e..6ba3a17a 100644 --- a/devicesetup/build.gradle +++ b/devicesetup/build.gradle @@ -66,7 +66,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':cloudsdk') - //api 'io.particle:cloudsdk:0.4.9' +// api 'io.particle:cloudsdk:1.0.0' api 'com.squareup.phrase:phrase:1.1.0' api 'uk.co.chrisjenx:calligraphy:2.3.0' From 3c91491c7369660a7b2139996bafb766da8f3d86 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Wed, 20 Nov 2019 22:04:34 -0600 Subject: [PATCH 11/14] Make these calls accessible from Java again --- cloudsdk/src/main/java/io/particle/android/sdk/utils/Toaster.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/utils/Toaster.kt b/cloudsdk/src/main/java/io/particle/android/sdk/utils/Toaster.kt index ca7dbcf1..751f9382 100644 --- a/cloudsdk/src/main/java/io/particle/android/sdk/utils/Toaster.kt +++ b/cloudsdk/src/main/java/io/particle/android/sdk/utils/Toaster.kt @@ -19,6 +19,7 @@ object Toaster { * * This is safe to call from background/worker threads. */ + @JvmStatic fun s(activity: Activity, msg: String?) { showToast(activity, msg, Toast.LENGTH_SHORT) } @@ -29,6 +30,7 @@ object Toaster { * * This is safe to call from background/worker threads. */ + @JvmStatic fun l(activity: Activity, msg: String?) { showToast(activity, msg, Toast.LENGTH_LONG) } From 45f6ecfe1d334164ceb09de53a6ba9959df895dd Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Wed, 20 Nov 2019 22:05:10 -0600 Subject: [PATCH 12/14] Adjust to nullability changes in events --- .../particle/android/sdk/ui/EventsFragment.kt | 23 ++++++++++--------- .../android/sdk/cloud/ParticleDevice.kt | 8 +++++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/particle/android/sdk/ui/EventsFragment.kt b/app/src/main/java/io/particle/android/sdk/ui/EventsFragment.kt index 31ae7277..e099bcf8 100644 --- a/app/src/main/java/io/particle/android/sdk/ui/EventsFragment.kt +++ b/app/src/main/java/io/particle/android/sdk/ui/EventsFragment.kt @@ -19,7 +19,6 @@ import android.widget.* import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller @@ -218,8 +217,8 @@ class EventsFragment : Fragment() { } private class Event internal constructor( - internal var name: String, - internal var particleEvent: ParticleEvent + internal var name: String?, + internal var particleEvent: ParticleEvent? ) private class EventListAdapter : RecyclerView.Adapter() { @@ -250,10 +249,11 @@ class EventsFragment : Fragment() { override fun onBindViewHolder(holder: ViewHolder, position: Int) { val event = filteredData[position] + holder.eventName.text = event.name - holder.eventData.text = event.particleEvent.dataPayload + holder.eventData.text = event.particleEvent?.dataPayload holder.eventTime.text = SimpleDateFormat("MMM dd, yyyy HH:mm:ss", Locale.getDefault()) - .format(event.particleEvent.publishedAt) + .format(event.particleEvent?.publishedAt) holder.copyButton.setOnClickListener { _ -> val context = holder.itemView.context @@ -269,14 +269,14 @@ class EventsFragment : Fragment() { val jsonObject = JSONObject() try { jsonObject.put("Event", event.name) - jsonObject.put("DeviceID", event.particleEvent.deviceId) - jsonObject.put("Data", event.particleEvent.dataPayload) + jsonObject.put("DeviceID", event.particleEvent?.deviceId) + jsonObject.put("Data", event.particleEvent?.dataPayload) val dateTime = SimpleDateFormat( "yyyy-MM-dd HH:mm::ssZ", Locale.getDefault() - ).format(event.particleEvent.publishedAt) + ).format(event.particleEvent?.publishedAt) jsonObject.put("Time", dateTime) - jsonObject.put("TTL", event.particleEvent.timeToLive) + jsonObject.put("TTL", event.particleEvent?.timeToLive) } catch (ignore: JSONException) { } @@ -291,7 +291,7 @@ class EventsFragment : Fragment() { fun add(event: Event) { data.add(0, event) - if (event.name.contains(filter)) { + if (event.name?.contains(filter) == true) { filteredData.add(0, event) notifyItemInserted(0) } @@ -303,7 +303,8 @@ class EventsFragment : Fragment() { notifyDataSetChanged() for (event in data) { - if (event.name.contains(filter) || event.particleEvent.dataPayload.contains(filter)) { + if (event.name?.contains(filter) == true + || event.particleEvent?.dataPayload?.contains(filter) == true) { filteredData.add(event) notifyItemInserted(data.indexOf(event)) } diff --git a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt index db76fbd9..989de19b 100644 --- a/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt +++ b/cloudsdk/src/main/java/io/particle/android/sdk/cloud/ParticleDevice.kt @@ -570,12 +570,16 @@ class ParticleDevice internal constructor( val eventBus = EventBus.getDefault() subscriptions.add( subscribeToSystemEvent("spark/status") { _, particleEvent -> - sendUpdateStatusChange(eventBus, particleEvent.dataPayload) + particleEvent.dataPayload?.let { + sendUpdateStatusChange(eventBus, particleEvent.dataPayload) + } } ) subscriptions.add( subscribeToSystemEvent("spark/flash/status") { _, particleEvent -> - sendUpdateFlashChange(eventBus, particleEvent.dataPayload) + particleEvent.dataPayload?.let { + sendUpdateFlashChange(eventBus, particleEvent.dataPayload) + } } ) subscriptions.add( From fdc42375766dff5b971cb9717b174a8e130294bf Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Wed, 20 Nov 2019 22:10:04 -0600 Subject: [PATCH 13/14] Remove this since we don't use the built-in Jacoco integration anymore --- cloudsdk/build.gradle | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cloudsdk/build.gradle b/cloudsdk/build.gradle index 01d0758f..7df94d92 100644 --- a/cloudsdk/build.gradle +++ b/cloudsdk/build.gradle @@ -62,12 +62,6 @@ android { } } - buildTypes { - debug { - testCoverageEnabled = true - } - } - compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 From 6036291685c1b03e07c10f04176f6a4880261df2 Mon Sep 17 00:00:00 2001 From: Jens Knutson Date: Wed, 20 Nov 2019 22:14:49 -0600 Subject: [PATCH 14/14] Bump to 1.0 and update the changelog --- cloudsdk/CHANGELOG | 10 ++++++++++ cloudsdk/build.gradle | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cloudsdk/CHANGELOG b/cloudsdk/CHANGELOG index 724febb4..f2c8feff 100644 --- a/cloudsdk/CHANGELOG +++ b/cloudsdk/CHANGELOG @@ -1,3 +1,13 @@ +1.0.0 +===== +* Add support for boolean variables +* Remove requestPasswordResetForCustomer() since this functionality has been removed from the + Particle Cloud +* Change nullability contract of ParticleEvent to reflect that almost anything can be null +* Bump to 1.0.0, both to signify that we are no longer considered beta, and because this release + makes a couple breaking changes. + + 0.5.1 ===== * New features - Two factor authentication. diff --git a/cloudsdk/build.gradle b/cloudsdk/build.gradle index 7df94d92..95a6b4e3 100644 --- a/cloudsdk/build.gradle +++ b/cloudsdk/build.gradle @@ -8,7 +8,7 @@ plugins { // This is the library version used when deploying the artifact -version = '0.5.1' +version = '1.0.0' ext { bintrayRepo = 'android'