Full Code of rtchagas/pingplacepicker for AI

master 3572f07005cb cached
189 files
235.9 KB
80.7k tokens
2 symbols
1 requests
Download .txt
Showing preview only (286K chars total). Download the full file or copy to clipboard to get everything.
Repository: rtchagas/pingplacepicker
Branch: master
Commit: 3572f07005cb
Files: 189
Total size: 235.9 KB

Directory structure:
gitextract_fxfpf1cx/

├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jitpack.yml
├── library/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── rtchagas/
│       │   │           └── pingplacepicker/
│       │   │               ├── Config.kt
│       │   │               ├── PingPlacePicker.kt
│       │   │               ├── helper/
│       │   │               │   ├── PermissionsHelper.kt
│       │   │               │   └── UrlSignerHelper.kt
│       │   │               ├── inject/
│       │   │               │   ├── PingKoinComponent.kt
│       │   │               │   ├── RepositoryModule.kt
│       │   │               │   └── ViewModelModule.kt
│       │   │               ├── model/
│       │   │               │   ├── Geometry.kt
│       │   │               │   ├── Location.kt
│       │   │               │   ├── Photo.kt
│       │   │               │   ├── SearchResult.kt
│       │   │               │   └── SimplePlace.kt
│       │   │               ├── repository/
│       │   │               │   ├── PlaceRepository.kt
│       │   │               │   └── googlemaps/
│       │   │               │       ├── CustomPlace.kt
│       │   │               │       ├── GoogleMapsAPI.kt
│       │   │               │       ├── GoogleMapsRepository.kt
│       │   │               │       └── PlaceFromCoordinates.kt
│       │   │               ├── ui/
│       │   │               │   ├── UiExtensions.kt
│       │   │               │   ├── UiUtils.kt
│       │   │               │   ├── activity/
│       │   │               │   │   ├── BaseActivity.kt
│       │   │               │   │   └── PlacePickerActivity.kt
│       │   │               │   ├── adapter/
│       │   │               │   │   └── PlacePickerAdapter.kt
│       │   │               │   └── fragment/
│       │   │               │       └── PlaceConfirmDialogFragment.kt
│       │   │               └── viewmodel/
│       │   │                   ├── BaseViewModel.kt
│       │   │                   ├── PlaceConfirmDialogViewModel.kt
│       │   │                   ├── PlacePickerViewModel.kt
│       │   │                   └── Resource.kt
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── bg_button_round.xml
│       │       │   ├── ic_arrow_back_black_24dp.xml
│       │       │   ├── ic_close_black_24dp.xml
│       │       │   ├── ic_crosshairs_gps_black_24dp.xml
│       │       │   ├── ic_magnify_black_24dp.xml
│       │       │   ├── ic_magnify_toolbar_menu_24dp.xml
│       │       │   ├── ic_map_marker_black_24dp.xml
│       │       │   ├── ic_map_marker_radius_black_24dp.xml
│       │       │   ├── ic_map_marker_select_red_48dp.xml
│       │       │   ├── ic_map_marker_solid_red_32dp.xml
│       │       │   ├── ic_places_accounting.xml
│       │       │   ├── ic_places_airport.xml
│       │       │   ├── ic_places_amusement_park.xml
│       │       │   ├── ic_places_aquarium.xml
│       │       │   ├── ic_places_art_gallery.xml
│       │       │   ├── ic_places_atm.xml
│       │       │   ├── ic_places_bakery.xml
│       │       │   ├── ic_places_bank.xml
│       │       │   ├── ic_places_bar.xml
│       │       │   ├── ic_places_beauty_salon.xml
│       │       │   ├── ic_places_bicycle_store.xml
│       │       │   ├── ic_places_book_store.xml
│       │       │   ├── ic_places_bowling_alley.xml
│       │       │   ├── ic_places_bus_station.xml
│       │       │   ├── ic_places_cafe.xml
│       │       │   ├── ic_places_campground.xml
│       │       │   ├── ic_places_car_dealer.xml
│       │       │   ├── ic_places_car_rental.xml
│       │       │   ├── ic_places_car_repair.xml
│       │       │   ├── ic_places_car_wash.xml
│       │       │   ├── ic_places_casino.xml
│       │       │   ├── ic_places_cemetery.xml
│       │       │   ├── ic_places_church.xml
│       │       │   ├── ic_places_city_hall.xml
│       │       │   ├── ic_places_clothing_store.xml
│       │       │   ├── ic_places_convenience_store.xml
│       │       │   ├── ic_places_courthouse.xml
│       │       │   ├── ic_places_dentist.xml
│       │       │   ├── ic_places_department_store.xml
│       │       │   ├── ic_places_doctor.xml
│       │       │   ├── ic_places_electrician.xml
│       │       │   ├── ic_places_electronics_store.xml
│       │       │   ├── ic_places_embassy.xml
│       │       │   ├── ic_places_establishment.xml
│       │       │   ├── ic_places_finance.xml
│       │       │   ├── ic_places_fire_station.xml
│       │       │   ├── ic_places_florist.xml
│       │       │   ├── ic_places_food.xml
│       │       │   ├── ic_places_funeral_home.xml
│       │       │   ├── ic_places_furniture_store.xml
│       │       │   ├── ic_places_gas_station.xml
│       │       │   ├── ic_places_gym.xml
│       │       │   ├── ic_places_hair_care.xml
│       │       │   ├── ic_places_hardware_store.xml
│       │       │   ├── ic_places_health.xml
│       │       │   ├── ic_places_hindu_temple.xml
│       │       │   ├── ic_places_home_goods_store.xml
│       │       │   ├── ic_places_hospital.xml
│       │       │   ├── ic_places_insurance_agency.xml
│       │       │   ├── ic_places_jewelry_store.xml
│       │       │   ├── ic_places_laundry.xml
│       │       │   ├── ic_places_lawyer.xml
│       │       │   ├── ic_places_library.xml
│       │       │   ├── ic_places_liquor_store.xml
│       │       │   ├── ic_places_local_government_office.xml
│       │       │   ├── ic_places_locksmith.xml
│       │       │   ├── ic_places_lodging.xml
│       │       │   ├── ic_places_meal_takeaway.xml
│       │       │   ├── ic_places_mosque.xml
│       │       │   ├── ic_places_movie_rental.xml
│       │       │   ├── ic_places_movie_theater.xml
│       │       │   ├── ic_places_moving_company.xml
│       │       │   ├── ic_places_museum.xml
│       │       │   ├── ic_places_night_club.xml
│       │       │   ├── ic_places_painter.xml
│       │       │   ├── ic_places_park.xml
│       │       │   ├── ic_places_parking.xml
│       │       │   ├── ic_places_pet_store.xml
│       │       │   ├── ic_places_pharmacy.xml
│       │       │   ├── ic_places_physiotherapist.xml
│       │       │   ├── ic_places_place_of_worship.xml
│       │       │   ├── ic_places_plumber.xml
│       │       │   ├── ic_places_police.xml
│       │       │   ├── ic_places_post_office.xml
│       │       │   ├── ic_places_real_estate_agency.xml
│       │       │   ├── ic_places_restaurant.xml
│       │       │   ├── ic_places_roofing_contractor.xml
│       │       │   ├── ic_places_rv_park.xml
│       │       │   ├── ic_places_school.xml
│       │       │   ├── ic_places_shoe_store.xml
│       │       │   ├── ic_places_shopping_mall.xml
│       │       │   ├── ic_places_spa.xml
│       │       │   ├── ic_places_stadium.xml
│       │       │   ├── ic_places_storage.xml
│       │       │   ├── ic_places_store.xml
│       │       │   ├── ic_places_subway_station.xml
│       │       │   ├── ic_places_supermarket.xml
│       │       │   ├── ic_places_synagogue.xml
│       │       │   ├── ic_places_taxi_stand.xml
│       │       │   ├── ic_places_train_station.xml
│       │       │   ├── ic_places_transit_station.xml
│       │       │   ├── ic_places_travel_agency.xml
│       │       │   ├── ic_places_veterinary_care.xml
│       │       │   ├── ic_places_zoo.xml
│       │       │   ├── ic_refresh_black_24dp.xml
│       │       │   └── wrapper_places_powered_by_google.xml
│       │       ├── drawable-night/
│       │       │   └── wrapper_places_powered_by_google.xml
│       │       ├── layout/
│       │       │   ├── activity_place_picker.xml
│       │       │   ├── fragment_dialog_place_confirm.xml
│       │       │   ├── item_place.xml
│       │       │   └── places_autocomplete_impl_fragment_overlay.xml
│       │       ├── menu/
│       │       │   └── menu_place_picker.xml
│       │       ├── raw/
│       │       │   └── maps_night_style.json
│       │       ├── values/
│       │       │   ├── colors.xml
│       │       │   ├── config.xml
│       │       │   ├── dimens.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       ├── values-ar/
│       │       │   └── strings.xml
│       │       ├── values-ca/
│       │       │   └── strings.xml
│       │       ├── values-cs/
│       │       │   └── strings.xml
│       │       ├── values-de/
│       │       │   └── strings.xml
│       │       ├── values-es-rES/
│       │       │   └── strings.xml
│       │       ├── values-ko-rKR/
│       │       │   └── strings.xml
│       │       ├── values-pt/
│       │       │   └── strings.xml
│       │       ├── values-tr/
│       │       │   └── strings.xml
│       │       ├── values-v21/
│       │       │   └── styles.xml
│       │       ├── values-w600dp/
│       │       │   └── config.xml
│       │       └── values-zh-rTW/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── rtchagas/
│                       └── pingplacepicker/
│                           └── ExampleUnitTest.java
├── sample/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── rtchagas/
│       │   │           └── pingsample/
│       │   │               └── MainActivity.kt
│       │   └── res/
│       │       ├── drawable/
│       │       │   └── ic_launcher_background.xml
│       │       ├── drawable-v24/
│       │       │   └── ic_launcher_foreground.xml
│       │       ├── layout/
│       │       │   └── activity_main.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       ├── values/
│       │       │   ├── colors.xml
│       │       │   ├── keys.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       └── values-night/
│       │           └── colors.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── rtchagas/
│                       └── pingsample/
│                           └── ExampleUnitTest.kt
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Built application files
*.apk
*.ap_

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/
out/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# IntelliJ
*.iml
.idea/

# Keystore files
# Uncomment the following line if you do not want to check your keystore files in.
#*.jks

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild

# Google Services (e.g. APIs or Firebase)
google-services.json

# Freeline
freeline.py
freeline/
freeline_project_description.json

# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md

# Others
.DS_Store
hidden_keys.xml



