From e06c7c5f02375d3d5eeb22240e10cc5b317c4df7 Mon Sep 17 00:00:00 2001 From: Dale Hawkins Date: Thu, 8 Feb 2024 16:23:33 -0700 Subject: [PATCH] fix: Adds awaitIsOpen extension functions to the PlacesClient Updates the request builder helper functions to be more idiomatic. --- .../places/android/ktx/demo/DemoActivity.kt | 2 +- .../places/ktx/api/model/AddressComponent.kt | 10 +-- .../ktx/api/model/AutocompletePrediction.kt | 10 +-- .../places/ktx/api/model/PhotoMetadata.kt | 10 +-- .../places/ktx/api/net/FetchPhotoRequest.kt | 10 +-- .../places/ktx/api/net/FetchPlaceRequest.kt | 10 +-- .../ktx/api/net/FindCurrentPlaceRequest.kt | 12 ++-- .../places/ktx/api/net/IsOpenRequest.kt | 63 +++++++++++++++++++ .../places/ktx/api/net/PlacesClient.kt | 33 ++++++++++ 9 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/IsOpenRequest.kt diff --git a/app/src/main/java/com/google/places/android/ktx/demo/DemoActivity.kt b/app/src/main/java/com/google/places/android/ktx/demo/DemoActivity.kt index f64ed3f..9849385 100644 --- a/app/src/main/java/com/google/places/android/ktx/demo/DemoActivity.kt +++ b/app/src/main/java/com/google/places/android/ktx/demo/DemoActivity.kt @@ -37,7 +37,7 @@ class DemoActivity : AppCompatActivity() { ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) - it.adapter = DemoAdapter(this, Demo.values()) + it.adapter = DemoAdapter(this, Demo.entries.toTypedArray()) it.onItemClickListener = AdapterView.OnItemClickListener { parent, _, position, _ -> val demo = parent.adapter.getItem(position) as? Demo demo?.let { diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AddressComponent.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AddressComponent.kt index efa2fc0..8ef8936 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AddressComponent.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AddressComponent.kt @@ -28,12 +28,12 @@ import com.google.android.libraries.places.api.model.AddressComponent * * @return the constructed [AddressComponent] */ -public inline fun addressComponent( +public fun addressComponent( name: String, types: List, - noinline actions: (AddressComponent.Builder.() -> Unit)? = null + actions: (AddressComponent.Builder.() -> Unit)? = null ): AddressComponent { - val builder = AddressComponent.builder(name, types) - actions?.let { builder.apply(it) } - return builder.build() + return AddressComponent.builder(name, types).also { builder -> + actions?.let { builder.apply(it) } + }.build() } diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AutocompletePrediction.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AutocompletePrediction.kt index 63f6b80..cae9245 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AutocompletePrediction.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/AutocompletePrediction.kt @@ -10,11 +10,11 @@ import com.google.android.libraries.places.api.model.AutocompletePrediction * * @return the constructed [AutocompletePrediction] */ -public inline fun autocompletePrediction( +public fun autocompletePrediction( placeId: String, - noinline actions: (AutocompletePrediction.Builder.() -> Unit)? = null + actions: (AutocompletePrediction.Builder.() -> Unit)? = null ): AutocompletePrediction { - val builder = AutocompletePrediction.builder(placeId) - actions?.let { builder.apply(it) } - return builder.build() + return AutocompletePrediction.builder(placeId).also { builder -> + actions?.let { builder.apply(it) } + }.build() } diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/PhotoMetadata.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/PhotoMetadata.kt index 88f012a..fce33ae 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/PhotoMetadata.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/model/PhotoMetadata.kt @@ -24,11 +24,11 @@ import com.google.android.libraries.places.api.model.PhotoMetadata * * @return the constructed [PhotoMetadata] */ -public inline fun photoMetadata( +public fun photoMetadata( photoReference: String, - noinline actions: (PhotoMetadata.Builder.() -> Unit)? = null + actions: (PhotoMetadata.Builder.() -> Unit)? = null ): PhotoMetadata { - val builder = PhotoMetadata.builder(photoReference) - actions?.let { builder.apply(it) } - return builder.build() + return PhotoMetadata.builder(photoReference).also { builder -> + actions?.let { builder.apply(it) } + }.build() } diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPhotoRequest.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPhotoRequest.kt index 7eae622..847f4bb 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPhotoRequest.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPhotoRequest.kt @@ -25,11 +25,11 @@ import com.google.android.libraries.places.api.net.FetchPhotoRequest * * @return the constructed [FetchPhotoRequest] */ -public inline fun fetchPhotoRequest( +public fun fetchPhotoRequest( photoMetadata: PhotoMetadata, - noinline actions: (FetchPhotoRequest.Builder.() -> Unit)? = null + actions: (FetchPhotoRequest.Builder.() -> Unit)? = null ): FetchPhotoRequest { - val request = FetchPhotoRequest.builder(photoMetadata) - actions?.let { request.apply(it) } - return request.build() + return FetchPhotoRequest.builder(photoMetadata).also { builder -> + actions?.let { builder.apply(it) } + }.build() } diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPlaceRequest.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPlaceRequest.kt index d7ef554..b7b9743 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPlaceRequest.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FetchPlaceRequest.kt @@ -26,12 +26,12 @@ import com.google.android.libraries.places.api.net.FetchPlaceRequest * * @return the constructed [FetchPlaceRequest] */ -public inline fun fetchPlaceRequest( +public fun fetchPlaceRequest( placeId: String, placeFields: List, - noinline actions: (FetchPlaceRequest.Builder.() -> Unit)? = null + actions: (FetchPlaceRequest.Builder.() -> Unit)? = null ): FetchPlaceRequest { - val request = FetchPlaceRequest.builder(placeId, placeFields) - actions?.let { request.apply(it) } - return request.build() + return FetchPlaceRequest.builder(placeId, placeFields).also { builder -> + actions?.let { builder.apply(it) } + }.build() } \ No newline at end of file diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FindCurrentPlaceRequest.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FindCurrentPlaceRequest.kt index 63b6b63..b1222ba 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FindCurrentPlaceRequest.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/FindCurrentPlaceRequest.kt @@ -25,11 +25,11 @@ import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest * * @return the constructed [FindCurrentPlaceRequest] */ -public inline fun findCurrentPlaceRequest( +public fun findCurrentPlaceRequest( placeFields: List, - noinline actions: (FindCurrentPlaceRequest.Builder.() -> Unit)? = null + actions: (FindCurrentPlaceRequest.Builder.() -> Unit)? = null ): FindCurrentPlaceRequest { - val request = FindCurrentPlaceRequest.builder(placeFields) - actions?.let { request.apply(it) } - return request.build() -} \ No newline at end of file + return FindCurrentPlaceRequest.builder(placeFields).also { builder -> + actions?.let { builder.apply(it) } + }.build() +} diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/IsOpenRequest.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/IsOpenRequest.kt new file mode 100644 index 0000000..aa3aeeb --- /dev/null +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/IsOpenRequest.kt @@ -0,0 +1,63 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.android.libraries.places.ktx.api.net + +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.api.net.IsOpenRequest + +/** + * Builds a new [IsOpenRequest]. + * + * @param placeId The [Place.id] of the place for which isOpen is to be determined. + * @param utcTimeMillis The milliseconds from 1970-01-01T00:00:00Z. + * @param actions the actions to apply to the [IsOpenRequest.Builder] + * @return the constructed [IsOpenRequest] + */ +public fun isOpenRequest( + placeId: String, + utcTimeMillis: Long? = null, + actions: (IsOpenRequest.Builder.() -> Unit)? = null, +): IsOpenRequest { + return if (utcTimeMillis == null) { + IsOpenRequest.builder(placeId) + } else { + IsOpenRequest.builder(placeId, utcTimeMillis) + }.also { request -> + actions?.let { request.apply(it) } + }.build() +} + +/** + * Builds a new [IsOpenRequest]. + * + * @param place The [Place] for which isOpen is to be determined. + * @param utcTimeMillis The milliseconds from 1970-01-01T00:00:00Z. + * @param actions the actions to apply to the [IsOpenRequest.Builder] + * @return the constructed [IsOpenRequest] + * @throws IllegalArgumentException if [Place] does not have a [Place.id] associated with it. + */ +public fun isOpenRequest( + place: Place, + utcTimeMillis: Long? = null, + actions: (IsOpenRequest.Builder.() -> Unit)? = null, +): IsOpenRequest { + return if (utcTimeMillis == null) { + IsOpenRequest.builder(place) + } else { + IsOpenRequest.builder(place, utcTimeMillis) + }.also { request -> + actions?.let { request.apply(it) } + }.build() +} \ No newline at end of file diff --git a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/PlacesClient.kt b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/PlacesClient.kt index 32fa075..d4772b4 100644 --- a/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/PlacesClient.kt +++ b/places-ktx/src/main/java/com/google/android/libraries/places/ktx/api/net/PlacesClient.kt @@ -28,6 +28,7 @@ import com.google.android.libraries.places.api.net.FindAutocompletePredictionsRe import com.google.android.libraries.places.api.net.FindAutocompletePredictionsResponse import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest import com.google.android.libraries.places.api.net.FindCurrentPlaceResponse +import com.google.android.libraries.places.api.net.IsOpenResponse import com.google.android.libraries.places.api.net.PlacesClient import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.tasks.await @@ -103,3 +104,35 @@ public suspend fun PlacesClient.awaitFindCurrentPlace( .build() return this.findCurrentPlace(request).await(cancellationTokenSource) } + +/** + * Wraps [PlacesClient.isOpen] in a suspending function with the given [Place] object. + * + * Returns whether or not a place is open. If an error occurred, an [ApiException] will be thrown. + */ +@ExperimentalCoroutinesApi +public suspend fun PlacesClient.awaitIsOpen( + place: Place, utcTimeMillis: Long? = null +): IsOpenResponse { + val cancellationTokenSource = CancellationTokenSource() + val request = isOpenRequest(place, utcTimeMillis) { + cancellationToken = cancellationTokenSource.token + } + return this.isOpen(request).await(cancellationTokenSource) +} + +/** + * Wraps [PlacesClient.isOpen] in a suspending function with the given placeId. + * + * Returns whether or not a place is open. If an error occurred, an [ApiException] will be thrown. + */ +@ExperimentalCoroutinesApi +public suspend fun PlacesClient.awaitIsOpen( + placeId: String, + utcTimeMillis: Long? = null, +): IsOpenResponse { + val cancellationTokenSource = CancellationTokenSource() + val request = + isOpenRequest(placeId, utcTimeMillis) { cancellationToken = cancellationTokenSource.token } + return this.isOpen(request).await(cancellationTokenSource) +} \ No newline at end of file