================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
# PING - Because Ping Is Not Google's Place Picker 😉
[![](https://jitpack.io/v/rtchagas/pingplacepicker.svg)](https://jitpack.io/#rtchagas/pingplacepicker) [![](https://img.shields.io/badge/MinSDK-19-blue)](#)

 
If you're here looking for a place picker you have probably read this:

![Google Place Picker was deprecated](https://github.com/rtchagas/pingplacepicker/blob/master/images/google_picker_deprecated.png?raw=true)

As of the end of January 2019, Google deprecated the so useful Place Picker bundled in the Places SDK for Android.
The main reason was due the new pricing model of the [Places API](https://developers.google.com/places/android-sdk/usage-and-billing).

**PING** Place Picker is here to help you to (almost) plug-and-play replace the original Google's Place Picker.

<img src="images/screenshot_1.jpg" alt="Map expanded" width="210"/> <img src="images/screenshot_4.jpg" alt="Place selected" width="210"/> <img src="images/screenshot_2.jpg" alt="Results expanded" width="210"/> <img src="images/screenshot_6.jpg" alt="Search result" width="210"/>

## A key difference

Different than Google's Place Picker, PING by default **doesn't** search for places according to where the user is pointing the map to. Instead, it shows only the nearby places in the **current** location.

This was intentional and the reason is simple. By using the **/nearbysearch** from [Google Places Web API](https://developers.google.com/places/web-service/search#PlaceSearchRequests) we are going to be charged *a lot* for each map movement.

![NearbySearch warning](https://github.com/rtchagas/pingplacepicker/blob/master/images/nearby_search_warning.png?raw=true)

According to [Nearby Search pricing](https://developers.google.com/maps/billing/understanding-cost-of-use#nearby-search) each request to the API is going to cost 0.04 USD per each (40.00 USD per 1000).

To avoid the extra cost of **/nearbysearch**, PING relies on Place API's **findCurrentPlace()** that is going to cost 0.030 USD per each  (30.00 USD per 1000).

Moreover, we don't fire a new request when the user moves the map.

## Enabling nearby searches

If you do want to fetch places from a custom location or refresh them when the user moves the map, you must enable /nearbysearch queries in PING.

To do that, enable this flag in your project:
```xml  
 <bool name="enable_nearby_search">true</bool>
```

By doing so, PING behaviour will be slightly changed:
- All places will be fetched by /nearbysearch queries.
- You get a button to refresh the places for the current location.
- You can set the initial map position to get the places from via `pingBuilder.setLatLng(LatLng)`

## Why use PING?

PING is based entirely on Google Places and MAPs APIs. Google has the biggest places database available to us developers with most up to date and curated places information.

It is worth to notice that Google provides US$ 200 (free) per month to be used with Places API. This should be more than enough for small applications that rely on Places data.

## Download

Add Jitpack in your root build.gradle at the end of repositories:

```gradle
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
```

Step 2. Add the dependency

```gradle
    dependencies {
            // Places library
            implementation 'com.google.android.libraries.places:places:2.0.0'
            // PING Place Picker
            implementation 'com.github.rtchagas:pingplacepicker:2.0.+'
    }
```

## Setup

 1. Add Google Play Services to your project - [How to](https://developers.google.com/android/guides/setup)
 2. Sign up for API keys - [How to](https://developers.google.com/places/android-sdk/signup)
 3. Add the Android API key to your **AndroidManifest** file as in the [sample project](https://github.com/rtchagas/pingplacepicker/blob/master/sample/src/main/AndroidManifest.xml#L15).
 4. Optional but strongly recommended to enable R8 in you *[gradle.properties](https://github.com/rtchagas/pingplacepicker/blob/master/gradle.properties#L12)* file

## Hands on

Check the [sample](https://github.com/rtchagas/pingplacepicker/tree/master/sample) project for a full working example.

### - Kotlin
```kotlin
    private fun showPlacePicker() {  
        val builder = PingPlacePicker.IntentBuilder()
	builder.setAndroidApiKey("YOUR_ANDROID_API_KEY")  
        	.setMapsApiKey("YOUR_MAPS_API_KEY")
	
	// If you want to set a initial location rather then the current device location.
	// NOTE: enable_nearby_search MUST be true.
        // builder.setLatLng(LatLng(37.4219999, -122.0862462))
	
        try {
            val placeIntent = pingBuilder.build(this)
            startActivityForResult(placeIntent, REQUEST_PLACE_PICKER)
        }
        catch (ex: Exception) {  
            toast("Google Play Services is not Available")  
        }
    }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {  
	super.onActivityResult(requestCode, resultCode, data)  
	if ((requestCode == REQUEST_PLACE_PICKER) && (resultCode == Activity.RESULT_OK)) {  
	    val place: Place? = PingPlacePicker.getPlace(data!!)  
	    toast("You selected: ${place?.name}")  
	}  
    }
```

### - Java
```java
    private void showPlacePicker() {
	PingPlacePicker.IntentBuilder builder = new PingPlacePicker.IntentBuilder();
	builder.setAndroidApiKey("YOUR_ANDROID_API_KEY")
	       .setMapsApiKey("YOUR_MAPS_API_KEY");
	
	// If you want to set a initial location rather then the current device location.
	// NOTE: enable_nearby_search MUST be true.
        // builder.setLatLng(new LatLng(37.4219999, -122.0862462))
	
	try {
	    Intent placeIntent = builder.build(getActivity());  
	    startActivityForResult(placeIntent, REQUEST_PLACE_PICKER);  
	}  
	catch (Exception ex) {  
	    // Google Play services is not available... 
	}
    }
    
    @Override  
    public void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if ((requestCode == REQUEST_PLACE_PICKER) && (resultCode == RESULT_OK)) {  
            Place place = PingPlacePicker.getPlace(data);  
	    if (place != null) {  
                Toast.makeText(this, "You selected the place: " + place.getName(), Toast.LENGTH_SHORT).show();
            }  
        }
    }
```

## API Keys

PING needs two API keys in order to work.

It was decided to split the API keys to clearly distinguish what you're going to be charged for. Also, the Places Web API and the Geocoding API don't allow an Android API key to be used. To not expose an unrestricted key for all APIs, the Maps API key is now required.

| Key | Restriction | Purpose
|--|--|--|
| Android key | [Android Applications](https://developers.google.com/places/android-sdk/signup#restrict-key) | Used as the Places API key. Main purpose is to retrieve the current places and place details.
| Maps key | [APIs: Geocoding, Maps Static and Places API only](https://cloud.google.com/docs/authentication/api-keys#api_key_restrictions) | Used to fetch static maps, nearby places through Places Web API and perform reverse geocoding on the current user position. That is, discover the address that the user is current pointing to. Your key should look [like this](https://raw.githubusercontent.com/rtchagas/pingplacepicker/master/images/maps_api_key.png).

**TIP:** It is strongly recommended to **not expose** your Maps API key in your resource files. Anyone could decompile your apk and have access to that key. To avoid this, the key should be at least obfuscated.
A nice approach is to save the key in the cloud through "Firebase remote config" and fetch it at runtime.

## Configuration

As some features are charged by Google, you can alter the default **PING** Place Picker behaviour by overriding below resources:

```xml  
<!-- 0.002 USD per each (2.00 USD per 1000) -->  
<bool name="show_confirmation_photo">true</bool>  

<!-- 0.007 USD per each (7.00 USD per 1000) -->  
<bool name="show_confirmation_map">true</bool>

<!-- If true, the map will automatically center (pan) to
     the selected marker -->
<bool name="auto_center_on_marker_click">false</bool>
```

## Theming

PING is fully customizable and you just need to override some colors to make it seamlessly connected to your app.

Since release [2.0.0](https://github.com/rtchagas/pingplacepicker/releases/tag/2.0.0) PING supports dark/night mode by default.<br/>
Please make sure your app provide the correct resources to switch to night mode.

You can always refer to [Material Design documentation](https://material.io/develop/android/theming/dark) to know more about dark theme and how to implement it.

To customize PING you need to override these colors:

For day/light theme:

- `res/values/colors.xml`

```xml

    <!-- Toolbar color, places icons, text on top of primary surfaces -->
    <color name="colorPrimary">@color/material_teal500</color>
    <color name="colorPrimaryDark">@color/material_teal800</color>
    <color name="colorOnPrimary">@color/material_white</color>

    <!-- Accent color in buttons and actions -->
    <color name="colorSecondary">@color/material_deeporange500</color>
    <color name="colorSecondaryDark">@color/material_deeporange800</color>
    <color name="colorOnSecondary">@color/material_white</color>

    <!-- Main activity background -->
    <color name="colorBackground">@color/material_grey200</color>
    <color name="colorOnBackground">@color/material_black</color>

    <!-- Cards and elevated views background -->
    <color name="colorSurface">@color/material_white</color>
    <color name="colorOnSurface">@color/material_black</color>

    <!-- Text colors -->
    <color name="textColorPrimary">@color/material_on_surface_emphasis_high_type</color>
    <color name="textColorSecondary">@color/material_on_surface_emphasis_medium</color>

    <color name="colorMarker">@color/material_deeporange400</color>
    <color name="colorMarkerInnerIcon">@color/material_white</color>

```

For night/dark theme:

- `res/values-night/colors.xml`

```xml

    <color name="colorPrimary">@color/material_teal300</color>
    <!-- Let the primary dark color as the surface color to not colorfy the status bar -->
    <color name="colorPrimaryDark">@color/colorSurface</color>
    <color name="colorOnPrimary">@color/material_black</color>

    <color name="colorSecondary">@color/material_deeporange200</color>
    <color name="colorSecondaryDark">@color/material_deeporange300</color>
    <color name="colorOnSecondary">@color/material_black</color>

    <color name="colorBackground">@color/colorSurface</color>
    <color name="colorOnBackground">@color/colorOnSurface</color>

    <color name="colorSurface">#202125</color>
    <color name="colorOnSurface">@color/material_white</color>

    <color name="textColorPrimary">@color/material_on_surface_emphasis_high_type</color>
    <color name="textColorSecondary">@color/material_on_surface_emphasis_medium</color>

    <color name="colorMarker">@color/material_deeporange200</color>
    <color name="colorMarkerInnerIcon">@color/colorSurface</color>

```

In case of doubt in how to implement the new styles, please take a look at the [sample app](https://github.com/rtchagas/pingplacepicker/tree/master/sample).

## Contribute

Let's together make PING awesome!

Please feel free to contribute with improvements.

## License

    Copyright 2020 Rafael Chagas

    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.

<!--stackedit_data:
eyJoaXN0b3J5IjpbLTE2OTEwOTMwMTIsNjk1MDQ1MzY0LDE4NT
I5NDk5MDUsMjAwMTQ0MzM5OSwyODIyMTI1MjFdfQ==
-->


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.8.22'

    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:8.1.1'
        classpath 'com.google.gms:google-services:4.4.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }
    }
}

tasks.register('clean', Delete) {
    delete rootProject.buildDir
}


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Nov 15 15:01:33 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip


================================================
FILE: gradle.properties
================================================
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx2512m
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false


================================================
FILE: gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: jitpack.yml
================================================
jdk: openjdk17


================================================
FILE: library/.gitignore
================================================
/build


================================================
FILE: library/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
apply plugin: 'maven-publish'

android {

    namespace = "com.rtchagas.pingplacepicker"

    compileSdk 33

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 33
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
    }

    compileOptions {
        isCoreLibraryDesugaringEnabled()
    }

    kotlin {
        jvmToolchain(11)
    }

    kotlinOptions {
        freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
    }

    buildFeatures {
        viewBinding true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    publishing {
        singleVariant('release') {
            withSourcesJar()
        }
    }
}

dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])

    // Kotlin
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"

    // KTX
    implementation 'androidx.core:core-ktx:1.10.1'

    // Support library
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.android.material:material:1.9.0'

    // Android architecture components
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.2'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2'
    implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'

    // Google Play Services
    implementation 'com.google.android.gms:play-services-location:21.0.1'
    implementation 'com.google.android.gms:play-services-maps:18.1.0'
    implementation 'com.google.maps.android:android-maps-utils:3.4.0'
    implementation 'com.google.android.libraries.places:places:3.2.0'

    // Koin for Android
    implementation 'io.insert-koin:koin-android:3.1.5'

    // Rx
    implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.jakewharton.rxbinding3:rxbinding:3.1.0'

    // Moshi
    implementation 'com.squareup.moshi:moshi:1.15.0'
    kapt 'com.squareup.moshi:moshi-kotlin-codegen:1.15.0'

    // Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.11.0'

    // Coil
    implementation 'io.coil-kt:coil:2.4.0'

    // 3rd party
    implementation 'com.github.mcginty:material-colors:1.1.0'
    implementation 'com.karumi:dexter:6.2.3'

    testImplementation 'junit:junit:4.13.2'
}

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                groupId = 'com.github.rtchagas'
                artifactId = 'pingplacepicker'
            }
        }
    }
}


================================================
FILE: library/consumer-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

# Keep custom model classes
-keep class com.rtchagas.pingplacepicker.model.** { *; }
-dontnote com.rtchagas.pingplacepicker.model.**

# Moshi

# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**

-keepclasseswithmembers class * {
    @com.squareup.moshi.* <methods>;
}

-keep @com.squareup.moshi.JsonQualifier interface *

# Enum field names are used by the integrated EnumJsonAdapter.
# Annotate enums with @JsonClass(generateAdapter = false) to use them with Moshi.
-keepclassmembers @com.squareup.moshi.JsonClass class * extends java.lang.Enum {
    <fields>;
}

# The name of @JsonClass types is used to look up the generated adapter.
-keepnames @com.squareup.moshi.JsonClass class *

# Retain generated JsonAdapters if annotated type is retained.
-if @com.squareup.moshi.JsonClass class *
-keep class <1>JsonAdapter {
    <init>(...);
    <fields>;
}
-if @com.squareup.moshi.JsonClass class **$*
-keep class <1>_<2>JsonAdapter {
    <init>(...);
    <fields>;
}

-keep class kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoaderImpl

-keepclassmembers class kotlin.Metadata {
    public <methods>;
}

# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*

# Retrofit config
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod

# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations

# Keep annotation default values (e.g., retrofit2.http.Field.encoded).
-keepattributes AnnotationDefault

# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**

# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit

# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
-dontwarn retrofit2.KotlinExtensions$*

# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy
# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface <1>

# Keep inherited services.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface * extends <1>

# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

# R8 full mode strips generic signatures from return types if not kept.
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>

# With R8 full mode generic signatures are stripped for classes that are not kept.
-keep,allowobfuscation,allowshrinking class retrofit2.Response


================================================
FILE: library/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: library/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application>

        <activity
            android:name=".ui.activity.PlacePickerActivity"
            android:launchMode="singleTop"
            android:theme="@style/PingTheme.NoStatus" />

        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

    </application>

</manifest>


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/Config.kt
================================================
package com.rtchagas.pingplacepicker

internal object Config {

    const val PLACE_IMG_WIDTH = 640
    const val PLACE_IMG_HEIGHT = 320

    const val STATIC_MAP_URL = "https://maps.googleapis.com/maps/api/staticmap?" +
            "size=${PLACE_IMG_WIDTH}x${PLACE_IMG_HEIGHT}" +
            "&markers=color:red|%.6f,%.6f" +
            "&key=%s" +
            "&language=%s"

    const val STATIC_MAP_URL_STYLE_DARK = "&style=element:geometry%7Ccolor:0x242f3e" +
            "&style=element:labels.text.fill%7Ccolor:0x746855" +
            "&style=element:labels.text.stroke%7Ccolor:0x242f3e" +
            "&style=feature:administrative.locality%7Celement:labels.text.fill%7Ccolor:0xd59563" +
            "&style=feature:poi%7Celement:labels.text.fill%7Ccolor:0xd59563" +
            "&style=feature:poi.park%7Celement:geometry%7Ccolor:0x263c3f" +
            "&style=feature:poi.park%7Celement:labels.text.fill%7Ccolor:0x6b9a76" +
            "&style=feature:road%7Celement:geometry%7Ccolor:0x38414e" +
            "&style=feature:road%7Celement:geometry.stroke%7Ccolor:0x212a37" +
            "&style=feature:road%7Celement:labels.text.fill%7Ccolor:0x9ca5b3" +
            "&style=feature:road.highway%7Celement:geometry%7Ccolor:0x746855" +
            "&style=feature:road.highway%7Celement:geometry.stroke%7Ccolor:0x1f2835" +
            "&style=feature:road.highway%7Celement:labels.text.fill%7Ccolor:0xf3d19c" +
            "&style=feature:transit%7Celement:geometry%7Ccolor:0x2f3948" +
            "&style=feature:transit.station%7Celement:labels.text.fill%7Ccolor:0xd59563" +
            "&style=feature:water%7Celement:geometry%7Ccolor:0x17263c" +
            "&style=feature:water%7Celement:labels.text.fill%7Ccolor:0x515c6d" +
            "&style=feature:water%7Celement:labels.text.stroke%7Ccolor:0x17263c"
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/PingPlacePicker.kt
================================================
package com.rtchagas.pingplacepicker

import android.app.Activity
import android.content.Intent
import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
import com.google.android.gms.maps.model.LatLng
import com.google.android.libraries.places.api.model.Place
import com.rtchagas.pingplacepicker.inject.PingKoinContext
import com.rtchagas.pingplacepicker.ui.activity.PlacePickerActivity

object PingPlacePicker {

    internal var androidApiKey: String = ""

    internal var mapsApiKey: String = ""

    internal var urlSigningSecret = ""

    internal var isNearbySearchEnabled = false

    internal var onPlaceSelectedListener: OnPlaceSelectedListener? = null

    class Builder {

        private val intent = Intent()

        /**
         * This key will be used to all nearby requests to Google Places API.
         */
        fun setAndroidApiKey(androidKey: String): Builder {
            androidApiKey = androidKey
            return this
        }

        /**
         * This key will be used to nearby searches and reverse geocoding
         * requests to Google Maps HTTP API.
         */
        fun setMapsApiKey(geoKey: String): Builder {
            mapsApiKey = geoKey
            return this
        }

        /**
         * The initial location that the map must be pointing to.
         * If this is set, PING will search for places near this location.
         */
        fun setLatLng(location: LatLng): Builder {
            intent.putExtra(PlacePickerActivity.EXTRA_LOCATION, location)
            return this
        }

        /**
         * Sets the listener to be called when a place is selected.
         */
        fun setOnPlaceSelectedListener(listener: OnPlaceSelectedListener): Builder {
            onPlaceSelectedListener = listener
            return this
        }

        /**
         * Enables URL signing for Google APIs that require it.
         *
         * Currently only Maps Statics API requires signing for some users.
         *
         * More info [here](https://developers.google.com/maps/documentation/maps-static/get-api-key#generating-digital-signatures)
         */
        fun setUrlSigningSecret(secretKey: String): Builder {
            urlSigningSecret = secretKey
            return this
        }

        /**
         * Set whether the library should return the place coordinate retrieved from GooglePlace
         * or the actual selected location from google map
         */
        fun setShouldReturnActualLatLng(shouldReturnActualLatLng: Boolean): Builder {
            intent.putExtra(
                PlacePickerActivity.EXTRA_RETURN_ACTUAL_LATLNG,
                shouldReturnActualLatLng
            )
            return this
        }

        @Throws(GooglePlayServicesNotAvailableException::class)
        fun build(activity: Activity): Intent {

            PingKoinContext.init(activity.application)

            val result: Int =
                GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(activity)

            if (ConnectionResult.SUCCESS != result) {
                throw GooglePlayServicesNotAvailableException(result)
            }

            isNearbySearchEnabled = activity.resources.getBoolean(R.bool.enable_nearby_search)

            intent.setClass(activity, PlacePickerActivity::class.java)
            return intent
        }
    }

    /**
     * Listener to be called when PING returns a selected place.
     */
    interface OnPlaceSelectedListener {

        /**
         * Called when PING returns a place selected by the user.
         * @param place the selected place.
         * @param latLng the selected latitude/longitude in the map.
         */
        fun onPlaceSelected(place: Place, latLng: LatLng)

    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/helper/PermissionsHelper.kt
================================================
package com.rtchagas.pingplacepicker.helper

import android.Manifest
import android.app.Activity
import com.karumi.dexter.Dexter
import com.karumi.dexter.listener.single.BasePermissionListener
import com.karumi.dexter.listener.single.CompositePermissionListener
import com.karumi.dexter.listener.single.DialogOnDeniedPermissionListener
import com.rtchagas.pingplacepicker.R


internal object PermissionsHelper {

    fun checkForLocationPermission(activity: Activity, listener: BasePermissionListener?) {

        val dialogPermissionListener = DialogOnDeniedPermissionListener.Builder
            .withContext(activity)
            .withTitle(R.string.permission_fine_location_title)
            .withMessage(R.string.permission_fine_location_message)
            .withButtonText(android.R.string.ok)
            .withIcon(R.drawable.ic_map_marker_radius_black_24dp)
            .build()

        val compositeListener =
            if (listener != null) {
                CompositePermissionListener(dialogPermissionListener, listener)
            } else {
                CompositePermissionListener(dialogPermissionListener)
            }

        Dexter.withContext(activity)
            .withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            .withListener(compositeListener)
            .check()
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/helper/UrlSignerHelper.kt
================================================
package com.rtchagas.pingplacepicker.helper

import android.util.Base64
import android.util.Log

import java.net.MalformedURLException
import java.net.URI
import java.net.URL
import java.security.InvalidKeyException
import java.security.NoSuchAlgorithmException

import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec

internal object UrlSignerHelper {

    private const val TAG = "UrlSignerHelper"

    fun signUrl(inputUrl: String, inputKey: String): String {

        // Convert the string to a URL so we can parse it
        var url: URL

        try {
            url = URL(inputUrl)
        }
        catch (e: MalformedURLException) {
            Log.e(TAG, "Could not parse the input URL")
            return inputUrl
        }

        // Encode the URL
        val uri = URI(url.protocol, url.userInfo, url.host, url.port, url.path, url.query, url.ref)
        url = uri.toURL()

        // Convert the key from 'web safe' base 64 to binary
        val byteKey: ByteArray = Base64.decode(inputKey, Base64.URL_SAFE)

        return try {
            val signature = signRequest(url.path, url.query, byteKey)
            "$inputUrl&signature=$signature"
        }
        catch (ex: Exception) {
            Log.e(TAG, "Could not sign the URL. ${ex.message}")
            inputUrl
        }
    }

    @Throws(NoSuchAlgorithmException::class, InvalidKeyException::class)
    private fun signRequest(path: String, query: String, key: ByteArray): String {

        // Retrieve the proper URL components to sign
        val resource = "$path?$query"

        // Get an HMAC-SHA1 signing key from the raw key bytes
        val sha1Key = SecretKeySpec(key, "HmacSHA1")

        // Get an HMAC-SHA1 Mac instance and initialize it with the HMAC-SHA1 key
        val mac = Mac.getInstance("HmacSHA1")
        mac.init(sha1Key)

        // compute the binary signature for the request
        val sigBytes = mac.doFinal(resource.toByteArray())

        // base 64 encode the binary signature
        return Base64.encodeToString(sigBytes, Base64.URL_SAFE or Base64.NO_WRAP)
    }
}

================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/inject/PingKoinComponent.kt
================================================
package com.rtchagas.pingplacepicker.inject

import android.content.Context
import com.rtchagas.pingplacepicker.BuildConfig
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.Koin
import org.koin.core.component.KoinComponent
import org.koin.core.logger.Level
import org.koin.dsl.koinApplication

internal object PingKoinContext {

    private lateinit var appContext: Context

    val koin: Koin by lazy {
        koinApplication {
            androidLogger(if (BuildConfig.DEBUG) Level.ERROR else Level.NONE)
            androidContext(appContext)
            modules(listOf(repositoryModule, viewModelModule))
        }.koin
    }

    /**
     * Initializes the Dependency Injection framework by passing
     * the current application context.
     */
    @Synchronized
    fun init(context: Context) {
        appContext = context.applicationContext
    }
}

internal interface PingKoinComponent : KoinComponent {

    override fun getKoin(): Koin = PingKoinContext.koin

}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/inject/RepositoryModule.kt
================================================
package com.rtchagas.pingplacepicker.inject

import com.google.android.libraries.places.api.Places
import com.rtchagas.pingplacepicker.PingPlacePicker
import com.rtchagas.pingplacepicker.repository.PlaceRepository
import com.rtchagas.pingplacepicker.repository.googlemaps.GoogleMapsAPI
import com.rtchagas.pingplacepicker.repository.googlemaps.GoogleMapsRepository
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.bind
import org.koin.dsl.module
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.moshi.MoshiConverterFactory

internal val repositoryModule = module {

    // PlacesClient
    single {
        Places.initialize(androidContext(), PingPlacePicker.androidApiKey)
        return@single Places.createClient(androidContext())
    }

    // GoogleMapsAPI
    single(createdAtStart = true) {

        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.NONE

        val client = OkHttpClient.Builder().addInterceptor(interceptor).build()

        val retrofit = Retrofit.Builder()
                .baseUrl("https://maps.googleapis.com/maps/api/")
                .addConverterFactory(MoshiConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build()

        return@single retrofit.create(GoogleMapsAPI::class.java)
    }

    // GoogleMapsRepository
    single {
        GoogleMapsRepository(googleClient = get(), googleMapsAPI = get())
    } bind PlaceRepository::class
}

================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/inject/ViewModelModule.kt
================================================
package com.rtchagas.pingplacepicker.inject

import com.rtchagas.pingplacepicker.viewmodel.PlaceConfirmDialogViewModel
import com.rtchagas.pingplacepicker.viewmodel.PlacePickerViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

internal val viewModelModule = module {

    viewModel { PlacePickerViewModel(get()) }

    viewModel { PlaceConfirmDialogViewModel(get()) }

}

================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/model/Geometry.kt
================================================
package com.rtchagas.pingplacepicker.model


import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
internal data class Geometry(
    @Json(name = "location")
    val location: Location
)


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/model/Location.kt
================================================
package com.rtchagas.pingplacepicker.model


import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
internal data class Location(
    @Json(name = "lat")
    val lat: Double,
    @Json(name = "lng")
    val lng: Double
)


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/model/Photo.kt
================================================
package com.rtchagas.pingplacepicker.model


import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
internal data class Photo(
    @Json(name = "height")
    val height: Int,
    @Json(name = "html_attributions")
    val htmlAttributions: List<String>,
    @Json(name = "photo_reference")
    val photoReference: String,
    @Json(name = "width")
    val width: Int
)


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/model/SearchResult.kt
================================================
package com.rtchagas.pingplacepicker.model

import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
internal data class SearchResult(
    val results: List<SimplePlace>,
    val status: String
)


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/model/SimplePlace.kt
================================================
package com.rtchagas.pingplacepicker.model


import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
internal data class SimplePlace(
    @Json(name = "geometry")
    val geometry: Geometry,
    @Json(name = "name")
    val name: String = "",
    @Json(name = "photos")
    val photos: List<Photo> = emptyList(),
    @Json(name = "place_id")
    val placeId: String,
    @Json(name = "types")
    val types: List<String> = emptyList(),
    @Json(name = "vicinity")
    val vicinity: String = "",
    @Json(name = "formatted_address")
    val formattedAddress: String = ""
)


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/repository/PlaceRepository.kt
================================================
package com.rtchagas.pingplacepicker.repository

import android.graphics.Bitmap
import com.google.android.gms.maps.model.LatLng
import com.google.android.libraries.places.api.model.PhotoMetadata
import com.google.android.libraries.places.api.model.Place
import io.reactivex.Single

/**
 * We decided to interface the Places repository as there's a lot of
 * room to improve the place search and retrieval.
 * We could have different repositories to fetch places locally from
 * a cached database or from other providers than Google.
 */
internal interface PlaceRepository {

    fun getNearbyPlaces(): Single<List<Place>>

    fun getNearbyPlaces(location: LatLng): Single<List<Place>>

    fun getPlacePhoto(photoMetadata: PhotoMetadata): Single<Bitmap>

    fun getPlaceByLocation(location: LatLng): Single<Place>
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/CustomPlace.kt
================================================
package com.rtchagas.pingplacepicker.repository.googlemaps

import android.net.Uri
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.LatLngBounds
import com.google.android.libraries.places.api.model.*
import kotlinx.parcelize.Parcelize
import com.google.android.libraries.places.api.model.Place.BooleanPlaceAttributeValue.UNKNOWN

@Parcelize
internal class CustomPlace(
    var placeId: String,
    var placeName: String,
    var placePhotos: MutableList<PhotoMetadata>,
    var placeAddress: String,
    var placeTypes: MutableList<Type>,
    var placeLatLng: LatLng
) : Place() {

    override fun getUserRatingsTotal(): Int? {
        return null
    }

    /**
     * Default value only.
     * Clients shouldn't rely on this.
     */
    override fun getBusinessStatus(): BusinessStatus {
        return BusinessStatus.OPERATIONAL
    }

    override fun getName(): String {
        return placeName
    }

    override fun getOpeningHours(): OpeningHours? {
        return null
    }

    override fun getCurbsidePickup(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getDelivery(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getDineIn(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getReservable(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesBeer(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesBreakfast(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesBrunch(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesDinner(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesLunch(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesVegetarianFood(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesWine(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getTakeout(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getWheelchairAccessibleEntrance(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getId(): String {
        return placeId
    }

    override fun getPhotoMetadatas(): MutableList<PhotoMetadata> {
        return placePhotos
    }

    override fun getSecondaryOpeningHours(): MutableList<OpeningHours>? {
        return null
    }

    override fun getWebsiteUri(): Uri? {
        return null
    }

    override fun getPhoneNumber(): String? {
        return null
    }

    override fun getRating(): Double? {
        return null
    }

    override fun getIconBackgroundColor(): Int? {
        return null
    }

    override fun getPriceLevel(): Int? {
        return null
    }

    override fun getAddressComponents(): AddressComponents? {
        return null
    }

    override fun getCurrentOpeningHours(): OpeningHours? {
        return null
    }

    override fun getAttributions(): MutableList<String> {
        return mutableListOf()
    }

    override fun getAddress(): String {
        return placeAddress
    }

    override fun getEditorialSummary(): String? {
        return null
    }

    override fun getEditorialSummaryLanguageCode(): String? {
        return null
    }

    override fun getIconUrl(): String? {
        return null
    }

    override fun getPlusCode(): PlusCode? {
        return null
    }

    override fun getUtcOffsetMinutes(): Int? {
        return null
    }

    override fun getTypes(): MutableList<Type> {
        return placeTypes
    }

    override fun getViewport(): LatLngBounds? {
        return null
    }

    override fun describeContents(): Int {
        return 0
    }

    override fun getLatLng(): LatLng {
        return placeLatLng
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/GoogleMapsAPI.kt
================================================
package com.rtchagas.pingplacepicker.repository.googlemaps

import com.rtchagas.pingplacepicker.model.SearchResult
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.Query
import java.util.*

internal interface GoogleMapsAPI {

    @GET("place/nearbysearch/json?rankby=distance")
    fun searchNearby(
        @Query("location") location: String,
        @Query("key") apiKey: String,
        @Query("language") language: String = Locale.getDefault().language
    ): Single<SearchResult>

    @GET("geocode/json")
    fun findByLocation(
        @Query("latlng") location: String,
        @Query("key") apiKey: String,
        @Query("language") language: String = Locale.getDefault().language
    ): Single<SearchResult>
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/GoogleMapsRepository.kt
================================================
package com.rtchagas.pingplacepicker.repository.googlemaps

import android.annotation.SuppressLint
import android.graphics.Bitmap
import com.google.android.gms.maps.model.LatLng
import com.google.android.libraries.places.api.model.PhotoMetadata
import com.google.android.libraries.places.api.model.Place
import com.google.android.libraries.places.api.model.PlaceLikelihood
import com.google.android.libraries.places.api.net.FetchPhotoRequest
import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest
import com.google.android.libraries.places.api.net.PlacesClient
import com.rtchagas.pingplacepicker.Config
import com.rtchagas.pingplacepicker.PingPlacePicker
import com.rtchagas.pingplacepicker.model.SearchResult
import com.rtchagas.pingplacepicker.model.SimplePlace
import com.rtchagas.pingplacepicker.repository.PlaceRepository
import io.reactivex.Single
import java.util.*


internal class GoogleMapsRepository constructor(
    private val googleClient: PlacesClient,
    private val googleMapsAPI: GoogleMapsAPI
) : PlaceRepository {


    /**
     * Finds all nearby places ranked by likelihood of being the place where the device is.
     *
     * This call will be charged according to
     * [Places SDK for Android Usage and
       Billing](https://developers.google.com/places/android-sdk/usage-and-billing#find-current-place)
     */
    @SuppressLint("MissingPermission")
    override fun getNearbyPlaces(): Single<List<Place>> {

        // Create request
        val request = FindCurrentPlaceRequest.builder(getPlaceFields()).build()

        return Single.create { emitter ->
            googleClient.findCurrentPlace(request).addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    task.result?.let {
                        val placeList = sortByLikelihood(it.placeLikelihoods)
                        emitter.onSuccess(placeList.map { likelihood -> likelihood.place })
                    }
                    // Empty result
                    emitter.onSuccess(listOf())
                } else {
                    emitter.tryOnError(task.exception ?: Exception("No places for you..."))
                }
            }
        }
    }

    /** Finds all nearby places ranked by distance from the requested location.
     *
     * This call will be charged according to
     * [Places SDK WEB API Usage and
    Billing](https://developers.google.com/maps/billing/understanding-cost-of-use#nearby-search)
     */
    override fun getNearbyPlaces(location: LatLng): Single<List<Place>> {

        val locationParam = "${location.latitude},${location.longitude}"

        return googleMapsAPI.searchNearby(locationParam, PingPlacePicker.mapsApiKey)
            .map { searchResult ->
                val placeList = mutableListOf<CustomPlace>()
                for (simplePlace in searchResult.results) {
                    placeList.add(mapToCustomPlace(simplePlace))
                }
                placeList
            }
    }

    /**
     * Fetches a photo for the place.
     *
     * This call will be charged according to
     * [Places SDK for Android Usage and
       Billing](https://developers.google.com/places/android-sdk/usage-and-billing#places-photo)
     */
    override fun getPlacePhoto(photoMetadata: PhotoMetadata): Single<Bitmap> {

        // Create a FetchPhotoRequest.
        val photoRequest = FetchPhotoRequest.builder(photoMetadata)
            .setMaxWidth(Config.PLACE_IMG_WIDTH)
            .setMaxHeight(Config.PLACE_IMG_HEIGHT)
            .build()

        return Single.create { emitter ->
            googleClient.fetchPhoto(photoRequest).addOnSuccessListener {
                val bitmap = it.bitmap
                emitter.onSuccess(bitmap)
            }.addOnFailureListener {
                emitter.tryOnError(it)
            }
        }
    }

    /**
     * Uses Google Maps GeoLocation API to retrieve a place by its latitude and longitude.
     * This call will be charged according to
     * [Places SDK for Android Usage and
       Billing](https://developers.google.com/maps/documentation/geocoding/usage-and-billing#pricing-for-the-geocoding-api)
     */
    override fun getPlaceByLocation(location: LatLng): Single<Place> {

        val paramLocation = "${location.latitude},${location.longitude}"

        return googleMapsAPI.findByLocation(paramLocation, PingPlacePicker.mapsApiKey)
            .map { result: SearchResult ->
                if (("OK" == result.status) && result.results.isNotEmpty()) {
                    return@map mapToCustomPlace(result.results[0])
                }
                return@map PlaceFromCoordinates(location.latitude, location.longitude)
            }
    }

    /**
     * These fields are not charged by Google.
     * https://developers.google.com/places/android-sdk/usage-and-billing#basic-data
     */
    private fun getPlaceFields(): List<Place.Field> {

        return listOf(
            Place.Field.ID,
            Place.Field.NAME,
            Place.Field.ADDRESS,
            Place.Field.LAT_LNG,
            Place.Field.TYPES,
            Place.Field.PHOTO_METADATAS
        )
    }

    private fun mapToCustomPlace(place: SimplePlace): CustomPlace {

        val photoList = mutableListOf<PhotoMetadata>()
        place.photos.forEach {
            val photoMetadata = PhotoMetadata.builder(it.photoReference)
                .setAttributions(it.htmlAttributions.toString())
                .setHeight(it.height)
                .setWidth(it.width)
                .build()
            photoList.add(photoMetadata)
        }

        val typeList = mutableListOf<Place.Type>()
        place.types.forEach { simpleType ->
            val placeType = Place.Type.values()
                .find { it.name == simpleType.uppercase(Locale.US) } ?: Place.Type.OTHER
            typeList.add(placeType)
        }

        val latLng = LatLng(place.geometry.location.lat, place.geometry.location.lng)

        val address: String = place.formattedAddress.ifEmpty { place.vicinity }

        val name: String = buildPlaceName(place.name, address)

        return CustomPlace(place.placeId, name, photoList, address, typeList, latLng)
    }

    private fun buildPlaceName(originalName: String, address: String): String {
        // We have a nice name, use it
        if (originalName.isNotEmpty()) {
            return originalName
        }
        // Return the first part of the address, usually the street + number
        return address.split(",").first()
    }

    /**
     * Sorts the list by Likelihood. The best ranked places come first.
     */
    private fun sortByLikelihood(placeLikelihoods: List<PlaceLikelihood>): List<PlaceLikelihood> {

        val mutableList = placeLikelihoods.toMutableList()

        mutableList.sortByDescending { it.likelihood }

        return mutableList
    }
}

================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/PlaceFromCoordinates.kt
================================================
package com.rtchagas.pingplacepicker.repository.googlemaps

import android.location.Location
import android.net.Uri
import android.os.Parcel
import android.os.Parcelable
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.LatLngBounds
import com.google.android.libraries.places.api.model.AddressComponents
import com.google.android.libraries.places.api.model.OpeningHours
import com.google.android.libraries.places.api.model.PhotoMetadata
import com.google.android.libraries.places.api.model.Place
import com.google.android.libraries.places.api.model.Place.BooleanPlaceAttributeValue.UNKNOWN
import com.google.android.libraries.places.api.model.PlusCode
import kotlin.math.absoluteValue

/**
 * Place without any additional info. Just latitude and longitude.
 */
internal class PlaceFromCoordinates(
    private val latitude: Double,
    private val longitude: Double
) : Place() {

    constructor(parcel: Parcel) : this(
        parcel.readDouble(),
        parcel.readDouble()
    )

    override fun getUserRatingsTotal(): Int? {
        return null
    }

    /**
     * Default value only.
     * Clients shouldn't rely on this.
     */
    override fun getBusinessStatus(): BusinessStatus {
        return BusinessStatus.OPERATIONAL
    }

    override fun getName(): String {
        return "${formatLatitude(latitude)}, ${formatLongitude(longitude)}"
    }

    override fun getOpeningHours(): OpeningHours? {
        return null
    }

    override fun getCurbsidePickup(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getDelivery(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getDineIn(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getReservable(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesBeer(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesBreakfast(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesBrunch(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesDinner(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesLunch(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesVegetarianFood(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getServesWine(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getTakeout(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getWheelchairAccessibleEntrance(): BooleanPlaceAttributeValue {
        return UNKNOWN
    }

    override fun getId(): String? {
        return null
    }

    override fun getPhotoMetadatas(): MutableList<PhotoMetadata> {
        return mutableListOf()
    }

    override fun getSecondaryOpeningHours(): MutableList<OpeningHours>? {
        return null
    }

    override fun getWebsiteUri(): Uri? {
        return null
    }

    override fun getPhoneNumber(): String? {
        return null
    }

    override fun getRating(): Double? {
        return null
    }

    override fun getIconBackgroundColor(): Int? {
        return null
    }

    override fun getPriceLevel(): Int? {
        return null
    }

    override fun getAddressComponents(): AddressComponents? {
        return null
    }

    override fun getCurrentOpeningHours(): OpeningHours? {
        return null
    }

    override fun getAttributions(): MutableList<String> {
        return mutableListOf()
    }

    override fun getAddress(): String? {
        return null
    }

    override fun getEditorialSummary(): String? {
        return null
    }

    override fun getEditorialSummaryLanguageCode(): String? {
        return null
    }

    override fun getIconUrl(): String? {
        return null
    }

    override fun getPlusCode(): PlusCode? {
        return null
    }

    override fun getUtcOffsetMinutes(): Int? {
        return null
    }

    override fun getTypes(): MutableList<Type> {
        return mutableListOf()
    }

    override fun getViewport(): LatLngBounds? {
        return null
    }

    override fun getLatLng(): LatLng {
        return LatLng(latitude, longitude)
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeDouble(latitude)
        parcel.writeDouble(longitude)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<PlaceFromCoordinates> {
        override fun createFromParcel(parcel: Parcel): PlaceFromCoordinates {
            return PlaceFromCoordinates(parcel)
        }

        override fun newArray(size: Int): Array<PlaceFromCoordinates?> {
            return arrayOfNulls(size)
        }
    }

    // formatting methods -----------------------------------------------------------------

    private fun formatLatitude(latitude: Double): String {
        val direction = if (latitude > 0) "N" else "S"
        return "${
            replaceDelimiters(
                Location.convert(
                    latitude.absoluteValue,
                    Location.FORMAT_SECONDS
                )
            )
        } $direction"
    }

    private fun formatLongitude(longitude: Double): String {
        val direction = if (longitude > 0) "W" else "E"
        return "${
            replaceDelimiters(
                Location.convert(
                    longitude.absoluteValue,
                    Location.FORMAT_SECONDS
                )
            )
        } $direction"
    }

    private fun replaceDelimiters(original: String): String {

        val parts: List<String> = original.split(":")

        val degrees: String = parts[0]
        val minutes: String = parts[1]
        var seconds: String = parts[2]

        val idx = seconds.indexOfAny(charArrayOf(',', '.'))
        if (idx >= 0) {
            seconds = seconds.substring(0, idx)
        }

        return "${degrees}° ${minutes}' ${seconds}\""
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/ui/UiExtensions.kt
================================================
package com.rtchagas.pingplacepicker.ui

import android.content.Context
import android.view.View
import android.widget.Toast
import androidx.annotation.StringRes
import com.jakewharton.rxbinding3.view.clicks
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit

internal fun View.onclick(callback: () -> Unit): Disposable = clicks()
    .throttleFirst(1, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe {
        callback()
    }

/**
 * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration.
 *
 * @param message the message text.
 */
fun Context.toast(message: CharSequence): Toast = Toast
    .makeText(this, message, Toast.LENGTH_SHORT)
    .apply { show() }

/**
 * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration.
 *
 * @param resId the resource ID of the message text.
 */
fun Context.toast(@StringRes resId: Int): Toast = Toast
    .makeText(this, resId, Toast.LENGTH_SHORT)
    .apply { show() }


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/ui/UiUtils.kt
================================================
package com.rtchagas.pingplacepicker.ui

import android.annotation.SuppressLint
import android.content.Context
import android.content.res.Configuration
import android.util.TypedValue
import androidx.annotation.ColorInt
import com.google.android.libraries.places.api.model.Place
import com.rtchagas.pingplacepicker.R
import java.util.*


internal object UiUtils {

    /**
     * Gets the place drawable resource according to its type
     */
    @SuppressLint("DiscouragedApi")
    fun getPlaceDrawableRes(context: Context, place: Place): Int {

        val defType = "drawable"
        val defPackage = context.packageName

        place.types?.let {
            for (type: Place.Type in it) {
                val name = type.name.lowercase(Locale.ENGLISH)
                val id: Int =
                    context.resources.getIdentifier("ic_places_$name", defType, defPackage)
                if (id > 0) return id
            }
        }

        // Default resource
        return R.drawable.ic_map_marker_black_24dp
    }

    /**
     * Returns whether the current selected theme is night mode or not
     */
    fun isNightModeEnabled(context: Context): Boolean {

        val nightMode: Int =
            (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK)

        return nightMode == Configuration.UI_MODE_NIGHT_YES
    }

    @ColorInt
    fun getColorAttr(context: Context, colorAttr: Int): Int {
        val typedValue = TypedValue()
        context.theme.resolveAttribute(colorAttr, typedValue, true)
        return typedValue.data
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/ui/activity/BaseActivity.kt
================================================
package com.rtchagas.pingplacepicker.ui.activity

import android.os.Bundle
import android.view.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding

typealias ActivityInflater<T> = (LayoutInflater) -> T

abstract class BaseActivity<T : ViewBinding>(
    private val inflate: ActivityInflater<T>
) : AppCompatActivity() {

    private var _binding: T? = null

    /**
     * The view binding for this fragment.
     *
     * [https://developer.android.com/topic/libraries/view-binding]
     *
     * This property is only valid between [onCreate] and [onDestroy].
     */
    val binding: T get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = inflate(layoutInflater)
        setContentView(binding.root)
    }

    override fun onDestroy() {
        super.onDestroy()
        _binding = null
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/ui/activity/PlacePickerActivity.kt
================================================
package com.rtchagas.pingplacepicker.ui.activity

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.location.Location
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.doOnLayout
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.*
import com.google.android.libraries.places.api.model.Place
import com.google.android.libraries.places.api.model.RectangularBounds
import com.google.android.libraries.places.widget.Autocomplete
import com.google.android.libraries.places.widget.model.AutocompleteActivityMode
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.elevation.ElevationOverlayProvider
import com.google.android.material.snackbar.Snackbar
import com.google.maps.android.SphericalUtil
import com.karumi.dexter.listener.PermissionDeniedResponse
import com.karumi.dexter.listener.PermissionGrantedResponse
import com.karumi.dexter.listener.single.BasePermissionListener
import com.rtchagas.pingplacepicker.PingPlacePicker
import com.rtchagas.pingplacepicker.R
import com.rtchagas.pingplacepicker.databinding.ActivityPlacePickerBinding
import com.rtchagas.pingplacepicker.helper.PermissionsHelper
import com.rtchagas.pingplacepicker.inject.PingKoinComponent
import com.rtchagas.pingplacepicker.ui.UiUtils
import com.rtchagas.pingplacepicker.ui.adapter.PlacePickerAdapter
import com.rtchagas.pingplacepicker.ui.fragment.PlaceConfirmDialogFragment
import com.rtchagas.pingplacepicker.ui.onclick
import com.rtchagas.pingplacepicker.ui.toast
import com.rtchagas.pingplacepicker.viewmodel.PlacePickerViewModel
import com.rtchagas.pingplacepicker.viewmodel.Resource
import io.reactivex.disposables.CompositeDisposable
import org.koin.androidx.viewmodel.ext.android.viewModel
import kotlin.math.abs

internal class PlacePickerActivity :
    BaseActivity<ActivityPlacePickerBinding>(ActivityPlacePickerBinding::inflate),
    PingKoinComponent,
    OnMapReadyCallback,
    GoogleMap.OnMarkerClickListener,
    PlaceConfirmDialogFragment.OnPlaceConfirmedListener {

    companion object {

        private const val TAG = "Ping#PlacePicker"

        // For passing extra parameters to this activity.
        const val EXTRA_LOCATION = "extra_location"
        const val EXTRA_RETURN_ACTUAL_LATLNG = "extra_return_actual_latlng"

        // Keys for storing activity state.
        private const val STATE_CAMERA_POSITION = "state_camera_position"
        private const val STATE_LOCATION = "state_location"

        private const val AUTOCOMPLETE_REQUEST_CODE = 1001

        private const val DIALOG_CONFIRM_PLACE_TAG = "dialog_place_confirm"
    }

    private var googleMap: GoogleMap? = null

    private var isLocationPermissionGranted = false

    private var cameraPosition: CameraPosition? = null

    private val defaultLocation = LatLng(37.4219999, -122.0862462)

    private var defaultZoom = -1f

    private var lastKnownLocation: LatLng? = null

    private var placeAdapter: PlacePickerAdapter? = null

    private val viewModel: PlacePickerViewModel by viewModel()

    private val disposables = CompositeDisposable()

    private lateinit var fusedLocationProviderClient: FusedLocationProviderClient

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Configure the toolbar
        setSupportActionBar(binding.toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)

        // Check whether a pre-defined location was set.
        intent.getParcelableExtra<LatLng?>(EXTRA_LOCATION)?.let {
            lastKnownLocation = it
        }

        // Retrieve location and camera position from saved instance state.
        lastKnownLocation = savedInstanceState
            ?.getParcelable(STATE_LOCATION) ?: lastKnownLocation
        cameraPosition = savedInstanceState
            ?.getParcelable(STATE_CAMERA_POSITION) ?: cameraPosition

        // Construct a FusedLocationProviderClient
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

        // Sets the default zoom
        defaultZoom = resources.getInteger(R.integer.default_zoom).toFloat()

        // Initialize the UI
        initializeUi()

        // Restore any active fragment
        restoreFragments()

        // Initializes the map
        val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }

    @Deprecated("Deprecated in Java")
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if ((requestCode == AUTOCOMPLETE_REQUEST_CODE) && (resultCode == Activity.RESULT_OK)) {
            data?.run {
                val place = Autocomplete.getPlaceFromIntent(this)
                moveCameraToSelectedPlace(place)
                showConfirmPlacePopup(place)
            }
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_place_picker, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        if (android.R.id.home == item.itemId) {
            finishAfterTransition()
            return true
        }

        if (R.id.action_search == item.itemId) {
            requestPlacesSearch()
            return true
        }

        return super.onOptionsItemSelected(item)
    }

    /**
     * Saves the state of the map when the activity is paused.
     */
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putParcelable(STATE_CAMERA_POSITION, googleMap?.cameraPosition)
        outState.putParcelable(STATE_LOCATION, lastKnownLocation)
    }

    override fun onDestroy() {
        super.onDestroy()
        disposables.clear()
    }

    @SuppressLint("PotentialBehaviorOverride")
    override fun onMapReady(map: GoogleMap) {
        googleMap = map
        setMapStyle()
        map.setOnMarkerClickListener(this)
        checkForPermission()
    }

    override fun onMarkerClick(marker: Marker): Boolean {

        val place = marker.tag as Place
        showConfirmPlacePopup(place)

        return !resources.getBoolean(R.bool.auto_center_on_marker_click)
    }

    override fun onPlaceConfirmed(place: Place) {
        val selectedLatLng = googleMap?.cameraPosition?.target ?: LatLng(0.0, 0.0)
        PingPlacePicker.onPlaceSelectedListener?.onPlaceSelected(place, selectedLatLng)
        finishAfterTransition()
    }

    private fun adjustElevationOverlayColors() {

        // Set the correct elevation overlay to the CollapsingToolbarLayout
        val elevationOverlayProvider = ElevationOverlayProvider(this)

        val scrimColor: Int = elevationOverlayProvider.compositeOverlayIfNeeded(
            UiUtils.getColorAttr(this, R.attr.colorPrimarySurface),
            resources.getDimension(R.dimen.material_elevation_app_bar)
        )

        // Set the correct elevation to the content container
        val containerColor = elevationOverlayProvider.compositeOverlayWithThemeSurfaceColorIfNeeded(
            resources.getDimension(R.dimen.material_elevation_app_bar)
        )

        with(binding) {
            collapsingToolbarLayout.setContentScrimColor(scrimColor)
            mapContainer.setBackgroundColor(containerColor)
        }
    }

    private fun bindPlaces(places: List<Place>) {

        // Bind to the recycler view

        if (placeAdapter == null) {
            placeAdapter = PlacePickerAdapter(places) { showConfirmPlacePopup(it) }
        } else {
            placeAdapter?.swapData(places)
        }

        binding.rvNearbyPlaces.adapter = placeAdapter

        // Bind to the map

        googleMap?.run {

            clear()

            for (place in places) {
                place.latLng?.let {
                    val marker: Marker? = addMarker(
                        MarkerOptions()
                            .position(it)
                            .icon(getPlaceMarkerBitmap(place))
                    )

                    marker?.tag = place
                }
            }
        }
    }

    private fun checkForPermission() {

        PermissionsHelper.checkForLocationPermission(this, object : BasePermissionListener() {

            override fun onPermissionDenied(response: PermissionDeniedResponse?) {
                isLocationPermissionGranted = false
                initMap()
            }

            override fun onPermissionGranted(response: PermissionGrantedResponse?) {
                isLocationPermissionGranted = true
                initMap()
            }
        })
    }

    private fun getCurrentLatLngBounds(): LatLngBounds {

        val radius = resources.getInteger(R.integer.autocomplete_search_bias_radius).toDouble()
        val location: LatLng = lastKnownLocation ?: defaultLocation

        val northEast: LatLng = SphericalUtil.computeOffset(location, radius, 45.0)
        val southWest: LatLng = SphericalUtil.computeOffset(location, radius, 225.0)

        return LatLngBounds(southWest, northEast)
    }

    private fun getDeviceLocation(animate: Boolean) = try {

        // Get the best and most recent location of the device, which may be null in rare
        // cases when a location is not available.

        fusedLocationProviderClient.lastLocation
            .addOnFailureListener(this) { setDefaultLocation() }
            .addOnSuccessListener(this) { location: Location? ->

                // In rare cases location may be null...
                if (location == null) {
                    retryWhenLocationIsNotAvailable(animate)
                    return@addOnSuccessListener
                }

                // Set the map's camera position to the current location of the device.
                val latLng = LatLng(location.latitude, location.longitude)
                lastKnownLocation = latLng

                val update = CameraUpdateFactory.newLatLngZoom(latLng, defaultZoom)

                if (animate) {
                    googleMap?.animateCamera(update)
                } else {
                    googleMap?.moveCamera(update)
                }

                // Load the places near this location
                loadNearbyPlaces()
            }
    } catch (e: SecurityException) {
        Log.e(TAG, e.toString())
    }

    @Suppress("DEPRECATION")
    private fun getPlaceMarkerBitmap(place: Place): BitmapDescriptor {

        val innerIconSize: Int = resources.getDimensionPixelSize(R.dimen.marker_inner_icon_size)

        val bgDrawable = ResourcesCompat.getDrawable(
            resources,
            R.drawable.ic_map_marker_solid_red_32dp, null
        )!!

        val fgDrawable = ResourcesCompat.getDrawable(
            resources,
            UiUtils.getPlaceDrawableRes(this, place), null
        )!!
        DrawableCompat.setTint(fgDrawable, resources.getColor(R.color.colorMarkerInnerIcon))

        val bitmap = Bitmap.createBitmap(
            bgDrawable.intrinsicWidth,
            bgDrawable.intrinsicHeight, Bitmap.Config.ARGB_8888
        )

        val canvas = Canvas(bitmap)

        bgDrawable.setBounds(0, 0, canvas.width, canvas.height)

        val left = (canvas.width - innerIconSize) / 2
        val top = (canvas.height - innerIconSize) / 3
        val right = left + innerIconSize
        val bottom = top + innerIconSize

        fgDrawable.setBounds(left, top, right, bottom)

        bgDrawable.draw(canvas)
        fgDrawable.draw(canvas)

        return BitmapDescriptorFactory.fromBitmap(bitmap)
    }

    private fun handlePlaceByLocation(result: Resource<Place?>) {

        binding.pbLoading.hide()

        when (result.status) {
            Resource.Status.LOADING ->
                binding.pbLoading.show()

            Resource.Status.SUCCESS ->
                result.data?.run { showConfirmPlacePopup(this) }

            Resource.Status.ERROR ->
                toast(R.string.picker_load_this_place_error)

            Resource.Status.NO_DATA ->
                Log.d(TAG, "No places data found...")
        }
    }

    private fun handlePlacesLoaded(result: Resource<List<Place>>) {

        binding.pbLoading.hide()

        when (result.status) {
            Resource.Status.LOADING ->
                binding.pbLoading.show()

            Resource.Status.SUCCESS ->
                bindPlaces((result.data ?: listOf()))

            Resource.Status.ERROR ->
                toast(R.string.picker_load_places_error)

            Resource.Status.NO_DATA ->
                Log.d(TAG, "No places data found...")
        }
    }

    private fun initializeUi() = with(binding) {

        // Some material components still don't support setting the correct
        // elevation for dark themes, so we should handle that
        adjustElevationOverlayColors()

        // Initialize the recycler view
        rvNearbyPlaces.layoutManager = LinearLayoutManager(this@PlacePickerActivity)

        // Bind the click listeners
        disposables.addAll(
            btnMyLocation.onclick { getDeviceLocation(true) },
            btnRefreshLocation.onclick { refreshNearbyPlaces() },
            cardSearch.onclick { requestPlacesSearch() },
            mapContainer.onclick { selectThisPlace() }
        )

        // Hide or show the refresh places button according to nearby search flag
        btnRefreshLocation.isVisible = PingPlacePicker.isNearbySearchEnabled

        // Hide or show the card search according to the width
        cardSearch.isVisible = resources.getBoolean(R.bool.show_card_search)

        // Add a nice fade effect to toolbar
        appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset ->
            toolbar.alpha = abs(verticalOffset / appBarLayout.totalScrollRange.toFloat())
        }

        // Disable vertical scrolling on appBarLayout (it messes with the map...)

        // Set default behavior
        val appBarLayoutParams = appBarLayout.layoutParams as CoordinatorLayout.LayoutParams
        appBarLayoutParams.behavior = AppBarLayout.Behavior()

        // Disable the drag
        val behavior = appBarLayoutParams.behavior as AppBarLayout.Behavior
        behavior.setDragCallback(object : AppBarLayout.Behavior.DragCallback() {
            override fun canDrag(appBarLayout: AppBarLayout): Boolean {
                return false
            }
        })

        // Set the size of AppBarLayout to 68% of the total height
        coordinator.doOnLayout {
            val size: Int = (it.height * 68) / 100
            appBarLayoutParams.height = size
        }
    }

    private fun initMap() {

        // Turn on/off the My Location layer and the related control on the map
        updateLocationUI()

        // Restore any saved state
        restoreMapState()

        if (isLocationPermissionGranted) {

            if (lastKnownLocation == null) {
                // Get the current location of the device and set the position of the map
                getDeviceLocation(false)
            } else {
                // Use the last know location to point the map to
                setDefaultLocation()
                loadNearbyPlaces()
            }
        } else {
            setDefaultLocation()
        }
    }

    private fun loadNearbyPlaces() {
        viewModel.getNearbyPlaces(lastKnownLocation ?: defaultLocation)
            .observe(this) { handlePlacesLoaded(it) }
    }

    private fun moveCameraToSelectedPlace(place: Place) {
        place.latLng?.let {
            googleMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(it, defaultZoom))
        }
    }

    private fun refreshNearbyPlaces() {
        googleMap?.cameraPosition?.run {
            viewModel.getNearbyPlaces(target)
                .observe(this@PlacePickerActivity) { handlePlacesLoaded(it) }
        }
    }

    private fun requestPlacesSearch() {

        // This only works if location permission is granted
        if (!isLocationPermissionGranted) {
            checkForPermission()
            return
        }

        // Places API needs a location as well...
        if (lastKnownLocation == null) {
            return
        }

        // These fields are not charged by Google:
        // https://developers.google.com/places/android-sdk/usage-and-billing#basic-data
        val placeFields = listOf(
            Place.Field.ID,
            Place.Field.NAME,
            Place.Field.ADDRESS,
            Place.Field.LAT_LNG,
            Place.Field.TYPES,
            Place.Field.PHOTO_METADATAS
        )

        val rectangularBounds = RectangularBounds.newInstance(getCurrentLatLngBounds())

        // Start the autocomplete intent.
        val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.OVERLAY, placeFields)
            .setLocationBias(rectangularBounds)
            .build(this)

        startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE)
    }

    private fun restoreFragments() {
        val confirmFragment = supportFragmentManager
            .findFragmentByTag(DIALOG_CONFIRM_PLACE_TAG) as PlaceConfirmDialogFragment?
        confirmFragment?.run {
            confirmListener = this@PlacePickerActivity
        }
    }

    private fun restoreMapState() {
        cameraPosition?.run {
            googleMap?.moveCamera(CameraUpdateFactory.newCameraPosition(this))
        }
    }

    private fun retryWhenLocationIsNotAvailable(animate: Boolean) {
        // Location is not available. Ask the user to retry.
        setDefaultLocation()
        Snackbar
            .make(binding.root, R.string.picker_location_unavailable, Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.places_try_again) { getDeviceLocation(animate) }
            .show()
    }

    private fun selectThisPlace() {
        googleMap?.cameraPosition?.run {
            viewModel.getPlaceByLocation(target)
                .observe(this@PlacePickerActivity) { handlePlaceByLocation(it) }
        }
    }

    private fun setDefaultLocation() {
        val default: LatLng = lastKnownLocation ?: defaultLocation
        googleMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(default, defaultZoom))
    }

    /**
     * Customise the styling of the base map using a JSON object defined in a raw resource file.
     */
    private fun setMapStyle() {

        if (!UiUtils.isNightModeEnabled(this)) return

        try {
            googleMap?.run {
                val success = setMapStyle(
                    MapStyleOptions.loadRawResourceStyle(
                        this@PlacePickerActivity, R.raw.maps_night_style
                    )
                )
                if (!success) {
                    Log.e(TAG, "Style parsing failed.")
                }
            }
        } catch (e: Exception) {
            Log.e(TAG, "Can't style the map", e)
        }
    }

    private fun showConfirmPlacePopup(place: Place) {
        val fragment = PlaceConfirmDialogFragment.newInstance(place, this)
        fragment.show(supportFragmentManager, DIALOG_CONFIRM_PLACE_TAG)
    }

    @SuppressLint("MissingPermission")
    private fun updateLocationUI() {

        googleMap?.let {

            with(it.uiSettings) {
                isMyLocationButtonEnabled = false
                isMapToolbarEnabled = false
            }

            if (isLocationPermissionGranted) {
                it.isMyLocationEnabled = true
                binding.btnMyLocation.visibility = View.VISIBLE
            } else {
                binding.btnMyLocation.visibility = View.GONE
                it.isMyLocationEnabled = false
            }
        }
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/ui/adapter/PlacePickerAdapter.kt
================================================
package com.rtchagas.pingplacepicker.ui.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.google.android.libraries.places.api.model.Place
import com.rtchagas.pingplacepicker.databinding.ItemPlaceBinding
import com.rtchagas.pingplacepicker.ui.UiUtils

internal class PlacePickerAdapter(
    private var placeList: List<Place>,
    private val clickListener: (Place) -> Unit
) : RecyclerView.Adapter<PlacePickerAdapter.PlaceViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PlaceViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding = ItemPlaceBinding.inflate(inflater, parent, false)
        return PlaceViewHolder(binding)
    }

    override fun onBindViewHolder(holder: PlaceViewHolder, position: Int) {
        holder.bind(placeList[position], clickListener)
    }

    override fun getItemCount(): Int =
        placeList.size

    fun swapData(newPlaceList: List<Place>) {
        placeList = newPlaceList
        notifyDataSetChanged()
    }

    inner class PlaceViewHolder(private val binding: ItemPlaceBinding) :
        RecyclerView.ViewHolder(binding.root) {

        fun bind(place: Place, listener: (Place) -> Unit) {

            with(binding) {
                root.setOnClickListener { listener(place) }
                ivPlaceType.setImageResource(UiUtils.getPlaceDrawableRes(itemView.context, place))
                tvPlaceName.text = place.name
                tvPlaceAddress.text = place.address
            }
        }
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/ui/fragment/PlaceConfirmDialogFragment.kt
================================================
package com.rtchagas.pingplacepicker.ui.fragment

import android.app.Dialog
import android.content.Context
import android.graphics.Bitmap
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.core.view.isVisible
import androidx.transition.TransitionManager
import coil.load
import com.google.android.libraries.places.api.model.Place
import com.rtchagas.pingplacepicker.Config
import com.rtchagas.pingplacepicker.PingPlacePicker
import com.rtchagas.pingplacepicker.R
import com.rtchagas.pingplacepicker.databinding.FragmentDialogPlaceConfirmBinding
import com.rtchagas.pingplacepicker.helper.UrlSignerHelper
import com.rtchagas.pingplacepicker.inject.PingKoinComponent
import com.rtchagas.pingplacepicker.ui.UiUtils
import com.rtchagas.pingplacepicker.viewmodel.PlaceConfirmDialogViewModel
import com.rtchagas.pingplacepicker.viewmodel.Resource
import org.koin.androidx.viewmodel.ext.android.viewModel
import java.util.*


internal class PlaceConfirmDialogFragment : AppCompatDialogFragment(), PingKoinComponent {

    private var _binding: FragmentDialogPlaceConfirmBinding? = null

    private val binding: FragmentDialogPlaceConfirmBinding
        get() = _binding!!

    private val viewModel: PlaceConfirmDialogViewModel by viewModel()

    private lateinit var place: Place

    var confirmListener: OnPlaceConfirmedListener? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Check mandatory parameters for this fragment
        if (requireArguments().getParcelable<Place>(ARG_PLACE) == null) {
            throw IllegalArgumentException("You must pass a Place as argument to this fragment")
        }

        arguments?.run {
            place = getParcelable(ARG_PLACE)!!
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

        val builder = AlertDialog.Builder(requireActivity())

        builder.setTitle(R.string.picker_place_confirm)
            .setView(getContentView(requireContext()))
            .setPositiveButton(android.R.string.ok) { _, _ ->
                confirmListener?.onPlaceConfirmed(place)
                dismiss()
            }
            .setNegativeButton(R.string.picker_place_confirm_cancel) { _, _ ->
                // Just dismiss here...
                dismiss()
            }

        return builder.create()
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    private fun getContentView(context: Context): View {
        _binding = FragmentDialogPlaceConfirmBinding.inflate(LayoutInflater.from(context))
        initializeUi()
        return binding.root
    }

    private fun initializeUi() = with(binding) {

        if (place.name.isNullOrEmpty()) {
            tvPlaceName.isVisible = false
        } else {
            tvPlaceName.text = place.name
        }

        tvPlaceAddress.text = place.address

        fetchPlaceMap()
        fetchPlacePhoto()
    }

    private fun fetchPlaceMap() = with(binding.ivPlaceMap) {

        isVisible =
            if (resources.getBoolean(R.bool.show_confirmation_map)) true
            else return@with

        val staticMapUrl = getFinalMapUrl()

        binding.ivPlaceMap.load(staticMapUrl) {
            listener(
                onError = { request, error ->
                    isVisible = false
                    Log.w(TAG, "Error loading map image: ${request.data}", error.throwable)
                }
            )
        }
    }

    private fun fetchPlacePhoto() {

        val photoMetadata = place.photoMetadatas?.firstOrNull()

        if (resources.getBoolean(R.bool.show_confirmation_photo)
            && (photoMetadata != null)
        ) {
            viewModel.getPlacePhoto(photoMetadata)
                .observe(this) { handlePlacePhotoLoaded(it) }
        } else {
            handlePlacePhotoLoaded(Resource.noData())
        }
    }

    private fun getFinalMapUrl(): String {

        var mapUrl = Config.STATIC_MAP_URL
            .format(
                place.latLng?.latitude,
                place.latLng?.longitude,
                PingPlacePicker.mapsApiKey,
                Locale.getDefault().language
            )

        if (UiUtils.isNightModeEnabled(requireContext())) {
            mapUrl += Config.STATIC_MAP_URL_STYLE_DARK
        }

        if (PingPlacePicker.urlSigningSecret.isNotEmpty()) {
            // Sign the URL
            return UrlSignerHelper.signUrl(mapUrl, PingPlacePicker.urlSigningSecret)
        }

        return mapUrl
    }

    private fun handlePlacePhotoLoaded(result: Resource<Bitmap>) = with(binding.ivPlacePhoto) {
        if (result.status == Resource.Status.SUCCESS) {
            TransitionManager.beginDelayedTransition(binding.root)
            visibility = View.VISIBLE
            setImageBitmap(result.data)
        } else {
            visibility = View.GONE
        }
    }

    /**
     * Listener called when a place is updated.
     */
    interface OnPlaceConfirmedListener {
        fun onPlaceConfirmed(place: Place)
    }

    companion object {

        private const val TAG = "Ping#PlaceConfirmDialog"
        private const val ARG_PLACE = "arg_place"

        fun newInstance(
            place: Place,
            listener: OnPlaceConfirmedListener
        ): PlaceConfirmDialogFragment {

            val args = Bundle()
            args.putParcelable(ARG_PLACE, place)

            return PlaceConfirmDialogFragment().apply {
                arguments = args
                confirmListener = listener
            }
        }
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/BaseViewModel.kt
================================================
package com.rtchagas.pingplacepicker.viewmodel

import androidx.lifecycle.ViewModel
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable

/**
 * ViewModel that automatically disposes
 * registered [org.reactivestreams.Publisher]s
 */
internal abstract class BaseViewModel : ViewModel() {

    private val compositeDisposable = CompositeDisposable()

    override fun onCleared() {
        super.onCleared()
        clearDisposables()
    }

    fun addDisposable(disposable: Disposable) {
        compositeDisposable.add(disposable)
    }

    private fun clearDisposables() {
        compositeDisposable.clear()
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/PlaceConfirmDialogViewModel.kt
================================================
package com.rtchagas.pingplacepicker.viewmodel

import android.graphics.Bitmap
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.google.android.libraries.places.api.model.PhotoMetadata
import com.rtchagas.pingplacepicker.repository.PlaceRepository
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers

internal class PlaceConfirmDialogViewModel(
    private val repository: PlaceRepository
) : BaseViewModel() {

    private val placePhotoLiveData: MutableLiveData<Resource<Bitmap>> = MutableLiveData()

    fun getPlacePhoto(photoMetadata: PhotoMetadata): LiveData<Resource<Bitmap>> {

        // If we already loaded the places for this location, return the same live data
        // instead of fetching (and charging) again.
        placePhotoLiveData.value?.run {
            return placePhotoLiveData
        }

        val disposable: Disposable = repository.getPlacePhoto(photoMetadata)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { placePhotoLiveData.value = Resource.loading() }
            .subscribe(
                { result: Bitmap -> placePhotoLiveData.value = Resource.success(result) },
                { error: Throwable -> placePhotoLiveData.value = Resource.error(error) }
            )

        // Keep track of this disposable during the ViewModel lifecycle
        addDisposable(disposable)

        return placePhotoLiveData
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/PlacePickerViewModel.kt
================================================
package com.rtchagas.pingplacepicker.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.google.android.gms.maps.model.LatLng
import com.google.android.libraries.places.api.model.Place
import com.rtchagas.pingplacepicker.PingPlacePicker
import com.rtchagas.pingplacepicker.repository.PlaceRepository
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers

internal class PlacePickerViewModel(private val repository: PlaceRepository) : BaseViewModel() {

    // Keep the place list in this view model state
    private val placeList: MutableLiveData<Resource<List<Place>>> = MutableLiveData()

    private var lastLocation: LatLng = LatLng(0.0, 0.0)

    fun getNearbyPlaces(location: LatLng): LiveData<Resource<List<Place>>> {

        // If we already loaded the places for this location, return the same live data
        // instead of fetching (and charging) again.
        placeList.value?.run {
            if (lastLocation == location) return placeList
        }

        // Update the last fetched location
        lastLocation = location

        val placeQuery =
            if (PingPlacePicker.isNearbySearchEnabled)
                repository.getNearbyPlaces(location)
            else
                repository.getNearbyPlaces()

        val disposable: Disposable = placeQuery
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { placeList.value = Resource.loading() }
            .subscribe(
                { result: List<Place> -> placeList.value = Resource.success(result) },
                { error: Throwable -> placeList.value = Resource.error(error) }
            )

        // Keep track of this disposable during the ViewModel lifecycle
        addDisposable(disposable)

        return placeList
    }

    fun getPlaceByLocation(location: LatLng): LiveData<Resource<Place?>> {

        val liveData = MutableLiveData<Resource<Place?>>()

        val disposable: Disposable = repository.getPlaceByLocation(location)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { liveData.value = Resource.loading() }
            .subscribe(
                { result: Place? -> liveData.value = Resource.success(result) },
                { error: Throwable -> liveData.value = Resource.error(error) }
            )

        // Keep track of this disposable during the ViewModel lifecycle
        addDisposable(disposable)

        return liveData
    }
}


================================================
FILE: library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/Resource.kt
================================================
package com.rtchagas.pingplacepicker.viewmodel

/**
 * Resource holder provided to the UI
 */
internal class Resource<T> private constructor(
    val status: Status,
    val data: T?,
    val error: Throwable?
) {

    /**
     * Possible status types of a response provided to the UI
     */
    enum class Status {
        LOADING,
        SUCCESS,
        ERROR,
        NO_DATA
    }

    companion object {

        fun <T> loading(): Resource<T> {
            return Resource(Status.LOADING, null, null)
        }

        fun <T> success(data: T): Resource<T> {
            return Resource(Status.SUCCESS, data, null)
        }

        fun <T> error(error: Throwable?): Resource<T> {
            return Resource(Status.ERROR, null, error)
        }

        fun <T> noData(): Resource<T> {
            return Resource(Status.NO_DATA, null, null)
        }
    }
}


================================================
FILE: library/src/main/res/drawable/bg_button_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false">
        <shape android:shape="oval">
            <solid android:color="@color/material_white" />
            <size android:width="32dp" android:height="32dp" />
        </shape>
    </item>

    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="@color/material_grey200" />
            <size android:width="32dp" android:height="32dp" />
        </shape>
    </item>

</selector>

================================================
FILE: library/src/main/res/drawable/ic_arrow_back_black_24dp.xml
================================================
<vector android:autoMirrored="true" android:height="24dp"
    android:viewportHeight="24.0" android:viewportWidth="24.0"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>


================================================
FILE: library/src/main/res/drawable/ic_close_black_24dp.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>


================================================
FILE: library/src/main/res/drawable/ic_crosshairs_gps_black_24dp.xml
================================================
<!-- drawable/crosshairs_gps.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,8A4,4 0 0,1 16,12A4,4 0 0,1 12,16A4,4 0 0,1 8,12A4,4 0 0,1 12,8M3.05,13H1V11H3.05C3.5,6.83 6.83,3.5 11,3.05V1H13V3.05C17.17,3.5 20.5,6.83 20.95,11H23V13H20.95C20.5,17.17 17.17,20.5 13,20.95V23H11V20.95C6.83,20.5 3.5,17.17 3.05,13M12,5A7,7 0 0,0 5,12A7,7 0 0,0 12,19A7,7 0 0,0 19,12A7,7 0 0,0 12,5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_magnify_black_24dp.xml
================================================
<!-- drawable/ic_magnify_black_24dpify_black_24dp.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_magnify_toolbar_menu_24dp.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="?attr/colorOnPrimarySurface"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
</vector>


================================================
FILE: library/src/main/res/drawable/ic_map_marker_black_24dp.xml
================================================
<!-- drawable/ic_map_marker_black_24dp.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,11.5A2.5,2.5 0 0,1 9.5,9A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 14.5,9A2.5,2.5 0 0,1 12,11.5M12,2A7,7 0 0,0 5,9C5,14.25 12,22 12,22C12,22 19,14.25 19,9A7,7 0 0,0 12,2Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_map_marker_radius_black_24dp.xml
================================================
<!-- drawable/map_marker_radius.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,2C15.31,2 18,4.66 18,7.95C18,12.41 12,19 12,19C12,19 6,12.41 6,7.95C6,4.66 8.69,2 12,2M12,6A2,2 0 0,0 10,8A2,2 0 0,0 12,10A2,2 0 0,0 14,8A2,2 0 0,0 12,6M20,19C20,21.21 16.42,23 12,23C7.58,23 4,21.21 4,19C4,17.71 5.22,16.56 7.11,15.83L7.75,16.74C6.67,17.19 6,17.81 6,18.5C6,19.88 8.69,21 12,21C15.31,21 18,19.88 18,18.5C18,17.81 17.33,17.19 16.25,16.74L16.89,15.83C18.78,16.56 20,17.71 20,19Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_map_marker_select_red_48dp.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="48dp"
    android:height="48dp"
    android:viewportWidth="48"
    android:viewportHeight="48">
    <path
        android:fillColor="#EF5350"
        android:pathData="M38.2558,14.5577C38.2558,7.0849 31.944,1.026 24.1527,1.0019V1C24.1454,1 24.1372,1.0009 24.1289,1.0009C24.1217,1.0009 24.1135,1 24.1062,1V1.0019C16.3143,1.026 10.0031,7.0849 10.0031,14.5577C10.0031,14.5577 9.8545,17.9323 11.6149,21.4284C12.9266,24.0362 14.5912,25.7794 16.3003,28.1506C18.9353,31.8058 20.187,33.7253 21.5007,37.2636C22.4339,39.7745 23.3293,42.7376 24.1285,47C24.9286,42.7376 25.8245,39.7745 26.7577,37.2636C28.0728,33.7248 29.3245,31.8054 31.9581,28.1506C33.6672,25.7798 35.3308,24.0362 36.644,21.4284C38.4039,17.9323 38.2558,14.5577 38.2558,14.5577ZM24.1193,19.463C21.2291,19.463 18.8874,17.2184 18.8874,14.4482C18.8874,11.6794 21.2287,9.4358 24.1193,9.4358C27.0104,9.4358 29.3516,11.6794 29.3516,14.4482C29.3516,17.2179 27.0104,19.463 24.1193,19.463Z"
        android:strokeWidth="1.0"
        android:strokeColor="#ffffff" />
    <path
        android:fillColor="#952F2D"
        android:pathData="M18,14.4166a6,5.75 0,1 0,12 0a6,5.75 0,1 0,-12 0z" />
</vector>


================================================
FILE: library/src/main/res/drawable/ic_map_marker_solid_red_32dp.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="32dp"
        android:height="32dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="@color/colorMarker"
        android:pathData="M4.2506,8.3303L4.2506,8.3301C4.2056,4.8003 6.8468,1.25 11.9962,1.25C16.7586,1.25 19.75,4.8071 19.75,8.3333C19.75,10.8396 18.3163,12.6056 16.5556,14.7143C16.5291,14.746 16.5025,14.7778 16.4759,14.8097C14.8739,16.7278 13.0514,18.9099 11.995,22.1298C10.9439,18.9191 9.1422,16.764 7.5519,14.8618C7.5228,14.827 7.4938,14.7923 7.4648,14.7577C5.7162,12.6654 4.2818,10.8973 4.2506,8.3303Z"
        android:strokeColor="@color/colorSurface"
        android:strokeWidth="1.0"/>
</vector>


================================================
FILE: library/src/main/res/drawable/ic_places_accounting.xml
================================================
<!-- drawable/cash_multiple.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,6H23V18H5V6M14,9A3,3 0 0,1 17,12A3,3 0 0,1 14,15A3,3 0 0,1 11,12A3,3 0 0,1 14,9M9,8A2,2 0 0,1 7,10V14A2,2 0 0,1 9,16H19A2,2 0 0,1 21,14V10A2,2 0 0,1 19,8H9M1,10H3V20H19V22H1V10Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_airport.xml
================================================
<!-- drawable/airplane.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M21,16V14L13,9V3.5A1.5,1.5 0 0,0 11.5,2A1.5,1.5 0 0,0 10,3.5V9L2,14V16L10,13.5V19L8,20.5V22L11.5,21L15,22V20.5L13,19V13.5L21,16Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_amusement_park.xml
================================================
<!-- drawable/human_handsup.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,1C5,3.7 6.56,6.16 9,7.32V22H11V15H13V22H15V7.31C17.44,6.16 19,3.7 19,1H17A5,5 0 0,1 12,6A5,5 0 0,1 7,1M12,1C10.89,1 10,1.89 10,3C10,4.11 10.89,5 12,5C13.11,5 14,4.11 14,3C14,1.89 13.11,1 12,1Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_aquarium.xml
================================================
<!-- drawable/fish.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,20L12.76,17C9.5,16.79 6.59,15.4 5.75,13.58C5.66,14.06 5.53,14.5 5.33,14.83C4.67,16 3.33,16 2,16C3.1,16 3.5,14.43 3.5,12.5C3.5,10.57 3.1,9 2,9C3.33,9 4.67,9 5.33,10.17C5.53,10.5 5.66,10.94 5.75,11.42C6.4,10 8.32,8.85 10.66,8.32L9,5C11,5 13,5 14.33,5.67C15.46,6.23 16.11,7.27 16.69,8.38C19.61,9.08 22,10.66 22,12.5C22,14.38 19.5,16 16.5,16.66C15.67,17.76 14.86,18.78 14.17,19.33C13.33,20 12.67,20 12,20M17,11A1,1 0 0,0 16,12A1,1 0 0,0 17,13A1,1 0 0,0 18,12A1,1 0 0,0 17,11Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_art_gallery.xml
================================================
<!-- drawable/drama_masks.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M8.11,19.45C5.94,18.65 4.22,16.78 3.71,14.35L2.05,6.54C1.81,5.46 2.5,4.4 3.58,4.17L13.35,2.1L13.38,2.09C14.45,1.88 15.5,2.57 15.72,3.63L16.07,5.3L20.42,6.23H20.45C21.5,6.47 22.18,7.53 21.96,8.59L20.3,16.41C19.5,20.18 15.78,22.6 12,21.79C10.42,21.46 9.08,20.61 8.11,19.45V19.45M20,8.18L10.23,6.1L8.57,13.92V13.95C8,16.63 9.73,19.27 12.42,19.84C15.11,20.41 17.77,18.69 18.34,16L20,8.18M16,16.5C15.37,17.57 14.11,18.16 12.83,17.89C11.56,17.62 10.65,16.57 10.5,15.34L16,16.5M8.47,5.17L4,6.13L5.66,13.94L5.67,13.97C5.82,14.68 6.12,15.32 6.53,15.87C6.43,15.1 6.45,14.3 6.62,13.5L7.05,11.5C6.6,11.42 6.21,11.17 6,10.81C6.06,10.2 6.56,9.66 7.25,9.5C7.33,9.5 7.4,9.5 7.5,9.5L8.28,5.69C8.32,5.5 8.38,5.33 8.47,5.17M15.03,12.23C15.35,11.7 16.03,11.42 16.72,11.57C17.41,11.71 17.91,12.24 18,12.86C17.67,13.38 17,13.66 16.3,13.5C15.61,13.37 15.11,12.84 15.03,12.23M10.15,11.19C10.47,10.66 11.14,10.38 11.83,10.53C12.5,10.67 13.03,11.21 13.11,11.82C12.78,12.34 12.11,12.63 11.42,12.5C10.73,12.33 10.23,11.8 10.15,11.19M11.97,4.43L13.93,4.85L13.77,4.05L11.97,4.43Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_atm.xml
================================================
<!-- drawable/cash_usd.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M20,18H4V6H20M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M11,17H13V16H14A1,1 0 0,0 15,15V12A1,1 0 0,0 14,11H11V10H15V8H13V7H11V8H10A1,1 0 0,0 9,9V12A1,1 0 0,0 10,13H13V14H9V16H11V17Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_bakery.xml
================================================
<!-- drawable/cupcake.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,1.5A2.5,2.5 0 0,1 14.5,4A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 9.5,4A2.5,2.5 0 0,1 12,1.5M15.87,5C18,5 20,7 20,9C22.7,9 22.7,13 20,13H4C1.3,13 1.3,9 4,9C4,7 6,5 8.13,5C8.57,6.73 10.14,8 12,8C13.86,8 15.43,6.73 15.87,5M5,15H8L9,22H7L5,15M10,15H14L13,22H11L10,15M16,15H19L17,22H15L16,15Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_bank.xml
================================================
<!-- drawable/bank.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11.5,1L2,6V8H21V6M16,10V17H19V10M2,22H21V19H2M10,10V17H13V10M4,10V17H7V10H4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_bar.xml
================================================
<!-- drawable/glass_cocktail.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M7.5,7L5.5,5H18.5L16.5,7M11,13V19H6V21H18V19H13V13L21,5V3H3V5L11,13Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_beauty_salon.xml
================================================
<!-- drawable/content_cut.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M19,3L13,9L15,11L22,4V3M12,12.5A0.5,0.5 0 0,1 11.5,12A0.5,0.5 0 0,1 12,11.5A0.5,0.5 0 0,1 12.5,12A0.5,0.5 0 0,1 12,12.5M6,20A2,2 0 0,1 4,18C4,16.89 4.9,16 6,16A2,2 0 0,1 8,18C8,19.11 7.1,20 6,20M6,8A2,2 0 0,1 4,6C4,4.89 4.9,4 6,4A2,2 0 0,1 8,6C8,7.11 7.1,8 6,8M9.64,7.64C9.87,7.14 10,6.59 10,6A4,4 0 0,0 6,2A4,4 0 0,0 2,6A4,4 0 0,0 6,10C6.59,10 7.14,9.87 7.64,9.64L10,12L7.64,14.36C7.14,14.13 6.59,14 6,14A4,4 0 0,0 2,18A4,4 0 0,0 6,22A4,4 0 0,0 10,18C10,17.41 9.87,16.86 9.64,16.36L12,14L19,21H22V20L9.64,7.64Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_bicycle_store.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,20.5A3.5,3.5 0 0,1 1.5,17A3.5,3.5 0 0,1 5,13.5A3.5,3.5 0 0,1 8.5,17A3.5,3.5 0 0,1 5,20.5M5,12A5,5 0 0,0 0,17A5,5 0 0,0 5,22A5,5 0 0,0 10,17A5,5 0 0,0 5,12M14.8,10H19V8.2H15.8L13.86,4.93C13.57,4.43 13,4.1 12.4,4.1C11.93,4.1 11.5,4.29 11.2,4.6L7.5,8.29C7.19,8.6 7,9 7,9.5C7,10.13 7.33,10.66 7.85,10.97L11.2,13V18H13V11.5L10.75,9.85L13.07,7.5M19,20.5A3.5,3.5 0 0,1 15.5,17A3.5,3.5 0 0,1 19,13.5A3.5,3.5 0 0,1 22.5,17A3.5,3.5 0 0,1 19,20.5M19,12A5,5 0 0,0 14,17A5,5 0 0,0 19,22A5,5 0 0,0 24,17A5,5 0 0,0 19,12M16,4.8C17,4.8 17.8,4 17.8,3C17.8,2 17,1.2 16,1.2C15,1.2 14.2,2 14.2,3C14.2,4 15,4.8 16,4.8Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_book_store.xml
================================================
<!-- drawable/book_open_page_variant.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M19,2L14,6.5V17.5L19,13V2M6.5,5C4.55,5 2.45,5.4 1,6.5V21.16C1,21.41 1.25,21.66 1.5,21.66C1.6,21.66 1.65,21.59 1.75,21.59C3.1,20.94 5.05,20.5 6.5,20.5C8.45,20.5 10.55,20.9 12,22C13.35,21.15 15.8,20.5 17.5,20.5C19.15,20.5 20.85,20.81 22.25,21.56C22.35,21.61 22.4,21.59 22.5,21.59C22.75,21.59 23,21.34 23,21.09V6.5C22.4,6.05 21.75,5.75 21,5.5V7.5L21,13V19C19.9,18.65 18.7,18.5 17.5,18.5C15.8,18.5 13.35,19.15 12,20V13L12,8.5V6.5C10.55,5.4 8.45,5 6.5,5V5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_bowling_alley.xml
================================================
<!-- drawable/bowling.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12.5,11A1.5,1.5 0 0,0 11,12.5A1.5,1.5 0 0,0 12.5,14A1.5,1.5 0 0,0 14,12.5A1.5,1.5 0 0,0 12.5,11M12,5A2,2 0 0,0 10,7A2,2 0 0,0 12,9A2,2 0 0,0 14,7A2,2 0 0,0 12,5M5.93,8.5C5.38,9.45 5.71,10.67 6.66,11.22C7.62,11.78 8.84,11.45 9.4,10.5C9.95,9.53 9.62,8.31 8.66,7.76C7.71,7.21 6.5,7.53 5.93,8.5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_bus_station.xml
================================================
<!-- drawable/bus.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,11H6V6H18M16.5,17A1.5,1.5 0 0,1 15,15.5A1.5,1.5 0 0,1 16.5,14A1.5,1.5 0 0,1 18,15.5A1.5,1.5 0 0,1 16.5,17M7.5,17A1.5,1.5 0 0,1 6,15.5A1.5,1.5 0 0,1 7.5,14A1.5,1.5 0 0,1 9,15.5A1.5,1.5 0 0,1 7.5,17M4,16C4,16.88 4.39,17.67 5,18.22V20A1,1 0 0,0 6,21H7A1,1 0 0,0 8,20V19H16V20A1,1 0 0,0 17,21H18A1,1 0 0,0 19,20V18.22C19.61,17.67 20,16.88 20,16V6C20,2.5 16.42,2 12,2C7.58,2 4,2.5 4,6V16Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_cafe.xml
================================================
<!-- drawable/coffee.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M2,21H20V19H2M20,8H18V5H20M20,3H4V13A4,4 0 0,0 8,17H14A4,4 0 0,0 18,13V10H20A2,2 0 0,0 22,8V5C22,3.89 21.1,3 20,3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_campground.xml
================================================
<!-- drawable/basecamp.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M2,16.25C2,16.25 4,3.75 12,3.75C20,3.75 22,16.25 22,16.25C22,16.25 20,20.25 12,20.25C4,20.25 2,16.25 2,16.25M3.35,15.65C3.35,15.65 4.3,19 12,19C17,19 20,17.8 20.65,15.85C21.3,13.9 15.65,7.6 14.65,7.6C13.65,7.6 11.2,12 10.45,12C8.45,12 8.9,10 7.15,10C5.4,10 3.35,15.65 3.35,15.65Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_car_dealer.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,11L6.5,6.5H17.5L19,11M17.5,16A1.5,1.5 0 0,1 16,14.5A1.5,1.5 0 0,1 17.5,13A1.5,1.5 0 0,1 19,14.5A1.5,1.5 0 0,1 17.5,16M6.5,16A1.5,1.5 0 0,1 5,14.5A1.5,1.5 0 0,1 6.5,13A1.5,1.5 0 0,1 8,14.5A1.5,1.5 0 0,1 6.5,16M18.92,6C18.72,5.42 18.16,5 17.5,5H6.5C5.84,5 5.28,5.42 5.08,6L3,12V20A1,1 0 0,0 4,21H5A1,1 0 0,0 6,20V19H18V20A1,1 0 0,0 19,21H20A1,1 0 0,0 21,20V12L18.92,6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_car_rental.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,11L6.5,6.5H17.5L19,11M17.5,16A1.5,1.5 0 0,1 16,14.5A1.5,1.5 0 0,1 17.5,13A1.5,1.5 0 0,1 19,14.5A1.5,1.5 0 0,1 17.5,16M6.5,16A1.5,1.5 0 0,1 5,14.5A1.5,1.5 0 0,1 6.5,13A1.5,1.5 0 0,1 8,14.5A1.5,1.5 0 0,1 6.5,16M18.92,6C18.72,5.42 18.16,5 17.5,5H6.5C5.84,5 5.28,5.42 5.08,6L3,12V20A1,1 0 0,0 4,21H5A1,1 0 0,0 6,20V19H18V20A1,1 0 0,0 19,21H20A1,1 0 0,0 21,20V12L18.92,6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_car_repair.xml
================================================
<!-- drawable/wrench.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M22.7,19L13.6,9.9C14.5,7.6 14,4.9 12.1,3C10.1,1 7.1,0.6 4.7,1.7L9,6L6,9L1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1C4.8,14 7.5,14.5 9.8,13.6L18.9,22.7C19.3,23.1 19.9,23.1 20.3,22.7L22.6,20.4C23.1,20 23.1,19.3 22.7,19Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_car_wash.xml
================================================
<!-- drawable/car_wash.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,13L6.5,8.5H17.5L19,13M17.5,18A1.5,1.5 0 0,1 16,16.5A1.5,1.5 0 0,1 17.5,15A1.5,1.5 0 0,1 19,16.5A1.5,1.5 0 0,1 17.5,18M6.5,18A1.5,1.5 0 0,1 5,16.5A1.5,1.5 0 0,1 6.5,15A1.5,1.5 0 0,1 8,16.5A1.5,1.5 0 0,1 6.5,18M18.92,8C18.72,7.42 18.16,7 17.5,7H6.5C5.84,7 5.28,7.42 5.08,8L3,14V22A1,1 0 0,0 4,23H5A1,1 0 0,0 6,22V21H18V22A1,1 0 0,0 19,23H20A1,1 0 0,0 21,22V14M7,5A1.5,1.5 0 0,0 8.5,3.5C8.5,2.5 7,0.8 7,0.8C7,0.8 5.5,2.5 5.5,3.5A1.5,1.5 0 0,0 7,5M12,5A1.5,1.5 0 0,0 13.5,3.5C13.5,2.5 12,0.8 12,0.8C12,0.8 10.5,2.5 10.5,3.5A1.5,1.5 0 0,0 12,5M17,5A1.5,1.5 0 0,0 18.5,3.5C18.5,2.5 17,0.8 17,0.8C17,0.8 15.5,2.5 15.5,3.5A1.5,1.5 0 0,0 17,5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_casino.xml
================================================
<!-- drawable/cards_playing_outline.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11.19,2.25C11.97,2.26 12.71,2.73 13,3.5L18,15.45C18.09,15.71 18.14,16 18.13,16.25C18.11,17 17.65,17.74 16.9,18.05L9.53,21.1C9.27,21.22 9,21.25 8.74,21.25C7.97,21.23 7.24,20.77 6.93,20L1.97,8.05C1.55,7.04 2.04,5.87 3.06,5.45L10.42,2.4C10.67,2.31 10.93,2.25 11.19,2.25M14.67,2.25H16.12A2,2 0 0,1 18.12,4.25V10.6L14.67,2.25M20.13,3.79L21.47,4.36C22.5,4.78 22.97,5.94 22.56,6.96L20.13,12.82V3.79M11.19,4.22L3.8,7.29L8.77,19.3L16.17,16.24L11.19,4.22M8.65,8.54L11.88,10.95L11.44,14.96L8.21,12.54L8.65,8.54Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_cemetery.xml
================================================
<!-- drawable/grave_stone.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M10,2H14C17.31,2 19,4.69 19,8V18.66C16.88,17.63 15.07,17 12,17C8.93,17 7.12,17.63 5,18.66V8C5,4.69 6.69,2 10,2M8,8V9.5H16V8H8M9,12V13.5H15V12H9M3,22V21.31C5.66,19.62 13.23,15.84 21,21.25V22H3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_church.xml
================================================
<!-- drawable/church.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11,2H13V4H15V6H13V9.4L22,13V15L20,14.2V22H14V17A2,2 0 0,0 12,15A2,2 0 0,0 10,17V22H4V14.2L2,15V13L11,9.4V6H9V4H11V2M6,20H8V15L7,14L6,15V20M16,20H18V15L17,14L16,15V20Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_city_hall.xml
================================================
<!-- drawable/city_variant.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M19,9V7A2,2 0 0,0 17,5H16V2H14V5H13A2,2 0 0,0 11,7V9A2,2 0 0,0 9,11V12H5A2,2 0 0,0 3,14V22H6V20H8V22H12V20H14V22H16V20H18V22H21V11A2,2 0 0,0 19,9M8,18H6V16H8V18M14,18H12V16H14V18M14,14H12V12H14V14M13,9V7H17V9H13M18,18H16V16H18V18M18,14H16V12H18V14Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_clothing_store.xml
================================================
<!-- drawable/hanger.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M20.76,16.34H20.75C21.5,16.77 22,17.58 22,18.5A2.5,2.5 0 0,1 19.5,21H4.5A2.5,2.5 0 0,1 2,18.5C2,17.58 2.5,16.77 3.25,16.34H3.24L11,11.86C11,11.86 11,11 12,10C13,10 14,9.1 14,8A2,2 0 0,0 12,6A2,2 0 0,0 10,8H8A4,4 0 0,1 12,4A4,4 0 0,1 16,8C16,9.86 14.73,11.42 13,11.87L20.76,16.34M4.5,19V19H19.5V19C19.67,19 19.84,18.91 19.93,18.75C20.07,18.5 20,18.21 19.75,18.07L12,13.59L4.25,18.07C4,18.21 3.93,18.5 4.07,18.75C4.16,18.91 4.33,19 4.5,19Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_convenience_store.xml
================================================
<!-- drawable/store_24_hour.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M16,12H15V10H13V7H14V9H15V7H16M11,10H9V11H11V12H8V9H10V8H8V7H11M19,7V4H5V7H2V20H10V16H14V20H22V7H19Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_courthouse.xml
================================================
<!-- drawable/gavel.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M2.3,20.28L11.9,10.68L10.5,9.26L9.78,9.97C9.39,10.36 8.76,10.36 8.37,9.97L7.66,9.26C7.27,8.87 7.27,8.24 7.66,7.85L13.32,2.19C13.71,1.8 14.34,1.8 14.73,2.19L15.44,2.9C15.83,3.29 15.83,3.92 15.44,4.31L14.73,5L16.15,6.43C16.54,6.04 17.17,6.04 17.56,6.43C17.95,6.82 17.95,7.46 17.56,7.85L18.97,9.26L19.68,8.55C20.07,8.16 20.71,8.16 21.1,8.55L21.8,9.26C22.19,9.65 22.19,10.29 21.8,10.68L16.15,16.33C15.76,16.72 15.12,16.72 14.73,16.33L14.03,15.63C13.63,15.24 13.63,14.6 14.03,14.21L14.73,13.5L13.32,12.09L3.71,21.7C3.32,22.09 2.69,22.09 2.3,21.7C1.91,21.31 1.91,20.67 2.3,20.28M20,19A2,2 0 0,1 22,21V22H12V21A2,2 0 0,1 14,19H20Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_dentist.xml
================================================
<!-- drawable/tooth.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M7,2C4,2 2,5 2,8C2,10.11 3,13 4,14C5,15 6,22 8,22C12.54,22 10,15 12,15C14,15 11.46,22 16,22C18,22 19,15 20,14C21,13 22,10.11 22,8C22,5 20,2 17,2C14,2 14,3 12,3C10,3 10,2 7,2Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_department_store.xml
================================================
<!-- drawable/store.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,18H6V14H12M21,14V12L20,7H4L3,12V14H4V20H14V14H18V20H20V14M20,4H4V6H20V4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_doctor.xml
================================================
<!-- drawable/doctor.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M14.84,16.26C17.86,16.83 20,18.29 20,20V22H4V20C4,18.29 6.14,16.83 9.16,16.26L12,21L14.84,16.26M8,8H16V10A4,4 0 0,1 12,14A4,4 0 0,1 8,10V8M8,7L8.41,2.9C8.46,2.39 8.89,2 9.41,2H14.6C15.11,2 15.54,2.39 15.59,2.9L16,7H8M12,3H11V4H10V5H11V6H12V5H13V4H12V3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_electrician.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M16,7V3H14V7H10V3H8V7H8C7,7 6,8 6,9V14.5L9.5,18V21H14.5V18L18,14.5V9C18,8 17,7 16,7Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_electronics_store.xml
================================================
<!-- drawable/television_classic.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M8.16,3L6.75,4.41L9.34,7H4C2.89,7 2,7.89 2,9V19C2,20.11 2.89,21 4,21H20C21.11,21 22,20.11 22,19V9C22,7.89 21.11,7 20,7H14.66L17.25,4.41L15.84,3L12,6.84L8.16,3M4,9H17V19H4V9M19.5,9A1,1 0 0,1 20.5,10A1,1 0 0,1 19.5,11A1,1 0 0,1 18.5,10A1,1 0 0,1 19.5,9M19.5,12A1,1 0 0,1 20.5,13A1,1 0 0,1 19.5,14A1,1 0 0,1 18.5,13A1,1 0 0,1 19.5,12Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_embassy.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11.5,1L2,6V8H21V6M16,10V17H19V10M2,22H21V19H2M10,10V17H13V10M4,10V17H7V10H4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_establishment.xml
================================================
<!-- drawable/home_city.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M0,21V10L7.5,5L15,10V21H10V14H5V21H0M24,2V21H17V8.93L16,8.27V6H14V6.93L10,4.27V2H24M21,14H19V16H21V14M21,10H19V12H21V10M21,6H19V8H21V6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_finance.xml
================================================
<!-- drawable/currency_usd.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M7,15H9C9,16.08 10.37,17 12,17C13.63,17 15,16.08 15,15C15,13.9 13.96,13.5 11.76,12.97C9.64,12.44 7,11.78 7,9C7,7.21 8.47,5.69 10.5,5.18V3H13.5V5.18C15.53,5.69 17,7.21 17,9H15C15,7.92 13.63,7 12,7C10.37,7 9,7.92 9,9C9,10.1 10.04,10.5 12.24,11.03C14.36,11.56 17,12.22 17,15C17,16.79 15.53,18.31 13.5,18.82V21H10.5V18.82C8.47,18.31 7,16.79 7,15Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_fire_station.xml
================================================
<!-- drawable/fire_truck.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M17.04,2C16.85,2 16.66,2.04 16.5,2.14L5.59,8.5H9.55L17.5,3.86C18,3.58 18.13,2.97 17.85,2.5C17.68,2.2 17.38,2 17.04,2M16,8V10H3A2,2 0 0,0 1,12H2V15H1V19H3A3,3 0 0,0 6,22A3,3 0 0,0 9,19H15A3,3 0 0,0 18,22A3,3 0 0,0 21,19H23V12.5L19.5,8H16M18,9.5H19L21.5,12.5V13.5H18V9.5M4,12H7V15H4V12M9,12H12V15H9V12M14,12H16V15H14V12M6,17.5A1.5,1.5 0 0,1 7.5,19A1.5,1.5 0 0,1 6,20.5A1.5,1.5 0 0,1 4.5,19A1.5,1.5 0 0,1 6,17.5M18,17.5A1.5,1.5 0 0,1 19.5,19A1.5,1.5 0 0,1 18,20.5A1.5,1.5 0 0,1 16.5,19A1.5,1.5 0 0,1 18,17.5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_florist.xml
================================================
<!-- drawable/flower.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M3,13A9,9 0 0,0 12,22C12,17 7.97,13 3,13M12,5.5A2.5,2.5 0 0,1 14.5,8A2.5,2.5 0 0,1 12,10.5A2.5,2.5 0 0,1 9.5,8A2.5,2.5 0 0,1 12,5.5M5.6,10.25A2.5,2.5 0 0,0 8.1,12.75C8.63,12.75 9.12,12.58 9.5,12.31C9.5,12.37 9.5,12.43 9.5,12.5A2.5,2.5 0 0,0 12,15A2.5,2.5 0 0,0 14.5,12.5C14.5,12.43 14.5,12.37 14.5,12.31C14.88,12.58 15.37,12.75 15.9,12.75C17.28,12.75 18.4,11.63 18.4,10.25C18.4,9.25 17.81,8.4 16.97,8C17.81,7.6 18.4,6.74 18.4,5.75C18.4,4.37 17.28,3.25 15.9,3.25C15.37,3.25 14.88,3.41 14.5,3.69C14.5,3.63 14.5,3.56 14.5,3.5A2.5,2.5 0 0,0 12,1A2.5,2.5 0 0,0 9.5,3.5C9.5,3.56 9.5,3.63 9.5,3.69C9.12,3.41 8.63,3.25 8.1,3.25A2.5,2.5 0 0,0 5.6,5.75C5.6,6.74 6.19,7.6 7.03,8C6.19,8.4 5.6,9.25 5.6,10.25M12,22A9,9 0 0,0 21,13C16,13 12,17 12,22Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_food.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M15.5,21L14,8H16.23L15.1,3.46L16.84,3L18.09,8H22L20.5,21H15.5M5,11H10A3,3 0 0,1 13,14H2A3,3 0 0,1 5,11M13,18A3,3 0 0,1 10,21H5A3,3 0 0,1 2,18H13M3,15H8L9.5,16.5L11,15H12A1,1 0 0,1 13,16A1,1 0 0,1 12,17H3A1,1 0 0,1 2,16A1,1 0 0,1 3,15Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_funeral_home.xml
================================================
<!-- drawable/skull.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,2A9,9 0 0,0 3,11C3,14.03 4.53,16.82 7,18.47V22H9V19H11V22H13V19H15V22H17V18.46C19.47,16.81 21,14 21,11A9,9 0 0,0 12,2M8,11A2,2 0 0,1 10,13A2,2 0 0,1 8,15A2,2 0 0,1 6,13A2,2 0 0,1 8,11M16,11A2,2 0 0,1 18,13A2,2 0 0,1 16,15A2,2 0 0,1 14,13A2,2 0 0,1 16,11M12,14L13.5,17H10.5L12,14Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_furniture_store.xml
================================================
<!-- drawable/sofa.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M7,6H9A2,2 0 0,1 11,8V12H5V8A2,2 0 0,1 7,6M15,6H17A2,2 0 0,1 19,8V12H13V8A2,2 0 0,1 15,6M1,9H2A1,1 0 0,1 3,10V12A2,2 0 0,0 5,14H19A2,2 0 0,0 21,12V11L21,10A1,1 0 0,1 22,9H23A1,1 0 0,1 24,10V19H21V17H3V19H0V10A1,1 0 0,1 1,9Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_gas_station.xml
================================================
<!-- drawable/gas_station.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,10A1,1 0 0,1 17,9A1,1 0 0,1 18,8A1,1 0 0,1 19,9A1,1 0 0,1 18,10M12,10H6V5H12M19.77,7.23L19.78,7.22L16.06,3.5L15,4.56L17.11,6.67C16.17,7 15.5,7.93 15.5,9A2.5,2.5 0 0,0 18,11.5C18.36,11.5 18.69,11.42 19,11.29V18.5A1,1 0 0,1 18,19.5A1,1 0 0,1 17,18.5V14C17,12.89 16.1,12 15,12H14V5C14,3.89 13.1,3 12,3H6C4.89,3 4,3.89 4,5V21H14V13.5H15.5V18.5A2.5,2.5 0 0,0 18,21A2.5,2.5 0 0,0 20.5,18.5V9C20.5,8.31 20.22,7.68 19.77,7.23Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_gym.xml
================================================
<!-- drawable/dumbbell.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M4.22,14.12L3.5,13.41C2.73,12.63 2.73,11.37 3.5,10.59C4.3,9.8 5.56,9.8 6.34,10.59L8.92,13.16L13.16,8.92L10.59,6.34C9.8,5.56 9.8,4.3 10.59,3.5C11.37,2.73 12.63,2.73 13.41,3.5L14.12,4.22L19.78,9.88L20.5,10.59C21.27,11.37 21.27,12.63 20.5,13.41C19.7,14.2 18.44,14.2 17.66,13.41L15.08,10.84L10.84,15.08L13.41,17.66C14.2,18.44 14.2,19.7 13.41,20.5C12.63,21.27 11.37,21.27 10.59,20.5L9.88,19.78L4.22,14.12M3.16,19.42L4.22,18.36L2.81,16.95C2.42,16.56 2.42,15.93 2.81,15.54C3.2,15.15 3.83,15.15 4.22,15.54L8.46,19.78C8.85,20.17 8.85,20.8 8.46,21.19C8.07,21.58 7.44,21.58 7.05,21.19L5.64,19.78L4.58,20.84L3.16,19.42M19.42,3.16L20.84,4.58L19.78,5.64L21.19,7.05C21.58,7.44 21.58,8.07 21.19,8.46C20.8,8.86 20.17,8.86 19.78,8.46L15.54,4.22C15.15,3.83 15.15,3.2 15.54,2.81C15.93,2.42 16.56,2.42 16.95,2.81L18.36,4.22L19.42,3.16Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_hair_care.xml
================================================
<!-- drawable/content_cut.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M19,3L13,9L15,11L22,4V3M12,12.5A0.5,0.5 0 0,1 11.5,12A0.5,0.5 0 0,1 12,11.5A0.5,0.5 0 0,1 12.5,12A0.5,0.5 0 0,1 12,12.5M6,20A2,2 0 0,1 4,18C4,16.89 4.9,16 6,16A2,2 0 0,1 8,18C8,19.11 7.1,20 6,20M6,8A2,2 0 0,1 4,6C4,4.89 4.9,4 6,4A2,2 0 0,1 8,6C8,7.11 7.1,8 6,8M9.64,7.64C9.87,7.14 10,6.59 10,6A4,4 0 0,0 6,2A4,4 0 0,0 2,6A4,4 0 0,0 6,10C6.59,10 7.14,9.87 7.64,9.64L10,12L7.64,14.36C7.14,14.13 6.59,14 6,14A4,4 0 0,0 2,18A4,4 0 0,0 6,22A4,4 0 0,0 10,18C10,17.41 9.87,16.86 9.64,16.36L12,14L19,21H22V20L9.64,7.64Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_hardware_store.xml
================================================
<!-- drawable/hammer.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M16,5L19,8L18.5,8.5C19.5,9.5 20,10 20.5,9.5L22,11C22,12 20.5,13.5 19.5,13.5L18,12C18.5,11.5 18,11 17,10L16,11L13,8C14.5,6 13,4 9,5C10,4 11,3 12,3C12.5,3 14,3 16,5M2,20L4,22L14,12L12,10L2,20Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_health.xml
================================================
<!-- drawable/heart_pulse.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M7.5,4A5.5,5.5 0 0,0 2,9.5C2,10 2.09,10.5 2.22,11H6.3L7.57,7.63C7.87,6.83 9.05,6.75 9.43,7.63L11.5,13L12.09,11.58C12.22,11.25 12.57,11 13,11H21.78C21.91,10.5 22,10 22,9.5A5.5,5.5 0 0,0 16.5,4C14.64,4 13,4.93 12,6.34C11,4.93 9.36,4 7.5,4V4M3,12.5A1,1 0 0,0 2,13.5A1,1 0 0,0 3,14.5H5.44L11,20C12,20.9 12,20.9 13,20L18.56,14.5H21A1,1 0 0,0 22,13.5A1,1 0 0,0 21,12.5H13.4L12.47,14.8C12.07,15.81 10.92,15.67 10.55,14.83L8.5,9.5L7.54,11.83C7.39,12.21 7.05,12.5 6.6,12.5H3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_hindu_temple.xml
================================================
<!-- drawable/hinduism.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M15,2L13.5,3.5L15,5L16.5,3.5L15,2M11,3C10,9 17,10 20,6L18,4.5C17,6 13,8 11,3M9,7C7,7 4.5,8.5 4.5,8.5L6,11C7,10 9,9.5 10,10C12,11 9,13 7,12V15.5C10,14 12,16 11,17.5C8,22 3,16 3,13C1,19 6,22 9,22C12,22 14,20 12.5,15H14C12.5,19.5 18,24 21,18C22,16 22,9.5 17,9.5C13,9.5 14,15 10.5,13.5C14,10 12,7 9,7M19,12C22,15 15,21 15,15C15,13 17,10.5 19,12Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_home_goods_store.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M8,2H16L20,14H4L8,2M11,15H13V20H18V22H6V20H11V15Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_hospital.xml
================================================
<!-- drawable/hospital.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,14H14V18H10V14H6V10H10V6H14V10H18M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_insurance_agency.xml
================================================
<!-- drawable/shield_home.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11,13H13V16H16V11H18L12,6L6,11H8V16H11V13M12,1L21,5V11C21,16.55 17.16,21.74 12,23C6.84,21.74 3,16.55 3,11V5L12,1Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_jewelry_store.xml
================================================
<!-- drawable/diamond_stone.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M16,9H19L14,16M10,9H14L12,17M5,9H8L10,16M15,4H17L19,7H16M11,4H13L14,7H10M7,4H9L8,7H5M6,2L2,8L12,22L22,8L18,2H6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_laundry.xml
================================================
<!-- drawable/washing_machine.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M14.83,11.17C16.39,12.73 16.39,15.27 14.83,16.83C13.27,18.39 10.73,18.39 9.17,16.83L14.83,11.17M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_lawyer.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,3C10.73,3 9.6,3.8 9.18,5H3V7H4.95L2,14C1.53,16 3,17 5.5,17C8,17 9.56,16 9,14L6.05,7H9.17C9.5,7.85 10.15,8.5 11,8.83V20H2V22H22V20H13V8.82C13.85,8.5 14.5,7.85 14.82,7H17.95L15,14C14.53,16 16,17 18.5,17C21,17 22.56,16 22,14L19.05,7H21V5H14.83C14.4,3.8 13.27,3 12,3M12,5A1,1 0 0,1 13,6A1,1 0 0,1 12,7A1,1 0 0,1 11,6A1,1 0 0,1 12,5M5.5,10.25L7,14H4L5.5,10.25M18.5,10.25L20,14H17L18.5,10.25Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_library.xml
================================================
<!-- drawable/library.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,8A3,3 0 0,0 15,5A3,3 0 0,0 12,2A3,3 0 0,0 9,5A3,3 0 0,0 12,8M12,11.54C9.64,9.35 6.5,8 3,8V19C6.5,19 9.64,20.35 12,22.54C14.36,20.35 17.5,19 21,19V8C17.5,8 14.36,9.35 12,11.54Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_liquor_store.xml
================================================
<!-- drawable/glass_wine.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#000"
        android:pathData="M15.5,21.27L14.66,21.18C13.9,21.11 13.25,20.6 13,19.87C12.47,17.91 12.47,15.83 13,13.87C15.32,13.4 17,11.37 17,9C17,7 15,2 15,2H9C9,2 7,7 7,9C7,11.38 8.67,13.42 11,13.9C11.53,15.86 11.53,17.94 11,19.9C10.76,20.62 10.12,21.13 9.37,21.21L8.5,21.3C8.5,21.3 8,21.28 8,22H16C16,21.28 15.5,21.27 15.5,21.27M9.44,7L10.44,4H13.56L14.56,7H9.44Z" />
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_local_government_office.xml
================================================
<!-- drawable/domain.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,15H16V17H18M18,11H16V13H18M20,19H12V17H14V15H12V13H14V11H12V9H20M10,7H8V5H10M10,11H8V9H10M10,15H8V13H10M10,19H8V17H10M6,7H4V5H6M6,11H4V9H6M6,15H4V13H6M6,19H4V17H6M12,7V3H2V21H22V7H12Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_locksmith.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M22,18V22H18V19H15V16H12L9.74,13.74C9.19,13.91 8.61,14 8,14A6,6 0 0,1 2,8A6,6 0 0,1 8,2A6,6 0 0,1 14,8C14,8.61 13.91,9.19 13.74,9.74L22,18M7,5A2,2 0 0,0 5,7A2,2 0 0,0 7,9A2,2 0 0,0 9,7A2,2 0 0,0 7,5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_lodging.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M19,7H11V14H3V5H1V20H3V17H21V20H23V11A4,4 0 0,0 19,7M7,13A3,3 0 0,0 10,10A3,3 0 0,0 7,7A3,3 0 0,0 4,10A3,3 0 0,0 7,13Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_meal_takeaway.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000000"
        android:pathData="M22.1275,6.9447V4H20.369L19.17,4.3995L17.9708,4H17.4276L15.7895,4.4094L14.1514,4H13.608L12.409,4.3995L11.2098,4H10.2961V6.9379L10.1753,8.2253H8.1832V5.4786C8.1832,4.6631 7.5197,4 6.7044,4H1V6.5353H5.6479V8.2253H3.1127V10.7606H3.9916L4.8368,20.9017H23L22.1275,6.9447ZM1.8452,5.69V4.8448H6.7048C7.0542,4.8448 7.3386,5.129 7.3386,5.4786V8.2253H6.4934V5.69H1.8452ZM9.0626,20.0565H5.6147L4.8399,10.7606H9.8372L9.0626,20.0565ZM10.7189,9.9154H3.9579V9.0706H10.7189V9.9154ZM19.6184,20.0567H11.6009L12.3755,10.7608H13.254V8.2253H11.0243L11.1035,7.3801H20.4102L19.6184,20.0567ZM20.4377,6.5353H11.1416V4.8675L12.4094,5.2903L13.7453,4.8448H14.0473L15.7895,5.2804L17.5315,4.8448H17.8335L19.17,5.2903L20.4377,4.8675V6.5353Z"/>
</vector>


================================================
FILE: library/src/main/res/drawable/ic_places_mosque.xml
================================================
<!-- drawable/islam.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12.3,2C12.2,2 12.1,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22C15,22 16.7,21 18.5,19.5C13,21 8,17 8,12C8,7 13,3 18.5,4.5C16.86,2.86 14.62,1.96 12.3,2M16.8,6.2L15.3,9.7L11.6,10L14.5,12.5L13.6,16L16.8,14L20,16L19,12.5L22,10L18.3,9.7L16.8,6.2Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_movie_rental.xml
================================================
<!-- drawable/filmstrip.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,9H16V7H18M18,13H16V11H18M18,17H16V15H18M8,9H6V7H8M8,13H6V11H8M8,17H6V15H8M18,3V5H16V3H8V5H6V3H4V21H6V19H8V21H16V19H18V21H20V3H18Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_movie_theater.xml
================================================
<!-- drawable/video_vintage.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,14.5V11A1,1 0 0,0 17,10H16C18.24,8.39 18.76,5.27 17.15,3C15.54,0.78 12.42,0.26 10.17,1.87C9.5,2.35 8.96,3 8.6,3.73C6.25,2.28 3.17,3 1.72,5.37C0.28,7.72 1,10.8 3.36,12.25C3.57,12.37 3.78,12.5 4,12.58V21A1,1 0 0,0 5,22H17A1,1 0 0,0 18,21V17.5L22,21.5V10.5L18,14.5M13,4A2,2 0 0,1 15,6A2,2 0 0,1 13,8A2,2 0 0,1 11,6A2,2 0 0,1 13,4M6,6A2,2 0 0,1 8,8A2,2 0 0,1 6,10A2,2 0 0,1 4,8A2,2 0 0,1 6,6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_moving_company.xml
================================================
<!-- drawable/truck_delivery.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M3,4A2,2 0 0,0 1,6V17H3A3,3 0 0,0 6,20A3,3 0 0,0 9,17H15A3,3 0 0,0 18,20A3,3 0 0,0 21,17H23V12L20,8H17V4M10,6L14,10L10,14V11H4V9H10M17,9.5H19.5L21.47,12H17M6,15.5A1.5,1.5 0 0,1 7.5,17A1.5,1.5 0 0,1 6,18.5A1.5,1.5 0 0,1 4.5,17A1.5,1.5 0 0,1 6,15.5M18,15.5A1.5,1.5 0 0,1 19.5,17A1.5,1.5 0 0,1 18,18.5A1.5,1.5 0 0,1 16.5,17A1.5,1.5 0 0,1 18,15.5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_museum.xml
================================================
<!-- drawable/bank.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11.5,1L2,6V8H21V6M16,10V17H19V10M2,22H21V19H2M10,10V17H13V10M4,10V17H7V10H4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_night_club.xml
================================================
<!-- drawable/glass_cocktail.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M7.5,7L5.5,5H18.5L16.5,7M11,13V19H6V21H18V19H13V13L21,5V3H3V5L11,13Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_painter.xml
================================================
<!-- drawable/format_paint.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,4V3A1,1 0 0,0 17,2H5A1,1 0 0,0 4,3V7A1,1 0 0,0 5,8H17A1,1 0 0,0 18,7V6H19V10H9V21A1,1 0 0,0 10,22H12A1,1 0 0,0 13,21V12H21V4H18Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_park.xml
================================================
<!-- drawable/nature_people.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M4.5,11A1.5,1.5 0 0,0 6,9.5A1.5,1.5 0 0,0 4.5,8A1.5,1.5 0 0,0 3,9.5A1.5,1.5 0 0,0 4.5,11M22.17,9.17C22.17,5.3 19.04,2.17 15.17,2.17A7,7 0 0,0 8.17,9.17C8.17,12.64 10.69,15.5 14,16.06V20H6V17H7V13A1,1 0 0,0 6,12H3A1,1 0 0,0 2,13V17H3V22H19V20H16V16.12C19.47,15.71 22.17,12.76 22.17,9.17Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_parking.xml
================================================
<!-- drawable/parking.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M13.2,11H10V7H13.2A2,2 0 0,1 15.2,9A2,2 0 0,1 13.2,11M13,3H6V21H10V15H13A6,6 0 0,0 19,9C19,5.68 16.31,3 13,3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_pet_store.xml
================================================
<!-- drawable/paw.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M8.35,3C9.53,2.83 10.78,4.12 11.14,5.9C11.5,7.67 10.85,9.25 9.67,9.43C8.5,9.61 7.24,8.32 6.87,6.54C6.5,4.77 7.17,3.19 8.35,3M15.5,3C16.69,3.19 17.35,4.77 17,6.54C16.62,8.32 15.37,9.61 14.19,9.43C13,9.25 12.35,7.67 12.72,5.9C13.08,4.12 14.33,2.83 15.5,3M3,7.6C4.14,7.11 5.69,8 6.5,9.55C7.26,11.13 7,12.79 5.87,13.28C4.74,13.77 3.2,12.89 2.41,11.32C1.62,9.75 1.9,8.08 3,7.6M21,7.6C22.1,8.08 22.38,9.75 21.59,11.32C20.8,12.89 19.26,13.77 18.13,13.28C17,12.79 16.74,11.13 17.5,9.55C18.31,8 19.86,7.11 21,7.6M19.33,18.38C19.37,19.32 18.65,20.36 17.79,20.75C16,21.57 13.88,19.87 11.89,19.87C9.9,19.87 7.76,21.64 6,20.75C5,20.26 4.31,18.96 4.44,17.88C4.62,16.39 6.41,15.59 7.47,14.5C8.88,13.09 9.88,10.44 11.89,10.44C13.89,10.44 14.95,13.05 16.3,14.5C17.41,15.72 19.26,16.75 19.33,18.38Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_pharmacy.xml
================================================
<!-- drawable/pharmacy.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M16,14H13V17H11V14H8V12H11V9H13V12H16M21,5H18.35L19.5,1.85L17.15,1L15.69,5H3V7L5,13L3,19V21H21V19L19,13L21,7V5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_physiotherapist.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M4,12V3H2V12A5,5 0 0,0 7,17H13V15H7A3,3 0 0,1 4,12M22.83,17.24C22.45,16.5 21.54,16.27 20.8,16.61L19.71,17.11L16.3,10.13C15.96,9.45 15.27,9 14.5,9H11V3H5V11A3,3 0 0,0 8,14H15L18.41,21L22.13,19.3C22.9,18.94 23.23,18 22.83,17.24Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_place_of_worship.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000000"
        android:fillType="evenOdd"
        android:pathData="M11.1102,1.0004C11.1707,1.0031 11.2228,1.0329 11.2736,1.0777C11.3547,1.1494 11.4541,1.3057 11.4541,1.628V18.7448C11.4541,19.1093 11.1212,19.6399 10.6374,19.957C9.3109,20.5816 7.998,19.7026 7.2157,18.6159C6.6768,17.8404 6.3311,16.6757 6.8203,14.7299C7.1862,13.7159 7.4051,12.2739 8.0239,9.9328C8.0239,9.927 8.0239,9.9212 8.0239,9.9157C8.3159,8.6252 8.5954,7.9515 8.8062,7.6031C9.017,7.2547 9.1245,7.2196 9.365,7.0271C9.6054,6.8346 9.8993,6.4636 10.027,5.8751C10.1546,5.2865 10.2075,4.428 10.2075,2.9349C10.2075,1.5855 10.7315,1.1032 10.9899,1.0263C11.0383,1.012 11.0739,0.9987 11.1102,1.0004Z"/>
    <path
        android:fillColor="#000000"
        android:fillType="evenOdd"
        android:pathData="M12.8898,1.0003C12.9261,0.9976 12.9704,1.0116 13.0188,1.0262C13.2771,1.1031 13.8011,1.5854 13.8011,2.9348C13.8011,4.428 13.8539,5.2864 13.9817,5.875C14.1093,6.4636 14.4032,6.8345 14.6436,7.027C14.884,7.2195 14.9916,7.2546 15.2024,7.603C15.4133,7.9514 15.6927,8.6251 15.9848,9.9156C15.9848,9.9214 15.9848,9.9272 15.9848,9.9327C16.602,12.2683 16.824,13.7077 17.1884,14.7213C17.1884,14.724 17.1884,14.7276 17.1884,14.7298C17.6775,16.6755 17.3318,17.8402 16.7929,18.6157C15.9937,19.6168 14.519,20.6914 13.3627,19.9568C12.8788,19.6398 12.5545,19.1093 12.5545,18.7447V1.6279C12.5545,1.3056 12.6539,1.1493 12.7351,1.0777C12.7858,1.0329 12.8293,1.0032 12.8898,1.0003Z"/>
    <path
        android:fillColor="#000000"
        android:fillType="evenOdd"
        android:pathData="M5.4963,16.4494C5.504,17.6317 5.8342,18.5544 6.313,19.2434C6.9657,20.1827 7.8401,20.6684 8.4107,20.9456V22.4674H1.043L1,17.7733C2.4142,17.4313 3.4443,17.2007 4.2325,16.9652C4.7296,16.8167 5.1441,16.6584 5.4963,16.4494Z"/>
    <path
        android:fillColor="#000000"
        android:fillType="evenOdd"
        android:pathData="M18.5123,16.4494C18.8645,16.6584 19.279,16.8167 19.7761,16.9652C20.5643,17.2007 21.5858,17.4314 23,17.7733L22.957,22.4674H15.5979V20.9456C16.1686,20.6682 17.0439,20.1812 17.6956,19.2434C18.1744,18.5544 18.5047,17.6317 18.5123,16.4494Z"/>
</vector>


================================================
FILE: library/src/main/res/drawable/ic_places_plumber.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M22.7,19L13.6,9.9C14.5,7.6 14,4.9 12.1,3C10.1,1 7.1,0.6 4.7,1.7L9,6L6,9L1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1C4.8,14 7.5,14.5 9.8,13.6L18.9,22.7C19.3,23.1 19.9,23.1 20.3,22.7L22.6,20.4C23.1,20 23.1,19.3 22.7,19Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_police.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M6,6.9L3.87,4.78L5.28,3.37L7.4,5.5L6,6.9M13,1V4H11V1H13M20.13,4.78L18,6.9L16.6,5.5L18.72,3.37L20.13,4.78M4.5,10.5V12.5H1.5V10.5H4.5M19.5,10.5H22.5V12.5H19.5V10.5M6,20H18A2,2 0 0,1 20,22H4A2,2 0 0,1 6,20M12,5A6,6 0 0,1 18,11V19H6V11A6,6 0 0,1 12,5Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_post_office.xml
================================================
<!-- drawable/email.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_real_estate_agency.xml
================================================
<!-- drawable/home_city.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M0,21V10L7.5,5L15,10V21H10V14H5V21H0M24,2V21H17V8.93L16,8.27V6H14V6.93L10,4.27V2H24M21,14H19V16H21V14M21,10H19V12H21V10M21,6H19V8H21V6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_restaurant.xml
================================================
<!-- drawable/silverware_fork_knife.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M11,9H9V2H7V9H5V2H3V9C3,11.12 4.66,12.84 6.75,12.97V22H9.25V12.97C11.34,12.84 13,11.12 13,9V2H11V9M16,6V14H18.5V22H21V2C18.24,2 16,4.24 16,6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_roofing_contractor.xml
================================================
<!-- drawable/store.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,18H6V14H12M21,14V12L20,7H4L3,12V14H4V20H14V14H18V20H20V14M20,4H4V6H20V4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_rv_park.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000000"
        android:pathData="M7.2212,13.3836C5.8769,13.3836 4.7868,14.2556 4.7868,15.3311C4.7868,16.4066 5.8769,17.2787 7.2212,17.2787C8.5656,17.2787 9.6557,16.407 9.6557,15.3311C9.6557,14.2553 8.566,13.3836 7.2212,13.3836ZM7.2212,16.413C6.4743,16.413 5.8689,15.9287 5.8689,15.3311C5.8689,14.7336 6.4743,14.2492 7.2212,14.2492C7.9682,14.2492 8.5736,14.7336 8.5736,15.3311C8.5736,15.9287 7.9686,16.413 7.2212,16.413Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M19.0877,12.9508V9.3804C19.0877,8.0657 17.7556,7 16.1127,7H3.9755C2.3322,7 1,8.0657 1,9.3804V12.9508C1,14.2654 2.3322,15.3311 3.9755,15.3311H4.2458C4.2458,14.0185 5.5809,12.9508 7.2212,12.9508C8.8616,12.9508 10.1963,14.0185 10.1963,15.3311H16.1123C17.7556,15.3311 19.0877,14.2654 19.0877,12.9508ZM6.4099,10.3541C6.4099,10.5933 6.1678,10.787 5.8693,10.787H3.7052C3.4062,10.787 3.1641,10.5933 3.1641,10.3541V9.2723C3.1641,9.0331 3.4062,8.8394 3.7052,8.8394H5.8693C6.1678,8.8394 6.4099,9.0331 6.4099,9.2723V10.3541ZM11.2788,10.3541C11.2788,10.5933 11.0367,10.787 10.7377,10.787H8.5736C8.2747,10.787 8.0326,10.5933 8.0326,10.3541V9.2723C8.0326,9.0331 8.2747,8.8394 8.5736,8.8394H10.7377C11.0367,8.8394 11.2788,9.0331 11.2788,9.2723V10.3541ZM16.2377,14.0327C16.2377,14.2718 15.9952,14.4655 15.6967,14.4655H13.5326C13.2336,14.4655 12.9915,14.2718 12.9915,14.0327V9.2723C12.9915,9.0331 13.2336,8.8394 13.5326,8.8394H15.6967C15.9952,8.8394 16.2377,9.0331 16.2377,9.2723V14.0327Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M13.9385,11.1656C13.7145,11.1656 13.5326,11.3111 13.5326,11.4903V12.1936C13.5326,12.3728 13.7145,12.5179 13.9385,12.5179C14.1624,12.5179 14.3443,12.3728 14.3443,12.1936V11.4903C14.3443,11.3111 14.1629,11.1656 13.9385,11.1656Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M22.5491,13.3836C22.3002,13.3836 22.0986,13.5449 22.0986,13.7443V14.6817H18.7075C18.4326,14.9451 18.097,15.1664 17.7168,15.3311H22.7293C22.8783,15.3311 23,15.2341 23,15.1146V13.7443C23,13.5449 22.7979,13.3836 22.5491,13.3836Z"/>
</vector>


================================================
FILE: library/src/main/res/drawable/ic_places_school.xml
================================================
<!-- drawable/school.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,3L1,9L12,15L21,10.09V17H23V9M5,13.18V17.18L12,21L19,17.18V13.18L12,17L5,13.18Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_shoe_store.xml
================================================
<!-- drawable/shoe_formal.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M21.5,9V8H20.5L19.5,9H15L14,8H13L7,12H4A2,2 0 0,0 2,14V16H10L13,15H15V16H21.5V14C21.5,14 22,13 22,11.5C22,10 21.5,9 21.5,9Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_shopping_mall.xml
================================================
<!-- drawable/shopping.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,13A5,5 0 0,1 7,8H9A3,3 0 0,0 12,11A3,3 0 0,0 15,8H17A5,5 0 0,1 12,13M12,3A3,3 0 0,1 15,6H9A3,3 0 0,1 12,3M19,6H17A5,5 0 0,0 12,1A5,5 0 0,0 7,6H5C3.89,6 3,6.89 3,8V20A2,2 0 0,0 5,22H19A2,2 0 0,0 21,20V8C21,6.89 20.1,6 19,6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_spa.xml
================================================
<!-- drawable/spa.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M15.5,9.63C15.31,6.84 14.18,4.12 12.06,2C9.92,4.14 8.74,6.86 8.5,9.63C9.79,10.31 10.97,11.19 12,12.26C13.03,11.2 14.21,10.32 15.5,9.63M12,15.45C9.85,12.17 6.18,10 2,10C2,20 11.32,21.89 12,22C12.68,21.88 22,20 22,10C17.82,10 14.15,12.17 12,15.45Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_stadium.xml
================================================
<!-- drawable/stadium.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,3H7L10,5L7,7V8.33C8.47,8.12 10.18,8 12,8C13.82,8 15.53,8.12 17,8.33V3H19L22,5L19,7V8.71C20.85,9.17 22,9.8 22,10.5C22,11.88 17.5,13 12,13C6.5,13 2,11.88 2,10.5C2,9.8 3.15,9.17 5,8.71V3M12,9.5C8.69,9.5 7,9.67 7,10.5C7,11.33 8.69,11.5 12,11.5C15.31,11.5 17,11.33 17,10.5C17,9.67 15.31,9.5 12,9.5M12,14.75C15.81,14.75 19.2,14.08 21.4,13.05L20,21H15V19A2,2 0 0,0 13,17H11A2,2 0 0,0 9,19V21H4L2.6,13.05C4.8,14.08 8.19,14.75 12,14.75Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_storage.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M2,10.96C1.5,10.68 1.35,10.07 1.63,9.59L3.13,7C3.24,6.8 3.41,6.66 3.6,6.58L11.43,2.18C11.59,2.06 11.79,2 12,2C12.21,2 12.41,2.06 12.57,2.18L20.47,6.62C20.66,6.72 20.82,6.88 20.91,7.08L22.36,9.6C22.64,10.08 22.47,10.69 22,10.96L21,11.54V16.5C21,16.88 20.79,17.21 20.47,17.38L12.57,21.82C12.41,21.94 12.21,22 12,22C11.79,22 11.59,21.94 11.43,21.82L3.53,17.38C3.21,17.21 3,16.88 3,16.5V10.96C2.7,11.13 2.32,11.14 2,10.96M12,4.15V4.15L12,10.85V10.85L17.96,7.5L12,4.15M5,15.91L11,19.29V12.58L5,9.21V15.91M19,15.91V12.69L14,15.59C13.67,15.77 13.3,15.76 13,15.6V19.29L19,15.91M13.85,13.36L20.13,9.73L19.55,8.72L13.27,12.35L13.85,13.36Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_store.xml
================================================
<!-- drawable/store.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,18H6V14H12M21,14V12L20,7H4L3,12V14H4V20H14V14H18V20H20V14M20,4H4V6H20V4Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_subway_station.xml
================================================
<!-- drawable/subway_variant.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M18,11H13V6H18M16.5,17A1.5,1.5 0 0,1 15,15.5A1.5,1.5 0 0,1 16.5,14A1.5,1.5 0 0,1 18,15.5A1.5,1.5 0 0,1 16.5,17M11,11H6V6H11M7.5,17A1.5,1.5 0 0,1 6,15.5A1.5,1.5 0 0,1 7.5,14A1.5,1.5 0 0,1 9,15.5A1.5,1.5 0 0,1 7.5,17M12,2C7.58,2 4,2.5 4,6V15.5A3.5,3.5 0 0,0 7.5,19L6,20.5V21H18V20.5L16.5,19A3.5,3.5 0 0,0 20,15.5V6C20,2.5 16.42,2 12,2Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_supermarket.xml
================================================
<!-- drawable/cart.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M17,18C15.89,18 15,18.89 15,20A2,2 0 0,0 17,22A2,2 0 0,0 19,20C19,18.89 18.1,18 17,18M1,2V4H3L6.6,11.59L5.24,14.04C5.09,14.32 5,14.65 5,15A2,2 0 0,0 7,17H19V15H7.42A0.25,0.25 0 0,1 7.17,14.75C7.17,14.7 7.18,14.66 7.2,14.63L8.1,13H15.55C16.3,13 16.96,12.58 17.3,11.97L20.88,5.5C20.95,5.34 21,5.17 21,5A1,1 0 0,0 20,4H5.21L4.27,2M7,18C5.89,18 5,18.89 5,20A2,2 0 0,0 7,22A2,2 0 0,0 9,20C9,18.89 8.1,18 7,18Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_synagogue.xml
================================================
<!-- drawable/judaism.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,2L9.1,7H3.3L6.3,12L3.3,17H9.1L12,22L14.9,17H20.7L17.7,12L20.7,7H14.9L12,2M12,5L13.2,7H10.8L12,5M8.2,8.5L7.1,10.5L5.9,8.5H8.2M10,8.5H14L16,12L14,15.5H10L8,12L10,8.5M18,8.5L16.8,10.5L15.7,8.5H18M7.1,13.5L8.2,15.5H6L7.1,13.5M16.9,13.5L18.1,15.5H15.8L16.9,13.5M13.3,17L12,19L10.8,17H13.3Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_taxi_stand.xml
================================================
<!-- drawable/taxi.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M5,11L6.5,6.5H17.5L19,11M17.5,16A1.5,1.5 0 0,1 16,14.5A1.5,1.5 0 0,1 17.5,13A1.5,1.5 0 0,1 19,14.5A1.5,1.5 0 0,1 17.5,16M6.5,16A1.5,1.5 0 0,1 5,14.5A1.5,1.5 0 0,1 6.5,13A1.5,1.5 0 0,1 8,14.5A1.5,1.5 0 0,1 6.5,16M18.92,6C18.72,5.42 18.16,5 17.5,5H15V3H9V5H6.5C5.84,5 5.28,5.42 5.08,6L3,12V20A1,1 0 0,0 4,21H5A1,1 0 0,0 6,20V19H18V20A1,1 0 0,0 19,21H20A1,1 0 0,0 21,20V12L18.92,6Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_train_station.xml
================================================
<!-- drawable/train.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24">
    <path
        android:fillColor="#000"
        android:pathData="M12,2C8,2 4,2.5 4,6V15.5A3.5,3.5 0 0,0 7.5,19L6,20.5V21H8.23L10.23,19H14L16,21H18V20.5L16.5,19A3.5,3.5 0 0,0 20,15.5V6C20,2.5 16.42,2 12,2M7.5,17A1.5,1.5 0 0,1 6,15.5A1.5,1.5 0 0,1 7.5,14A1.5,1.5 0 0,1 9,15.5A1.5,1.5 0 0,1 7.5,17M11,10H6V6H11V10M13,10V6H18V10H13M16.5,17A1.5,1.5 0 0,1 15,15.5A1.5,1.5 0 0,1 16.5,14A1.5,1.5 0 0,1 18,15.5A1.5,1.5 0 0,1 16.5,17Z"/>
</vector>

================================================
FILE: library/src/main/res/drawable/ic_places_transit_station.xml
================================================
<!-- drawable/transit_transfer.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24"
    
Download .txt
gitextract_fxfpf1cx/

├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jitpack.yml
├── library/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── rtchagas/
│       │   │           └── pingplacepicker/
│       │   │               ├── Config.kt
│       │   │               ├── PingPlacePicker.kt
│       │   │               ├── helper/
│       │   │               │   ├── PermissionsHelper.kt
│       │   │               │   └── UrlSignerHelper.kt
│       │   │               ├── inject/
│       │   │               │   ├── PingKoinComponent.kt
│       │   │               │   ├── RepositoryModule.kt
│       │   │               │   └── ViewModelModule.kt
│       │   │               ├── model/
│       │   │               │   ├── Geometry.kt
│       │   │               │   ├── Location.kt
│       │   │               │   ├── Photo.kt
│       │   │               │   ├── SearchResult.kt
│       │   │               │   └── SimplePlace.kt
│       │   │               ├── repository/
│       │   │               │   ├── PlaceRepository.kt
│       │   │               │   └── googlemaps/
│       │   │               │       ├── CustomPlace.kt
│       │   │               │       ├── GoogleMapsAPI.kt
│       │   │               │       ├── GoogleMapsRepository.kt
│       │   │               │       └── PlaceFromCoordinates.kt
│       │   │               ├── ui/
│       │   │               │   ├── UiExtensions.kt
│       │   │               │   ├── UiUtils.kt
│       │   │               │   ├── activity/
│       │   │               │   │   ├── BaseActivity.kt
│       │   │               │   │   └── PlacePickerActivity.kt
│       │   │               │   ├── adapter/
│       │   │               │   │   └── PlacePickerAdapter.kt
│       │   │               │   └── fragment/
│       │   │               │       └── PlaceConfirmDialogFragment.kt
│       │   │               └── viewmodel/
│       │   │                   ├── BaseViewModel.kt
│       │   │                   ├── PlaceConfirmDialogViewModel.kt
│       │   │                   ├── PlacePickerViewModel.kt
│       │   │                   └── Resource.kt
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── bg_button_round.xml
│       │       │   ├── ic_arrow_back_black_24dp.xml
│       │       │   ├── ic_close_black_24dp.xml
│       │       │   ├── ic_crosshairs_gps_black_24dp.xml
│       │       │   ├── ic_magnify_black_24dp.xml
│       │       │   ├── ic_magnify_toolbar_menu_24dp.xml
│       │       │   ├── ic_map_marker_black_24dp.xml
│       │       │   ├── ic_map_marker_radius_black_24dp.xml
│       │       │   ├── ic_map_marker_select_red_48dp.xml
│       │       │   ├── ic_map_marker_solid_red_32dp.xml
│       │       │   ├── ic_places_accounting.xml
│       │       │   ├── ic_places_airport.xml
│       │       │   ├── ic_places_amusement_park.xml
│       │       │   ├── ic_places_aquarium.xml
│       │       │   ├── ic_places_art_gallery.xml
│       │       │   ├── ic_places_atm.xml
│       │       │   ├── ic_places_bakery.xml
│       │       │   ├── ic_places_bank.xml
│       │       │   ├── ic_places_bar.xml
│       │       │   ├── ic_places_beauty_salon.xml
│       │       │   ├── ic_places_bicycle_store.xml
│       │       │   ├── ic_places_book_store.xml
│       │       │   ├── ic_places_bowling_alley.xml
│       │       │   ├── ic_places_bus_station.xml
│       │       │   ├── ic_places_cafe.xml
│       │       │   ├── ic_places_campground.xml
│       │       │   ├── ic_places_car_dealer.xml
│       │       │   ├── ic_places_car_rental.xml
│       │       │   ├── ic_places_car_repair.xml
│       │       │   ├── ic_places_car_wash.xml
│       │       │   ├── ic_places_casino.xml
│       │       │   ├── ic_places_cemetery.xml
│       │       │   ├── ic_places_church.xml
│       │       │   ├── ic_places_city_hall.xml
│       │       │   ├── ic_places_clothing_store.xml
│       │       │   ├── ic_places_convenience_store.xml
│       │       │   ├── ic_places_courthouse.xml
│       │       │   ├── ic_places_dentist.xml
│       │       │   ├── ic_places_department_store.xml
│       │       │   ├── ic_places_doctor.xml
│       │       │   ├── ic_places_electrician.xml
│       │       │   ├── ic_places_electronics_store.xml
│       │       │   ├── ic_places_embassy.xml
│       │       │   ├── ic_places_establishment.xml
│       │       │   ├── ic_places_finance.xml
│       │       │   ├── ic_places_fire_station.xml
│       │       │   ├── ic_places_florist.xml
│       │       │   ├── ic_places_food.xml
│       │       │   ├── ic_places_funeral_home.xml
│       │       │   ├── ic_places_furniture_store.xml
│       │       │   ├── ic_places_gas_station.xml
│       │       │   ├── ic_places_gym.xml
│       │       │   ├── ic_places_hair_care.xml
│       │       │   ├── ic_places_hardware_store.xml
│       │       │   ├── ic_places_health.xml
│       │       │   ├── ic_places_hindu_temple.xml
│       │       │   ├── ic_places_home_goods_store.xml
│       │       │   ├── ic_places_hospital.xml
│       │       │   ├── ic_places_insurance_agency.xml
│       │       │   ├── ic_places_jewelry_store.xml
│       │       │   ├── ic_places_laundry.xml
│       │       │   ├── ic_places_lawyer.xml
│       │       │   ├── ic_places_library.xml
│       │       │   ├── ic_places_liquor_store.xml
│       │       │   ├── ic_places_local_government_office.xml
│       │       │   ├── ic_places_locksmith.xml
│       │       │   ├── ic_places_lodging.xml
│       │       │   ├── ic_places_meal_takeaway.xml
│       │       │   ├── ic_places_mosque.xml
│       │       │   ├── ic_places_movie_rental.xml
│       │       │   ├── ic_places_movie_theater.xml
│       │       │   ├── ic_places_moving_company.xml
│       │       │   ├── ic_places_museum.xml
│       │       │   ├── ic_places_night_club.xml
│       │       │   ├── ic_places_painter.xml
│       │       │   ├── ic_places_park.xml
│       │       │   ├── ic_places_parking.xml
│       │       │   ├── ic_places_pet_store.xml
│       │       │   ├── ic_places_pharmacy.xml
│       │       │   ├── ic_places_physiotherapist.xml
│       │       │   ├── ic_places_place_of_worship.xml
│       │       │   ├── ic_places_plumber.xml
│       │       │   ├── ic_places_police.xml
│       │       │   ├── ic_places_post_office.xml
│       │       │   ├── ic_places_real_estate_agency.xml
│       │       │   ├── ic_places_restaurant.xml
│       │       │   ├── ic_places_roofing_contractor.xml
│       │       │   ├── ic_places_rv_park.xml
│       │       │   ├── ic_places_school.xml
│       │       │   ├── ic_places_shoe_store.xml
│       │       │   ├── ic_places_shopping_mall.xml
│       │       │   ├── ic_places_spa.xml
│       │       │   ├── ic_places_stadium.xml
│       │       │   ├── ic_places_storage.xml
│       │       │   ├── ic_places_store.xml
│       │       │   ├── ic_places_subway_station.xml
│       │       │   ├── ic_places_supermarket.xml
│       │       │   ├── ic_places_synagogue.xml
│       │       │   ├── ic_places_taxi_stand.xml
│       │       │   ├── ic_places_train_station.xml
│       │       │   ├── ic_places_transit_station.xml
│       │       │   ├── ic_places_travel_agency.xml
│       │       │   ├── ic_places_veterinary_care.xml
│       │       │   ├── ic_places_zoo.xml
│       │       │   ├── ic_refresh_black_24dp.xml
│       │       │   └── wrapper_places_powered_by_google.xml
│       │       ├── drawable-night/
│       │       │   └── wrapper_places_powered_by_google.xml
│       │       ├── layout/
│       │       │   ├── activity_place_picker.xml
│       │       │   ├── fragment_dialog_place_confirm.xml
│       │       │   ├── item_place.xml
│       │       │   └── places_autocomplete_impl_fragment_overlay.xml
│       │       ├── menu/
│       │       │   └── menu_place_picker.xml
│       │       ├── raw/
│       │       │   └── maps_night_style.json
│       │       ├── values/
│       │       │   ├── colors.xml
│       │       │   ├── config.xml
│       │       │   ├── dimens.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       ├── values-ar/
│       │       │   └── strings.xml
│       │       ├── values-ca/
│       │       │   └── strings.xml
│       │       ├── values-cs/
│       │       │   └── strings.xml
│       │       ├── values-de/
│       │       │   └── strings.xml
│       │       ├── values-es-rES/
│       │       │   └── strings.xml
│       │       ├── values-ko-rKR/
│       │       │   └── strings.xml
│       │       ├── values-pt/
│       │       │   └── strings.xml
│       │       ├── values-tr/
│       │       │   └── strings.xml
│       │       ├── values-v21/
│       │       │   └── styles.xml
│       │       ├── values-w600dp/
│       │       │   └── config.xml
│       │       └── values-zh-rTW/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── rtchagas/
│                       └── pingplacepicker/
│                           └── ExampleUnitTest.java
├── sample/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── rtchagas/
│       │   │           └── pingsample/
│       │   │               └── MainActivity.kt
│       │   └── res/
│       │       ├── drawable/
│       │       │   └── ic_launcher_background.xml
│       │       ├── drawable-v24/
│       │       │   └── ic_launcher_foreground.xml
│       │       ├── layout/
│       │       │   └── activity_main.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       ├── values/
│       │       │   ├── colors.xml
│       │       │   ├── keys.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       └── values-night/
│       │           └── colors.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── rtchagas/
│                       └── pingsample/
│                           └── ExampleUnitTest.kt
└── settings.gradle
Download .txt
SYMBOL INDEX (2 symbols across 1 files)

FILE: library/src/test/java/com/rtchagas/pingplacepicker/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test
Condensed preview — 189 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (269K chars).
[
  {
    "path": ".gitignore",
    "chars": 915,
    "preview": "# Built application files\n*.apk\n*.ap_\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated file"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 12098,
    "preview": "# PING - Because Ping Is Not Google's Place Picker 😉\n[![](https://jitpack.io/v/rtchagas/pingplacepicker.svg)](https://ji"
  },
  {
    "path": "build.gradle",
    "chars": 629,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    e"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Sun Nov 15 15:01:33 CET 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "gradle.properties",
    "chars": 193,
    "preview": "android.enableJetifier=true\nandroid.useAndroidX=true\norg.gradle.jvmargs=-Xmx2512m\nandroid.defaults.buildfeatures.buildco"
  },
  {
    "path": "gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "gradlew.bat",
    "chars": 2260,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "jitpack.yml",
    "chars": 15,
    "preview": "jdk: openjdk17\n"
  },
  {
    "path": "library/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "library/build.gradle",
    "chars": 3421,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\napply plugin: 'kotlin-par"
  },
  {
    "path": "library/consumer-rules.pro",
    "chars": 4111,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "library/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "library/src/main/AndroidManifest.xml",
    "chars": 999,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/Config.kt",
    "chars": 1824,
    "preview": "package com.rtchagas.pingplacepicker\n\ninternal object Config {\n\n    const val PLACE_IMG_WIDTH = 640\n    const val PLACE_"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/PingPlacePicker.kt",
    "chars": 3878,
    "preview": "package com.rtchagas.pingplacepicker\n\nimport android.app.Activity\nimport android.content.Intent\nimport com.google.androi"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/helper/PermissionsHelper.kt",
    "chars": 1325,
    "preview": "package com.rtchagas.pingplacepicker.helper\n\nimport android.Manifest\nimport android.app.Activity\nimport com.karumi.dexte"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/helper/UrlSignerHelper.kt",
    "chars": 2089,
    "preview": "package com.rtchagas.pingplacepicker.helper\n\nimport android.util.Base64\nimport android.util.Log\n\nimport java.net.Malform"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/inject/PingKoinComponent.kt",
    "chars": 1043,
    "preview": "package com.rtchagas.pingplacepicker.inject\n\nimport android.content.Context\nimport com.rtchagas.pingplacepicker.BuildCon"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/inject/RepositoryModule.kt",
    "chars": 1682,
    "preview": "package com.rtchagas.pingplacepicker.inject\n\nimport com.google.android.libraries.places.api.Places\nimport com.rtchagas.p"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/inject/ViewModelModule.kt",
    "chars": 406,
    "preview": "package com.rtchagas.pingplacepicker.inject\n\nimport com.rtchagas.pingplacepicker.viewmodel.PlaceConfirmDialogViewModel\ni"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/model/Geometry.kt",
    "chars": 236,
    "preview": "package com.rtchagas.pingplacepicker.model\n\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonCl"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/model/Location.kt",
    "chars": 269,
    "preview": "package com.rtchagas.pingplacepicker.model\n\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonCl"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/model/Photo.kt",
    "chars": 416,
    "preview": "package com.rtchagas.pingplacepicker.model\n\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonCl"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/model/SearchResult.kt",
    "chars": 211,
    "preview": "package com.rtchagas.pingplacepicker.model\n\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ninte"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/model/SimplePlace.kt",
    "chars": 621,
    "preview": "package com.rtchagas.pingplacepicker.model\n\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonCl"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/repository/PlaceRepository.kt",
    "chars": 818,
    "preview": "package com.rtchagas.pingplacepicker.repository\n\nimport android.graphics.Bitmap\nimport com.google.android.gms.maps.model"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/CustomPlace.kt",
    "chars": 3914,
    "preview": "package com.rtchagas.pingplacepicker.repository.googlemaps\n\nimport android.net.Uri\nimport com.google.android.gms.maps.mo"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/GoogleMapsAPI.kt",
    "chars": 748,
    "preview": "package com.rtchagas.pingplacepicker.repository.googlemaps\n\nimport com.rtchagas.pingplacepicker.model.SearchResult\nimpor"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/GoogleMapsRepository.kt",
    "chars": 6884,
    "preview": "package com.rtchagas.pingplacepicker.repository.googlemaps\n\nimport android.annotation.SuppressLint\nimport android.graphi"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/repository/googlemaps/PlaceFromCoordinates.kt",
    "chars": 6096,
    "preview": "package com.rtchagas.pingplacepicker.repository.googlemaps\n\nimport android.location.Location\nimport android.net.Uri\nimpo"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/ui/UiExtensions.kt",
    "chars": 1063,
    "preview": "package com.rtchagas.pingplacepicker.ui\n\nimport android.content.Context\nimport android.view.View\nimport android.widget.T"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/ui/UiUtils.kt",
    "chars": 1581,
    "preview": "package com.rtchagas.pingplacepicker.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport an"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/ui/activity/BaseActivity.kt",
    "chars": 936,
    "preview": "package com.rtchagas.pingplacepicker.ui.activity\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport and"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/ui/activity/PlacePickerActivity.kt",
    "chars": 20468,
    "preview": "package com.rtchagas.pingplacepicker.ui.activity\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimp"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/ui/adapter/PlacePickerAdapter.kt",
    "chars": 1609,
    "preview": "package com.rtchagas.pingplacepicker.ui.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/ui/fragment/PlaceConfirmDialogFragment.kt",
    "chars": 5761,
    "preview": "package com.rtchagas.pingplacepicker.ui.fragment\n\nimport android.app.Dialog\nimport android.content.Context\nimport androi"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/BaseViewModel.kt",
    "chars": 663,
    "preview": "package com.rtchagas.pingplacepicker.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport io.reactivex.disposables.Comp"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/PlaceConfirmDialogViewModel.kt",
    "chars": 1563,
    "preview": "package com.rtchagas.pingplacepicker.viewmodel\n\nimport android.graphics.Bitmap\nimport androidx.lifecycle.LiveData\nimport"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/PlacePickerViewModel.kt",
    "chars": 2650,
    "preview": "package com.rtchagas.pingplacepicker.viewmodel\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLive"
  },
  {
    "path": "library/src/main/java/com/rtchagas/pingplacepicker/viewmodel/Resource.kt",
    "chars": 872,
    "preview": "package com.rtchagas.pingplacepicker.viewmodel\n\n/**\n * Resource holder provided to the UI\n */\ninternal class Resource<T>"
  },
  {
    "path": "library/src/main/res/drawable/bg_button_round.xml",
    "chars": 587,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item"
  },
  {
    "path": "library/src/main/res/drawable/ic_arrow_back_black_24dp.xml",
    "chars": 340,
    "preview": "<vector android:autoMirrored=\"true\" android:height=\"24dp\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\""
  },
  {
    "path": "library/src/main/res/drawable/ic_close_black_24dp.xml",
    "chars": 391,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_crosshairs_gps_black_24dp.xml",
    "chars": 618,
    "preview": "<!-- drawable/crosshairs_gps.xml -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:"
  },
  {
    "path": "library/src/main/res/drawable/ic_magnify_black_24dp.xml",
    "chars": 604,
    "preview": "<!-- drawable/ic_magnify_black_24dpify_black_24dp.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/and"
  },
  {
    "path": "library/src/main/res/drawable/ic_magnify_toolbar_menu_24dp.xml",
    "chars": 570,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n  "
  },
  {
    "path": "library/src/main/res/drawable/ic_map_marker_black_24dp.xml",
    "chars": 494,
    "preview": "<!-- drawable/ic_map_marker_black_24dp.xml -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      "
  },
  {
    "path": "library/src/main/res/drawable/ic_map_marker_radius_black_24dp.xml",
    "chars": 724,
    "preview": "<!-- drawable/map_marker_radius.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        and"
  },
  {
    "path": "library/src/main/res/drawable/ic_map_marker_select_red_48dp.xml",
    "chars": 1234,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n  "
  },
  {
    "path": "library/src/main/res/drawable/ic_map_marker_solid_red_32dp.xml",
    "chars": 759,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"32dp\"\n        android:height=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_accounting.xml",
    "chars": 505,
    "preview": "<!-- drawable/cash_multiple.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_airport.xml",
    "chars": 448,
    "preview": "<!-- drawable/airplane.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_amusement_park.xml",
    "chars": 520,
    "preview": "<!-- drawable/human_handsup.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_aquarium.xml",
    "chars": 791,
    "preview": "<!-- drawable/fish.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"2"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_art_gallery.xml",
    "chars": 1372,
    "preview": "<!-- drawable/drama_masks.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_atm.xml",
    "chars": 542,
    "preview": "<!-- drawable/cash_usd.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_bakery.xml",
    "chars": 605,
    "preview": "<!-- drawable/cupcake.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_bank.xml",
    "chars": 393,
    "preview": "<!-- drawable/bank.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"2"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_bar.xml",
    "chars": 394,
    "preview": "<!-- drawable/glass_cocktail.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_beauty_salon.xml",
    "chars": 834,
    "preview": "<!-- drawable/content_cut.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_bicycle_store.xml",
    "chars": 919,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_book_store.xml",
    "chars": 785,
    "preview": "<!-- drawable/book_open_page_variant.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n      "
  },
  {
    "path": "library/src/main/res/drawable/ic_places_bowling_alley.xml",
    "chars": 686,
    "preview": "<!-- drawable/bowling.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_bus_station.xml",
    "chars": 702,
    "preview": "<!-- drawable/bus.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"24"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_cafe.xml",
    "chars": 432,
    "preview": "<!-- drawable/coffee.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_campground.xml",
    "chars": 599,
    "preview": "<!-- drawable/basecamp.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_car_dealer.xml",
    "chars": 688,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_car_rental.xml",
    "chars": 688,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_car_repair.xml",
    "chars": 525,
    "preview": "<!-- drawable/wrench.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_car_wash.xml",
    "chars": 957,
    "preview": "<!-- drawable/car_wash.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_casino.xml",
    "chars": 834,
    "preview": "<!-- drawable/cards_playing_outline.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n       "
  },
  {
    "path": "library/src/main/res/drawable/ic_places_cemetery.xml",
    "chars": 515,
    "preview": "<!-- drawable/grave_stone.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_church.xml",
    "chars": 485,
    "preview": "<!-- drawable/church.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_city_hall.xml",
    "chars": 572,
    "preview": "<!-- drawable/city_variant.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_clothing_store.xml",
    "chars": 755,
    "preview": "<!-- drawable/hanger.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_convenience_store.xml",
    "chars": 425,
    "preview": "<!-- drawable/store_24_hour.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_courthouse.xml",
    "chars": 940,
    "preview": "<!-- drawable/gavel.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_dentist.xml",
    "chars": 491,
    "preview": "<!-- drawable/tooth.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_department_store.xml",
    "chars": 393,
    "preview": "<!-- drawable/store.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_doctor.xml",
    "chars": 570,
    "preview": "<!-- drawable/doctor.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_electrician.xml",
    "chars": 403,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_electronics_store.xml",
    "chars": 661,
    "preview": "<!-- drawable/television_classic.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        an"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_embassy.xml",
    "chars": 396,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_establishment.xml",
    "chars": 456,
    "preview": "<!-- drawable/home_city.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:wid"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_finance.xml",
    "chars": 666,
    "preview": "<!-- drawable/currency_usd.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_fire_station.xml",
    "chars": 827,
    "preview": "<!-- drawable/fire_truck.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:wi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_florist.xml",
    "chars": 1054,
    "preview": "<!-- drawable/flower.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_food.xml",
    "chars": 553,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_funeral_home.xml",
    "chars": 600,
    "preview": "<!-- drawable/skull.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_furniture_store.xml",
    "chars": 539,
    "preview": "<!-- drawable/sofa.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"2"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_gas_station.xml",
    "chars": 745,
    "preview": "<!-- drawable/gas_station.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_gym.xml",
    "chars": 1134,
    "preview": "<!-- drawable/dumbbell.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_hair_care.xml",
    "chars": 834,
    "preview": "<!-- drawable/content_cut.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_hardware_store.xml",
    "chars": 508,
    "preview": "<!-- drawable/hammer.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_health.xml",
    "chars": 789,
    "preview": "<!-- drawable/heart_pulse.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_hindu_temple.xml",
    "chars": 661,
    "preview": "<!-- drawable/hinduism.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_home_goods_store.xml",
    "chars": 368,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_hospital.xml",
    "chars": 442,
    "preview": "<!-- drawable/hospital.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_insurance_agency.xml",
    "chars": 437,
    "preview": "<!-- drawable/shield_home.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_jewelry_store.xml",
    "chars": 436,
    "preview": "<!-- drawable/diamond_stone.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_laundry.xml",
    "chars": 688,
    "preview": "<!-- drawable/washing_machine.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        andro"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_lawyer.xml",
    "chars": 709,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_library.xml",
    "chars": 498,
    "preview": "<!-- drawable/library.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_liquor_store.xml",
    "chars": 642,
    "preview": "<!-- drawable/glass_wine.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_local_government_office.xml",
    "chars": 505,
    "preview": "<!-- drawable/domain.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_locksmith.xml",
    "chars": 518,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_lodging.xml",
    "chars": 437,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_meal_takeaway.xml",
    "chars": 993,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_mosque.xml",
    "chars": 556,
    "preview": "<!-- drawable/islam.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_movie_rental.xml",
    "chars": 454,
    "preview": "<!-- drawable/filmstrip.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:wid"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_movie_theater.xml",
    "chars": 717,
    "preview": "<!-- drawable/video_vintage.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_moving_company.xml",
    "chars": 669,
    "preview": "<!-- drawable/truck_delivery.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_museum.xml",
    "chars": 393,
    "preview": "<!-- drawable/bank.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"2"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_night_club.xml",
    "chars": 394,
    "preview": "<!-- drawable/glass_cocktail.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_painter.xml",
    "chars": 456,
    "preview": "<!-- drawable/format_paint.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_park.xml",
    "chars": 611,
    "preview": "<!-- drawable/nature_people.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_parking.xml",
    "chars": 428,
    "preview": "<!-- drawable/parking.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_pet_store.xml",
    "chars": 1095,
    "preview": "<!-- drawable/paw.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"24"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_pharmacy.xml",
    "chars": 431,
    "preview": "<!-- drawable/pharmacy.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_physiotherapist.xml",
    "chars": 545,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_place_of_worship.xml",
    "chars": 2354,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_plumber.xml",
    "chars": 526,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_police.xml",
    "chars": 566,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_post_office.xml",
    "chars": 430,
    "preview": "<!-- drawable/email.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_real_estate_agency.xml",
    "chars": 456,
    "preview": "<!-- drawable/home_city.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:wid"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_restaurant.xml",
    "chars": 474,
    "preview": "<!-- drawable/silverware_fork_knife.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n       "
  },
  {
    "path": "library/src/main/res/drawable/ic_places_roofing_contractor.xml",
    "chars": 393,
    "preview": "<!-- drawable/store.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_rv_park.xml",
    "chars": 2318,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_school.xml",
    "chars": 400,
    "preview": "<!-- drawable/school.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width="
  },
  {
    "path": "library/src/main/res/drawable/ic_places_shoe_store.xml",
    "chars": 446,
    "preview": "<!-- drawable/shoe_formal.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:w"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_shopping_mall.xml",
    "chars": 546,
    "preview": "<!-- drawable/shopping.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_spa.xml",
    "chars": 560,
    "preview": "<!-- drawable/spa.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"24"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_stadium.xml",
    "chars": 749,
    "preview": "<!-- drawable/stadium.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_storage.xml",
    "chars": 947,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_store.xml",
    "chars": 393,
    "preview": "<!-- drawable/store.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_subway_station.xml",
    "chars": 659,
    "preview": "<!-- drawable/subway_variant.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        androi"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_supermarket.xml",
    "chars": 720,
    "preview": "<!-- drawable/cart.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"2"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_synagogue.xml",
    "chars": 607,
    "preview": "<!-- drawable/judaism.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_taxi_stand.xml",
    "chars": 694,
    "preview": "<!-- drawable/taxi.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\"2"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_train_station.xml",
    "chars": 676,
    "preview": "<!-- drawable/train.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_transit_station.xml",
    "chars": 710,
    "preview": "<!-- drawable/transit_transfer.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        andr"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_travel_agency.xml",
    "chars": 706,
    "preview": "<!-- drawable/beach.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:width=\""
  },
  {
    "path": "library/src/main/res/drawable/ic_places_veterinary_care.xml",
    "chars": 422,
    "preview": "<!-- drawable/dog_side.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_places_zoo.xml",
    "chars": 534,
    "preview": "<!-- drawable/elephant.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:widt"
  },
  {
    "path": "library/src/main/res/drawable/ic_refresh_black_24dp.xml",
    "chars": 496,
    "preview": "<!-- drawable/refresh.xml -->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:height=\"2"
  },
  {
    "path": "library/src/main/res/drawable/wrapper_places_powered_by_google.xml",
    "chars": 197,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "library/src/main/res/drawable-night/wrapper_places_powered_by_google.xml",
    "chars": 196,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "library/src/main/res/layout/activity_place_picker.xml",
    "chars": 9829,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schema"
  },
  {
    "path": "library/src/main/res/layout/fragment_dialog_place_confirm.xml",
    "chars": 3112,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
  },
  {
    "path": "library/src/main/res/layout/item_place.xml",
    "chars": 3056,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
  },
  {
    "path": "library/src/main/res/layout/places_autocomplete_impl_fragment_overlay.xml",
    "chars": 5848,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "library/src/main/res/menu/menu_place_picker.xml",
    "chars": 369,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"h"
  },
  {
    "path": "library/src/main/res/raw/maps_night_style.json",
    "chars": 2480,
    "preview": "[\n  {\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#242f3e\"\n      }\n    ]\n  },\n  {\n    \"ele"
  },
  {
    "path": "library/src/main/res/values/colors.xml",
    "chars": 1517,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"colorPrimary\">@color/material_bluegrey500</color>\n "
  },
  {
    "path": "library/src/main/res/values/config.xml",
    "chars": 1172,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!--\n        Use /nearbysearch from Places Web API instead of fi"
  },
  {
    "path": "library/src/main/res/values/dimens.xml",
    "chars": 911,
    "preview": "<resources>\n\n    <dimen name=\"icon_size_small\">24dp</dimen>\n    <dimen name=\"icon_size_medium\">32dp</dimen>\n    <dimen n"
  },
  {
    "path": "library/src/main/res/values/strings.xml",
    "chars": 1130,
    "preview": "<resources>\n    <string name=\"app_name\" translatable=\"false\">Ping Place Picker</string>\n\n    <string name=\"picker_title\""
  },
  {
    "path": "library/src/main/res/values/styles.xml",
    "chars": 3149,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"PingThemeBase\""
  },
  {
    "path": "library/src/main/res/values-ar/strings.xml",
    "chars": 956,
    "preview": "<resources>\n<string name=\"picker_title\">اختر موقع</string>\n<string name=\"picker_select_this\">اختيار هذا الموقع</string>\n"
  },
  {
    "path": "library/src/main/res/values-ca/strings.xml",
    "chars": 1091,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"picker_title\">Tria una ubicació</string>\n    <strin"
  },
  {
    "path": "library/src/main/res/values-cs/strings.xml",
    "chars": 1046,
    "preview": "<resources>\n    <string name=\"picker_title\">Vyberte místo</string>\n    <string name=\"picker_select_this\">Vybrat toto umí"
  },
  {
    "path": "library/src/main/res/values-de/strings.xml",
    "chars": 1075,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"picker_title\">Einen Ort auswählen</string>\n    <str"
  },
  {
    "path": "library/src/main/res/values-es-rES/strings.xml",
    "chars": 1100,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"picker_title\">Escoge una ubicación</string>\n    <st"
  },
  {
    "path": "library/src/main/res/values-ko-rKR/strings.xml",
    "chars": 915,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"picker_title\">위치 선택</string>\n    <string name=\"pick"
  },
  {
    "path": "library/src/main/res/values-pt/strings.xml",
    "chars": 1087,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"description_place_image\">\"Imagem do local \"</string"
  },
  {
    "path": "library/src/main/res/values-tr/strings.xml",
    "chars": 1074,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"picker_title\">Select a location</string>\n    <stri"
  },
  {
    "path": "library/src/main/res/values-v21/styles.xml",
    "chars": 622,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"PingTheme.NoStatus\">\n        <item name=\"android:wi"
  },
  {
    "path": "library/src/main/res/values-w600dp/config.xml",
    "chars": 110,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"show_card_search\">false</bool>\n</resources>"
  },
  {
    "path": "library/src/main/res/values-zh-rTW/strings.xml",
    "chars": 911,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"picker_title\">選擇附近的地點</string>\n    <string name=\"p"
  },
  {
    "path": "library/src/test/java/com/rtchagas/pingplacepicker/ExampleUnitTest.java",
    "chars": 389,
    "preview": "package com.rtchagas.pingplacepicker;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local u"
  },
  {
    "path": "sample/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "sample/build.gradle",
    "chars": 1326,
    "preview": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\n\nandroid {\n\n    namespace 'com.rtchagas.pingsampl"
  },
  {
    "path": "sample/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "sample/src/main/AndroidManifest.xml",
    "chars": 968,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "sample/src/main/java/com/rtchagas/pingsample/MainActivity.kt",
    "chars": 1525,
    "preview": "package com.rtchagas.pingsample\n\nimport android.os.Bundle\nimport com.google.android.gms.maps.model.LatLng\nimport com.goo"
  },
  {
    "path": "sample/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5577,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    androi"
  },
  {
    "path": "sample/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1897,
    "preview": "<vector xmlns:aapt=\"http://schemas.android.com/aapt\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
  },
  {
    "path": "sample/src/main/res/layout/activity_main.xml",
    "chars": 1436,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
  },
  {
    "path": "sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "sample/src/main/res/values/colors.xml",
    "chars": 1045,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"colorPrimary\">@color/material_teal500</color>\n    <"
  },
  {
    "path": "sample/src/main/res/values/keys.xml",
    "chars": 295,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- TODO: Move to Firebase remote configs -->\n    <string name="
  },
  {
    "path": "sample/src/main/res/values/strings.xml",
    "chars": 162,
    "preview": "<resources>\n    <string name=\"app_name\" translatable=\"false\">Ping Sample</string>\n    <string name=\"show_picker\" transla"
  },
  {
    "path": "sample/src/main/res/values/styles.xml",
    "chars": 1599,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.DayNight.N"
  },
  {
    "path": "sample/src/main/res/values-night/colors.xml",
    "chars": 1021,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"colorPrimary\">@color/material_teal300</color>\n    <"
  },
  {
    "path": "sample/src/test/java/com/rtchagas/pingsample/ExampleUnitTest.kt",
    "chars": 348,
    "preview": "package com.rtchagas.pingsample\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which"
  },
  {
    "path": "settings.gradle",
    "chars": 117,
    "preview": "plugins {\n    id 'org.gradle.toolchains.foojay-resolver-convention' version '0.6.0'\n}\n\ninclude ':library', ':sample'\n"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the rtchagas/pingplacepicker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 189 files (235.9 KB), approximately 80.7k tokens, and a symbol index with 2 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!