├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── fabric.properties ├── google-services.json ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── guideapp │ │ ├── data │ │ ├── TestGuideContentProvider.java │ │ └── TestUtilities.java │ │ └── utils │ │ └── PollingCheck.java │ └── main │ ├── AndroidManifest.xml │ ├── ic_clear_gray-web.png │ ├── java │ └── com │ │ └── guideapp │ │ ├── App.kt │ │ ├── data │ │ ├── local │ │ │ ├── GuideContract.kt │ │ │ ├── GuideDbHelper.kt │ │ │ └── GuideProvider.kt │ │ └── remote │ │ │ ├── GuideApi.kt │ │ │ └── RestClient.kt │ │ ├── model │ │ ├── Local.kt │ │ ├── MainMenu.kt │ │ ├── SubCategory.kt │ │ └── wrapper │ │ │ └── ListResponse.kt │ │ ├── sync │ │ ├── GuideFirebaseJobService.kt │ │ ├── GuideSyncIntentService.kt │ │ ├── GuideSyncTask.java │ │ └── GuideSyncUtils.java │ │ ├── ui │ │ ├── views │ │ │ ├── BaseActivity.kt │ │ │ ├── DividerItemDecoration.kt │ │ │ ├── GridSpacingItemDecoration.kt │ │ │ ├── favorite │ │ │ │ ├── FavoriteAdapter.kt │ │ │ │ ├── FavoriteContract.kt │ │ │ │ ├── FavoriteFragment.kt │ │ │ │ └── FavoritePresenter.kt │ │ │ ├── local │ │ │ │ ├── LocalActivity.kt │ │ │ │ ├── LocalAdapter.kt │ │ │ │ ├── LocalContract.kt │ │ │ │ └── LocalPresenter.kt │ │ │ ├── localdetail │ │ │ │ ├── LocalDetailActivity.kt │ │ │ │ ├── LocalDetailContract.kt │ │ │ │ ├── LocalDetailFragment.kt │ │ │ │ └── LocalDetailPresenter.kt │ │ │ ├── main │ │ │ │ └── MainActivity.kt │ │ │ ├── map │ │ │ │ ├── MapActivity.kt │ │ │ │ ├── MapContract.kt │ │ │ │ ├── MapFragment.kt │ │ │ │ └── MapPresenter.kt │ │ │ └── menu │ │ │ │ ├── MenuAdapter.kt │ │ │ │ └── MenuFragment.kt │ │ └── widget │ │ │ ├── LocalFavoriteWidget.kt │ │ │ └── LocalFavoriteWidgetRemoteViewsService.kt │ │ └── utilities │ │ ├── Constants.kt │ │ ├── DataUtil.kt │ │ ├── Extensions.kt │ │ ├── Utility.kt │ │ └── ViewUtil.kt │ └── res │ ├── drawable-hdpi │ ├── gruta.jpg │ ├── ic_apps_black_24dp.png │ ├── ic_apps_grey_400_24dp.png │ ├── ic_apps_grey_72_24dp.png │ ├── ic_apps_white_24dp.png │ ├── ic_bookmark_black_24dp.png │ ├── ic_bookmark_border_white_24dp.png │ ├── ic_bookmark_grey_400_24dp.png │ ├── ic_bookmark_white_24dp.png │ ├── ic_call_grey_72_24dp.png │ ├── ic_directions_grey_72_24dp.png │ ├── ic_info_grey_72_24dp.png │ ├── ic_language_grey_72_24dp.png │ ├── ic_local_dining_white_24dp.png │ ├── ic_local_dining_white_36dp.png │ ├── ic_local_hotel_white_36dp.png │ ├── ic_location_on_black_24dp.png │ ├── ic_location_on_grey_72_24dp.png │ ├── ic_map_white_36dp.png │ ├── ic_public_grey_72_24dp.png │ ├── ic_restart_white_36dp.png │ ├── ic_share_white_24dp.png │ └── ic_terrain_white_36dp.png │ ├── drawable-mdpi │ ├── ic_apps_black_24dp.png │ ├── ic_apps_grey_400_24dp.png │ ├── ic_apps_grey_72_24dp.png │ ├── ic_apps_white_24dp.png │ ├── ic_bookmark_black_24dp.png │ ├── ic_bookmark_border_white_24dp.png │ ├── ic_bookmark_grey_400_24dp.png │ ├── ic_bookmark_white_24dp.png │ ├── ic_call_grey_72_24dp.png │ ├── ic_directions_grey_72_24dp.png │ ├── ic_info_grey_72_24dp.png │ ├── ic_language_grey_72_24dp.png │ ├── ic_local_dining_white_24dp.png │ ├── ic_local_dining_white_36dp.png │ ├── ic_local_hotel_white_36dp.png │ ├── ic_location_on_black_24dp.png │ ├── ic_location_on_grey_72_24dp.png │ ├── ic_map_white_36dp.png │ ├── ic_public_grey_72_24dp.png │ ├── ic_restart_white_36dp.png │ ├── ic_share_white_24dp.png │ └── ic_terrain_white_36dp.png │ ├── drawable-nodpi │ └── appwidget_preview.png │ ├── drawable-xhdpi │ ├── ic_apps_black_24dp.png │ ├── ic_apps_grey_400_24dp.png │ ├── ic_apps_grey_72_24dp.png │ ├── ic_apps_white_24dp.png │ ├── ic_bookmark_black_24dp.png │ ├── ic_bookmark_border_white_24dp.png │ ├── ic_bookmark_grey_400_24dp.png │ ├── ic_bookmark_white_24dp.png │ ├── ic_call_grey_72_24dp.png │ ├── ic_directions_grey_72_24dp.png │ ├── ic_info_grey_72_24dp.png │ ├── ic_language_grey_72_24dp.png │ ├── ic_local_dining_white_24dp.png │ ├── ic_local_dining_white_36dp.png │ ├── ic_local_hotel_white_36dp.png │ ├── ic_location_on_black_24dp.png │ ├── ic_location_on_grey_72_24dp.png │ ├── ic_map_white_36dp.png │ ├── ic_public_grey_72_24dp.png │ ├── ic_restart_white_36dp.png │ ├── ic_share_white_24dp.png │ └── ic_terrain_white_36dp.png │ ├── drawable-xxhdpi │ ├── ic_apps_black_24dp.png │ ├── ic_apps_grey_400_24dp.png │ ├── ic_apps_grey_72_24dp.png │ ├── ic_apps_white_24dp.png │ ├── ic_bookmark_black_24dp.png │ ├── ic_bookmark_border_white_24dp.png │ ├── ic_bookmark_grey_400_24dp.png │ ├── ic_bookmark_white_24dp.png │ ├── ic_call_grey_72_24dp.png │ ├── ic_directions_grey_72_24dp.png │ ├── ic_info_grey_72_24dp.png │ ├── ic_language_grey_72_24dp.png │ ├── ic_local_dining_white_24dp.png │ ├── ic_local_dining_white_36dp.png │ ├── ic_local_hotel_white_36dp.png │ ├── ic_location_on_black_24dp.png │ ├── ic_location_on_grey_72_24dp.png │ ├── ic_map_white_36dp.png │ ├── ic_public_grey_72_24dp.png │ ├── ic_restart_white_36dp.png │ ├── ic_share_white_24dp.png │ └── ic_terrain_white_36dp.png │ ├── drawable-xxxhdpi │ ├── ic_apps_black_24dp.png │ ├── ic_apps_grey_400_24dp.png │ ├── ic_apps_grey_72_24dp.png │ ├── ic_apps_white_24dp.png │ ├── ic_bookmark_black_24dp.png │ ├── ic_bookmark_border_white_24dp.png │ ├── ic_bookmark_grey_400_24dp.png │ ├── ic_bookmark_white_24dp.png │ ├── ic_call_grey_72_24dp.png │ ├── ic_directions_grey_72_24dp.png │ ├── ic_info_grey_72_24dp.png │ ├── ic_language_grey_72_24dp.png │ ├── ic_local_dining_white_36dp.png │ ├── ic_local_hotel_white_36dp.png │ ├── ic_location_on_grey_72_24dp.png │ ├── ic_map_white_36dp.png │ ├── ic_place_dining_48dp.png │ ├── ic_place_hotel_48dp.png │ ├── ic_place_terrain_48dp.png │ ├── ic_public_grey_72_24dp.png │ ├── ic_share_white_24dp.png │ └── ic_terrain_white_36dp.png │ ├── drawable │ ├── action_background.xml │ └── action_background_bottom.xml │ ├── layout │ ├── activity_local.xml │ ├── activity_local_detail.xml │ ├── activity_main.xml │ ├── activity_map.xml │ ├── fragment_favorite.xml │ ├── fragment_local.xml │ ├── fragment_local_detail.xml │ ├── fragment_map.xml │ ├── fragment_menu.xml │ ├── item_local.xml │ ├── item_local_detail.xml │ ├── item_local_favorite.xml │ ├── item_local_map.xml │ ├── item_menu.xml │ ├── toolbar_transparent.xml │ ├── widget_detail.xml │ └── widget_detail_list_item.xml │ ├── menu │ └── menu_detail.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── transition-v21 │ ├── details_window_enter_transition.xml │ └── details_window_return_transition.xml │ ├── values-v21 │ └── styles.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── local_favorite_widget_info.xml ├── backend ├── build.gradle └── src │ └── main │ ├── java │ └── com │ │ └── guideapp │ │ └── backend │ │ ├── dao │ │ ├── category │ │ │ ├── CategoryDAO.java │ │ │ └── CategoryDAOImpl.java │ │ ├── city │ │ │ ├── CityDAO.java │ │ │ └── CityDAOImpl.java │ │ ├── generic │ │ │ ├── IGenericDAO.java │ │ │ └── ObjectifyGenericDAO.java │ │ ├── local │ │ │ ├── LocalDAO.java │ │ │ └── LocalDAOImpl.java │ │ └── subcategory │ │ │ ├── SubCategoryDAO.java │ │ │ └── SubCategoryDAOImpl.java │ │ ├── entity │ │ ├── Category.java │ │ ├── City.java │ │ ├── Local.java │ │ └── SubCategory.java │ │ ├── service │ │ ├── category │ │ │ ├── CategoryService.java │ │ │ └── CategoryServiceImpl.java │ │ ├── city │ │ │ ├── CityService.java │ │ │ └── CityServiceImpl.java │ │ ├── local │ │ │ ├── LocalService.java │ │ │ └── LocalServiceImpl.java │ │ └── subcategory │ │ │ ├── SubCategoryService.java │ │ │ └── SubCategoryServiceImpl.java │ │ ├── spi │ │ └── GuideAppEndpoint.java │ │ └── util │ │ ├── Constants.java │ │ ├── MemcacheUtil.java │ │ ├── OfyService.java │ │ ├── StringUtil.java │ │ └── ValidationUtil.java │ ├── web-angular │ ├── .bowerrc │ ├── .editorconfig │ ├── .gitattributes │ ├── .jscsrc │ ├── .jshintrc │ ├── .yo-rc.json │ ├── Archive.zip │ ├── Gruntfile.js │ ├── README.md │ ├── app │ │ ├── 404.html │ │ ├── favicon.ico │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ ├── fontawesome-webfont.woff2 │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ ├── image │ │ │ ├── ring-alt.gif │ │ │ └── yeoman.png │ │ ├── index.html │ │ ├── robots.txt │ │ ├── scripts │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── about.js │ │ │ │ ├── categories.js │ │ │ │ ├── category-new-edit.js │ │ │ │ ├── cities.js │ │ │ │ ├── city-new-edit.js │ │ │ │ ├── local-new-edit.js │ │ │ │ ├── locals.js │ │ │ │ ├── login.js │ │ │ │ ├── main.js │ │ │ │ ├── sub-categories.js │ │ │ │ └── sub-category-new-edit.js │ │ │ └── jqBootstrapValidation.js │ │ ├── styles │ │ │ ├── app.css │ │ │ └── main.css │ │ └── views │ │ │ ├── about.html │ │ │ ├── categories.html │ │ │ ├── category-new-edit.html │ │ │ ├── cities.html │ │ │ ├── city-new-edit.html │ │ │ ├── local-new-edit.html │ │ │ ├── locals.html │ │ │ ├── login.html │ │ │ ├── main.html │ │ │ ├── sub-categories.html │ │ │ └── sub-category-new-edit.html │ ├── bower.json │ ├── old │ │ ├── bower.json │ │ ├── dist2 │ │ │ ├── css │ │ │ │ ├── cities.css │ │ │ │ ├── default.css │ │ │ │ ├── index.css │ │ │ │ ├── locals.css │ │ │ │ └── timeline.css │ │ │ ├── image │ │ │ │ └── ring-alt.gif │ │ │ ├── jqBootstrapValidation.js │ │ │ └── js │ │ │ │ ├── categories.js │ │ │ │ ├── cities.js │ │ │ │ ├── default.js │ │ │ │ ├── index.js │ │ │ │ ├── jqBootstrapValidation.js │ │ │ │ ├── locals.js │ │ │ │ └── subcategories.js │ │ ├── index.html │ │ ├── js │ │ │ ├── flot-data.js │ │ │ └── morris-data.js │ │ └── pages │ │ │ ├── categories.html │ │ │ ├── cities.html │ │ │ ├── index.html │ │ │ ├── locals.html │ │ │ ├── login.html │ │ │ └── subcategories.html │ ├── package.json │ └── test │ │ ├── .jshintrc │ │ ├── karma.conf.js │ │ └── spec │ │ └── controllers │ │ ├── about.js │ │ ├── categories.js │ │ ├── category-new-edit.js │ │ ├── cities.js │ │ ├── citynewedit.js │ │ ├── local-new-edit.js │ │ ├── locals.js │ │ ├── login.js │ │ ├── main.js │ │ ├── sub-categories.js │ │ └── sub-category-new-edit.js │ └── webapp │ ├── WEB-INF │ ├── appengine-web.xml │ ├── logging.properties │ └── web.xml │ ├── adm │ ├── 404.html │ ├── favicon.ico │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── fontawesome-webfont.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── index.html │ ├── robots.txt │ ├── scripts │ │ ├── scripts.174395d2.js │ │ └── vendor.b02f685d.js │ └── styles │ │ ├── main.39c68f56.css │ │ └── vendor.9f8805c4.css │ └── index.html ├── build.gradle ├── config └── quality │ ├── checkstyle │ └── checkstyle-config.xml │ ├── findbugs │ └── android-exclude-filter.xml │ ├── pmd │ └── pmd-ruleset.xml │ └── quality.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── backend.png ├── mvp.png └── screenshot_00.png ├── key └── app.jks └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | *.tmp 5 | *.sass-cache 6 | bower_components/ 7 | 8 | # Created by https://www.gitignore.io 9 | 10 | ### Android ### 11 | # Built application files 12 | *.apk 13 | *.ap_ 14 | 15 | # Files for the Dalvik VM 16 | *.dex 17 | 18 | # Java class files 19 | *.class 20 | 21 | # Generated files 22 | bin/ 23 | gen/ 24 | 25 | # Gradle files 26 | .gradle/ 27 | build/ 28 | /*/build/ 29 | 30 | # Local configuration file (sdk path, etc) 31 | local.properties 32 | api.properties 33 | 34 | # Proguard folder generated by Eclipse 35 | proguard/ 36 | 37 | # Log Files 38 | *.log 39 | 40 | ### Android Patch ### 41 | gen-external-apklibs 42 | 43 | 44 | ### Intellij ### 45 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm 46 | 47 | *.iml 48 | 49 | ## Directory-based project format: 50 | .idea/ 51 | # if you remove the above rule, at least ignore the following: 52 | 53 | # User-specific stuff: 54 | # .idea/workspace.xml 55 | # .idea/tasks.xml 56 | # .idea/dictionaries 57 | 58 | # Sensitive or high-churn files: 59 | # .idea/dataSources.ids 60 | # .idea/dataSources.xml 61 | # .idea/sqlDataSources.xml 62 | # .idea/dynamic.xml 63 | # .idea/uiDesigner.xml 64 | 65 | # Gradle: 66 | # .idea/gradle.xml 67 | # .idea/libraries 68 | 69 | # Mongo Explorer plugin: 70 | # .idea/mongoSettings.xml 71 | 72 | ## File-based project format: 73 | *.ipr 74 | *.iws 75 | 76 | ## Plugin-specific files: 77 | 78 | # IntelliJ 79 | /out/ 80 | 81 | # mpeltonen/sbt-idea plugin 82 | .idea_modules/ 83 | 84 | # JIRA plugin 85 | atlassian-ide-plugin.xml 86 | 87 | # Crashlytics plugin (for Android Studio and IntelliJ) 88 | com_crashlytics_export_strings.xml 89 | crashlytics.properties 90 | crashlytics-build.properties 91 | 92 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | jdk: oraclejdk8 3 | 4 | before_install: 5 | - chmod 755 gradlew 6 | - echo yes | android update sdk --filter extra-android-support --no-ui --force > /dev/null 7 | - echo yes | android update sdk --filter extra-android-m2repository --no-ui --force > /dev/null 8 | 9 | android: 10 | components: 11 | - tools 12 | - platform-tools 13 | - extra-android-support 14 | - extra-google-google_play_services 15 | - build-tools-25.0.2 16 | - extra-android-m2repository 17 | - extra-google-m2repository 18 | - android-25 19 | 20 | licenses: 21 | - android-sdk-license-.+ 22 | - google-gdk-license-.+ 23 | 24 | script: 25 | ./gradlew clean build 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GuideApp [![Build Status](https://travis-ci.org/thaleslima/GuideApp.svg?branch=master)](https://travis-ci.org/thaleslima/GuideApp) 2 | 3 | [Android] [Google App Engine] Application that displays the cities services. (Restaurants, hotels, attractions, etc.) 4 | 5 | 6 | Get it on Google Play 7 | 8 | Developed By 9 | ------------ 10 | 11 | * Thales Reis Machado Lima - 12 | 13 | 14 | Architecture app project 15 | ------------------------------------ 16 | 17 | It showcases a simple implementation of the Model-View-Presenter pattern. 18 | ![](/../master/images/mvp.png?raw=true "GuiaApp") 19 | 20 | 21 | Architecture backend services 22 | ------------------------------------ 23 | 24 | ![](/../master/images/backend.png?raw=true "GuiaApp") 25 | 26 | 27 | Libraries used on the app project 28 | ------------------------------------ 29 | 30 | * [Retrofit 2][2] 31 | * [Glide][3] 32 | 33 | 34 | Services used on the backend services 35 | ------------------------------------ 36 | 37 | * [Google App Angine][10] 38 | * [Google Cloud Endpoints][11] 39 | * [Google Cloud Storage][12] 40 | * [Google Cloud Datastore][13] 41 | 42 | 43 | Libraries used on the backend web 44 | ------------------------------------ 45 | 46 | * [Angular JS 1.5][20] 47 | * [Bootstrap][21] 48 | 49 | 50 | Quality 51 | ------------------------------------ 52 | 53 | The followings tools are used : 54 | - Checkstyle. 55 | - Findbugs. 56 | - PMD. 57 | - Lint. 58 | 59 | 60 | Screenshots app project 61 | ------------------------------------ 62 | 63 | ![](/../master/images/screenshot_00.png?raw=true "GuiaApp") 64 | 65 | 66 | License 67 | ------- 68 | 69 | Copyright 2017 Thales Reis Machado Lima 70 | 71 | Licensed under the Apache License, Version 2.0 (the "License"); 72 | you may not use this file except in compliance with the License. 73 | You may obtain a copy of the License at 74 | 75 | http://www.apache.org/licenses/LICENSE-2.0 76 | 77 | Unless required by applicable law or agreed to in writing, software 78 | distributed under the License is distributed on an "AS IS" BASIS, 79 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 80 | See the License for the specific language governing permissions and 81 | limitations under the License. 82 | 83 | 84 | [2]: http://square.github.io/retrofit/ 85 | [3]: https://github.com/bumptech/glide/ 86 | 87 | [10]: https://cloud.google.com/appengine/ 88 | [11]: https://cloud.google.com/endpoints/ 89 | [12]: https://cloud.google.com/storage/ 90 | [13]: https://cloud.google.com/datastore/ 91 | 92 | [20]: https://angularjs.org/ 93 | [21]: http://getbootstrap.com/ 94 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/fabric.properties: -------------------------------------------------------------------------------- 1 | #Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. 2 | #Mon Apr 03 21:14:02 BRT 2017 3 | apiSecret=f8967c17eff5e9ff351c6a4ad5799807082d37884b9d62074e09c56040f16e55 4 | -------------------------------------------------------------------------------- /app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "463730165489", 4 | "firebase_url": "https://guideapp-3081b.firebaseio.com", 5 | "project_id": "guideapp-3081b", 6 | "storage_bucket": "guideapp-3081b.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:463730165489:android:4154ffce295f504a", 12 | "android_client_info": { 13 | "package_name": "eco.guideapp" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "463730165489-js7ce7p8jrj3so0e6bgett52dkr529tg.apps.googleusercontent.com", 19 | "client_type": 1, 20 | "android_info": { 21 | "package_name": "eco.guideapp", 22 | "certificate_hash": "efdd527bd0202a5699ae509edb28c3af3bfd41dd" 23 | } 24 | }, 25 | { 26 | "client_id": "463730165489-gd7gcnatnbo1nt81becm7re22erippdc.apps.googleusercontent.com", 27 | "client_type": 3 28 | } 29 | ], 30 | "api_key": [ 31 | { 32 | "current_key": "AIzaSyBZUObcLo1sbglzC8YBBmXUIT-0bskgTK0" 33 | } 34 | ], 35 | "services": { 36 | "analytics_service": { 37 | "status": 1 38 | }, 39 | "appinvite_service": { 40 | "status": 2, 41 | "other_platform_oauth_client": [ 42 | { 43 | "client_id": "463730165489-gd7gcnatnbo1nt81becm7re22erippdc.apps.googleusercontent.com", 44 | "client_type": 3 45 | } 46 | ] 47 | }, 48 | "ads_service": { 49 | "status": 2 50 | } 51 | } 52 | } 53 | ], 54 | "configuration_version": "1" 55 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/thales/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/guideapp/data/TestUtilities.java: -------------------------------------------------------------------------------- 1 | package com.guideapp.data; 2 | 3 | import android.database.ContentObserver; 4 | import android.net.Uri; 5 | import android.os.Handler; 6 | import android.os.HandlerThread; 7 | 8 | import com.guideapp.utils.PollingCheck; 9 | 10 | public class TestUtilities { 11 | 12 | static TestContentObserver getTestContentObserver() { 13 | return TestContentObserver.getTestContentObserver(); 14 | } 15 | 16 | /** 17 | * Students: The test functions for insert and delete use TestContentObserver to test 18 | * the ContentObserver callbacks using the PollingCheck class from the Android Compatibility 19 | * Test Suite tests. 20 | * NOTE: This only tests that the onChange function is called; it DOES NOT test that the 21 | * correct Uri is returned. 22 | */ 23 | static class TestContentObserver extends ContentObserver { 24 | final HandlerThread mHT; 25 | boolean mContentChanged; 26 | 27 | private TestContentObserver(HandlerThread ht) { 28 | super(new Handler(ht.getLooper())); 29 | mHT = ht; 30 | } 31 | 32 | static TestContentObserver getTestContentObserver() { 33 | HandlerThread ht = new HandlerThread("ContentObserverThread"); 34 | ht.start(); 35 | return new TestContentObserver(ht); 36 | } 37 | 38 | /** 39 | * Called when a content change occurs. 40 | *

41 | * To ensure correct operation on older versions of the framework that did not provide a 42 | * Uri argument, applications should also implement this method whenever they implement 43 | * the { #onChange(boolean, Uri)} overload. 44 | * 45 | * @param selfChange True if this is a self-change notification. 46 | */ 47 | @Override 48 | public void onChange(boolean selfChange) { 49 | onChange(selfChange, null); 50 | } 51 | 52 | /** 53 | * Called when a content change occurs. Includes the changed content Uri when available. 54 | * 55 | * @param selfChange True if this is a self-change notification. 56 | * @param uri The Uri of the changed content, or null if unknown. 57 | */ 58 | @Override 59 | public void onChange(boolean selfChange, Uri uri) { 60 | mContentChanged = true; 61 | } 62 | 63 | /** 64 | * Note: The PollingCheck class is taken from the Android CTS (Compatibility Test Suite). 65 | * It's useful to look at the Android CTS source for ideas on how to test your Android 66 | * applications. The reason that PollingCheck works is that, by default, the JUnit testing 67 | * framework is not running on the main Android application thread. 68 | */ 69 | void waitForNotificationOrFail() { 70 | 71 | new PollingCheck(5000) { 72 | @Override 73 | protected boolean check() { 74 | return mContentChanged; 75 | } 76 | }.run(); 77 | mHT.quit(); 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/guideapp/utils/PollingCheck.java: -------------------------------------------------------------------------------- 1 | package com.guideapp.utils; 2 | 3 | 4 | import junit.framework.Assert; 5 | import java.util.concurrent.Callable; 6 | 7 | public abstract class PollingCheck { 8 | 9 | private static final long TIME_SLICE = 50; 10 | private long mTimeout = 3000; 11 | 12 | public PollingCheck() { 13 | } 14 | 15 | public PollingCheck(long timeout) { 16 | mTimeout = timeout; 17 | } 18 | 19 | public static void check(CharSequence message, long timeout, Callable condition) 20 | throws Exception { 21 | while (timeout > 0) { 22 | if (condition.call()) { 23 | return; 24 | } 25 | 26 | Thread.sleep(TIME_SLICE); 27 | timeout -= TIME_SLICE; 28 | } 29 | 30 | Assert.fail(message.toString()); 31 | } 32 | 33 | protected abstract boolean check(); 34 | 35 | public void run() { 36 | if (check()) { 37 | return; 38 | } 39 | 40 | long timeout = mTimeout; 41 | while (timeout > 0) { 42 | try { 43 | Thread.sleep(TIME_SLICE); 44 | } catch (InterruptedException e) { 45 | Assert.fail("Notification error, unexpected InterruptedException"); 46 | } 47 | 48 | if (check()) { 49 | return; 50 | } 51 | 52 | timeout -= TIME_SLICE; 53 | } 54 | 55 | Assert.fail("Notification not set, unexpected timeout"); 56 | } 57 | } -------------------------------------------------------------------------------- /app/src/main/ic_clear_gray-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/ic_clear_gray-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/App.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp 2 | 3 | import android.support.multidex.MultiDexApplication 4 | 5 | import com.facebook.stetho.Stetho 6 | import com.crashlytics.android.Crashlytics 7 | import io.fabric.sdk.android.Fabric 8 | 9 | class App : MultiDexApplication() { 10 | override fun onCreate() { 11 | super.onCreate() 12 | Fabric.with(this, Crashlytics()) 13 | 14 | if (BuildConfig.DEBUG) { 15 | Stetho.initializeWithDefaults(this) 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/data/local/GuideDbHelper.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.data.local 2 | 3 | import android.content.Context 4 | import android.database.sqlite.SQLiteDatabase 5 | import android.database.sqlite.SQLiteOpenHelper 6 | 7 | class GuideDbHelper(context: Context) : SQLiteOpenHelper(context, GuideDbHelper.DATABASE_NAME, null, GuideDbHelper.DATABASE_VERSION) { 8 | override fun onCreate(db: SQLiteDatabase) { 9 | val sqlCreateLocalTable = "CREATE TABLE " + GuideContract.LocalEntry.TABLE_NAME + " (" + 10 | GuideContract.LocalEntry._ID + " INTEGER PRIMARY KEY, " + 11 | GuideContract.LocalEntry.COLUMN_DESCRIPTION + " TEXT, " + 12 | GuideContract.LocalEntry.COLUMN_SITE + " TEXT, " + 13 | GuideContract.LocalEntry.COLUMN_PHONE + " TEXT, " + 14 | GuideContract.LocalEntry.COLUMN_ADDRESS + " TEXT, " + 15 | GuideContract.LocalEntry.COLUMN_WIFI + " INTEGER, " + 16 | GuideContract.LocalEntry.COLUMN_DETAIL + " TEXT, " + 17 | GuideContract.LocalEntry.COLUMN_LATITUDE + " REAL, " + 18 | GuideContract.LocalEntry.COLUMN_LONGITUDE + " REAL, " + 19 | GuideContract.LocalEntry.COLUMN_IMAGE_PATH + " TEXT, " + 20 | GuideContract.LocalEntry.COLUMN_ID_CITY + " INTEGER, " + 21 | GuideContract.LocalEntry.COLUMN_ID_CATEGORY + " INTEGER, " + 22 | GuideContract.LocalEntry.COLUMN_ID_SUB_CATEGORY + " TEXT, " + 23 | GuideContract.LocalEntry.COLUMN_TIMESTAMP + " INTEGER, " + 24 | GuideContract.LocalEntry.COLUMN_DESCRIPTION_SUB_CATEGORY + " TEXT, " + 25 | GuideContract.LocalEntry.COLUMN_FAVORITE + " INTEGER "+" )" 26 | 27 | db.execSQL(sqlCreateLocalTable) 28 | } 29 | 30 | override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { 31 | db.execSQL("DROP TABLE IF EXISTS " + GuideContract.LocalEntry.TABLE_NAME) 32 | onCreate(db) 33 | } 34 | 35 | companion object { 36 | private val DATABASE_NAME = "guide.db" 37 | private val DATABASE_VERSION = 1 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/data/remote/GuideApi.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.data.remote 2 | 3 | import com.guideapp.model.Local 4 | import com.guideapp.model.SubCategory 5 | import com.guideapp.model.wrapper.ListResponse 6 | 7 | import retrofit2.Call 8 | import retrofit2.http.GET 9 | import retrofit2.http.Query 10 | 11 | interface GuideApi { 12 | 13 | @GET("local") 14 | fun getLocals( 15 | @Query("idCity") idCity: Long?, 16 | @Query("idCategory") idCategory: Long?, 17 | @Query("idSubCategories") idSubCategory: LongArray): Call> 18 | 19 | @GET("local") 20 | fun getLocals( 21 | @Query("idCity") idCity: Long?): Call> 22 | 23 | @GET("subcategory") 24 | fun getSubCategories(@Query("idCategory") idCategory: Long): Call> 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/data/remote/RestClient.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.data.remote 2 | 3 | import com.guideapp.BuildConfig 4 | 5 | import java.util.concurrent.TimeUnit 6 | 7 | import okhttp3.OkHttpClient 8 | import okhttp3.logging.HttpLoggingInterceptor 9 | import retrofit2.Retrofit 10 | import retrofit2.converter.gson.GsonConverterFactory 11 | 12 | object RestClient { 13 | private var mGuideApi: GuideApi? = null 14 | private val TIMEOUT = 30 15 | 16 | val client: GuideApi 17 | get() { 18 | if (mGuideApi == null) { 19 | val client = Retrofit.Builder() 20 | .baseUrl(BuildConfig.ENDPOINT_URL) 21 | .client(okHttpClient) 22 | .addConverterFactory(GsonConverterFactory.create()) 23 | .build() 24 | 25 | mGuideApi = client.create(GuideApi::class.java) 26 | } 27 | 28 | return mGuideApi!! 29 | } 30 | 31 | 32 | private val okHttpClient: OkHttpClient 33 | get() { 34 | val okClientBuilder = OkHttpClient.Builder() 35 | 36 | val httpLoggingInterceptor = HttpLoggingInterceptor() 37 | httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BASIC 38 | okClientBuilder.addInterceptor(httpLoggingInterceptor) 39 | okClientBuilder.connectTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) 40 | okClientBuilder.readTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) 41 | okClientBuilder.writeTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) 42 | return okClientBuilder.build() 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/model/Local.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.model 2 | 3 | data class Local(var id: Long? = null, 4 | var description: String? = null, 5 | var site: String? = null, 6 | var phone: String? = null, 7 | var address: String? = null, 8 | var isWifi: Boolean = false, 9 | var detail: String? = null, 10 | var latitude: Double = 0.toDouble(), 11 | var longitude: Double = 0.toDouble(), 12 | var imagePath: String? = null, 13 | var idCity: Long? = null, 14 | var idCategory: Long = 0, 15 | var idCategories: List? = null, 16 | var idSubCategories: List? = null, 17 | var timestamp: Long = 0, 18 | var subCategories: List? = null, 19 | var descriptionSubCategories: String? = null, 20 | var isFavorite: Boolean = false 21 | ) 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/model/MainMenu.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.model 2 | 3 | data class MainMenu(val id: Long, 4 | val idTitle: Int, 5 | val idImage: Int, 6 | val idColorPrimary: Int) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/model/SubCategory.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.model 2 | 3 | data class SubCategory(val id: Long? = null, 4 | val description: String? = null, 5 | val idCategory: Long? = null, 6 | val timestamp: Long? = null) -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/model/wrapper/ListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.model.wrapper 2 | 3 | data class ListResponse(var items: List? = null) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/sync/GuideFirebaseJobService.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.sync 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Context 5 | import android.os.AsyncTask 6 | 7 | import com.firebase.jobdispatcher.JobParameters 8 | import com.firebase.jobdispatcher.JobService 9 | 10 | class GuideFirebaseJobService : JobService() { 11 | private var mFetchGuideTask: AsyncTask? = null 12 | 13 | @SuppressLint("StaticFieldLeak") 14 | override fun onStartJob(jobParameters: JobParameters): Boolean { 15 | 16 | mFetchGuideTask = object : AsyncTask() { 17 | override fun doInBackground(vararg voids: Void): Void? { 18 | val context = applicationContext 19 | GuideSyncTask.syncGuide(context) 20 | jobFinished(jobParameters, false) 21 | return null 22 | } 23 | 24 | override fun onPostExecute(aVoid: Void) { 25 | jobFinished(jobParameters, false) 26 | } 27 | } 28 | 29 | mFetchGuideTask?.execute() 30 | return true 31 | } 32 | 33 | override fun onStopJob(jobParameters: JobParameters): Boolean { 34 | mFetchGuideTask?.cancel(true) 35 | return true 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/sync/GuideSyncIntentService.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.sync 2 | 3 | import android.app.IntentService 4 | import android.content.Intent 5 | 6 | class GuideSyncIntentService : IntentService("GuideSyncIntentService") { 7 | override fun onHandleIntent(intent: Intent?) { 8 | GuideSyncTask.syncGuide(this) 9 | } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views 2 | 3 | import android.os.Bundle 4 | import android.support.v7.app.AppCompatActivity 5 | 6 | abstract class BaseActivity : AppCompatActivity() { 7 | override fun onCreate(savedInstanceState: Bundle?) { 8 | super.onCreate(savedInstanceState) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/GridSpacingItemDecoration.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views 2 | 3 | import android.graphics.Rect 4 | import android.support.v7.widget.RecyclerView 5 | import android.view.View 6 | 7 | class GridSpacingItemDecoration(private val mSpanCount: Int, private val mSpacing: Int, private val mIncludeEdge: Boolean) : RecyclerView.ItemDecoration() { 8 | override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, 9 | state: RecyclerView.State?) { 10 | val position = parent.getChildAdapterPosition(view) // item position 11 | val column = position % mSpanCount // item column 12 | if (mIncludeEdge) { 13 | outRect.left = mSpacing - column * mSpacing / mSpanCount 14 | outRect.right = (column + 1) * mSpacing / mSpanCount 15 | if (position < mSpanCount) { // top edge 16 | outRect.top = mSpacing 17 | } 18 | outRect.bottom = mSpacing // item bottom 19 | } else { 20 | outRect.left = column * mSpacing / mSpanCount // column * ((1f / spanCount) * spacing) 21 | outRect.right = mSpacing - (column + 1) * mSpacing / mSpanCount 22 | if (position >= mSpanCount) { 23 | outRect.top = mSpacing // item top 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/favorite/FavoriteAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.favorite 2 | 3 | import android.content.Context 4 | import android.support.v7.widget.RecyclerView 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.ImageView 9 | import android.widget.TextView 10 | 11 | import com.bumptech.glide.Glide 12 | import com.bumptech.glide.load.engine.DiskCacheStrategy 13 | import com.guideapp.R 14 | import com.guideapp.model.Local 15 | 16 | import java.util.ArrayList 17 | 18 | internal class FavoriteAdapter(private val mContext: Context, private val mListener: FavoriteAdapter.ItemClickListener) : RecyclerView.Adapter() { 19 | private val mDataSet: MutableList 20 | 21 | internal interface ItemClickListener { 22 | fun onItemClick(item: Local, view: ImageView) 23 | } 24 | 25 | init { 26 | this.mDataSet = ArrayList() 27 | } 28 | 29 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteAdapter.LocalViewHolder { 30 | val v = LayoutInflater.from(parent.context).inflate(R.layout.item_local_favorite, parent, false) 31 | return LocalViewHolder(v) 32 | } 33 | 34 | override fun onBindViewHolder(holder: FavoriteAdapter.LocalViewHolder, position: Int) { 35 | holder.populate(mDataSet[position]) 36 | } 37 | 38 | override fun getItemCount(): Int { 39 | return mDataSet.size 40 | } 41 | 42 | fun replaceData(dataSet: List) { 43 | setList(dataSet) 44 | notifyDataSetChanged() 45 | } 46 | 47 | private fun setList(dataSet: List) { 48 | mDataSet.clear() 49 | mDataSet.addAll(dataSet) 50 | } 51 | 52 | internal inner class LocalViewHolder(private val mView: View) : RecyclerView.ViewHolder(mView) { 53 | private val mPhotoView: ImageView = mView.findViewById(R.id.local_picture) as ImageView 54 | private val mDescriptionView: TextView = mView.findViewById(R.id.local_text) as TextView 55 | private val mAddressView: TextView = mView.findViewById(R.id.local_address) as TextView 56 | private val mDescriptionsSubCategory: TextView = mView.findViewById(R.id.descriptions_sub_category) as TextView 57 | private var mItem: Local? = null 58 | 59 | init { 60 | mView.setOnClickListener { mItem?.let { it1 -> mListener.onItemClick(it1, mPhotoView) } } 61 | } 62 | 63 | fun populate(data: Local) { 64 | mItem = data 65 | mDescriptionView.text = data.description 66 | mAddressView.text = data.address 67 | mDescriptionsSubCategory.text = data.descriptionSubCategories 68 | 69 | Glide.with(mContext) 70 | .load(data.imagePath) 71 | .placeholder(R.color.placeholder) 72 | .diskCacheStrategy(DiskCacheStrategy.ALL) 73 | .into(mPhotoView) 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/favorite/FavoriteContract.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.favorite 2 | 3 | import android.content.Context 4 | import android.support.v4.app.LoaderManager 5 | import android.widget.ImageView 6 | 7 | import com.guideapp.model.Local 8 | 9 | internal interface FavoriteContract { 10 | interface View { 11 | fun showNoItemsMessage() 12 | 13 | fun hideNoItemsMessage() 14 | 15 | fun showLocals(locals: List) 16 | 17 | fun showLocalDetailUi(local: Local, view: ImageView) 18 | 19 | fun getContext(): Context 20 | } 21 | 22 | interface Presenter { 23 | fun loadLocals(loaderManager: LoaderManager) 24 | 25 | fun onResume(loaderManager: LoaderManager) 26 | 27 | fun openLocalDetails(local: Local, view: ImageView) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/favorite/FavoriteFragment.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.favorite 2 | 3 | import android.os.Bundle 4 | import android.support.v4.app.Fragment 5 | import android.support.v7.widget.LinearLayoutManager 6 | import android.support.v7.widget.RecyclerView 7 | import android.view.LayoutInflater 8 | import android.view.View 9 | import android.view.ViewGroup 10 | import android.widget.ImageView 11 | import android.widget.TextView 12 | 13 | import com.guideapp.R 14 | import com.guideapp.model.Local 15 | import com.guideapp.ui.views.localdetail.LocalDetailActivity 16 | import com.guideapp.ui.views.DividerItemDecoration 17 | 18 | class FavoriteFragment : Fragment(), FavoriteContract.View, FavoriteAdapter.ItemClickListener { 19 | private var mAdapter: FavoriteAdapter? = null 20 | private var mPresenter: FavoriteContract.Presenter? = null 21 | private var mMessageView: TextView? = null 22 | 23 | override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, 24 | savedInstanceState: Bundle?): View? { 25 | 26 | val view = inflater!!.inflate(R.layout.fragment_favorite, container, false) 27 | setupRecyclerView(view) 28 | setupViews(view) 29 | return view 30 | } 31 | 32 | private fun setupViews(view: View) { 33 | mMessageView = view.findViewById(R.id.message_view) as TextView 34 | } 35 | 36 | override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { 37 | super.onViewCreated(view, savedInstanceState) 38 | 39 | mPresenter = FavoritePresenter(this) 40 | mPresenter?.loadLocals(activity.supportLoaderManager) 41 | } 42 | 43 | private fun setupRecyclerView(view: View) { 44 | mAdapter = FavoriteAdapter(context, this) 45 | val recyclerView = view.findViewById(R.id.recycler) as RecyclerView 46 | 47 | recyclerView.layoutManager = LinearLayoutManager(context) 48 | recyclerView.adapter = mAdapter 49 | recyclerView.addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST)) 50 | } 51 | 52 | override fun onResume() { 53 | super.onResume() 54 | mPresenter?.onResume(activity.supportLoaderManager) 55 | } 56 | 57 | override fun showNoItemsMessage() { 58 | mMessageView?.visibility = View.VISIBLE 59 | } 60 | 61 | override fun hideNoItemsMessage() { 62 | mMessageView?.visibility = View.GONE 63 | } 64 | 65 | override fun onItemClick(item: Local, view: ImageView) { 66 | mPresenter?.openLocalDetails(item, view) 67 | } 68 | 69 | override fun showLocals(locals: List) { 70 | mAdapter?.replaceData(locals) 71 | } 72 | 73 | override fun showLocalDetailUi(local: Local, view: ImageView) { 74 | local.id?.let { LocalDetailActivity.navigate(activity, view, it, local.idCategory) } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/favorite/FavoritePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.favorite 2 | 3 | import android.database.Cursor 4 | import android.os.Bundle 5 | import android.support.v4.app.LoaderManager 6 | import android.support.v4.content.CursorLoader 7 | import android.support.v4.content.Loader 8 | import android.widget.ImageView 9 | 10 | import com.guideapp.data.local.GuideContract 11 | import com.guideapp.model.Local 12 | import com.guideapp.utilities.DataUtil 13 | 14 | import java.util.ArrayList 15 | 16 | internal class FavoritePresenter(private val mView: FavoriteContract.View) : FavoriteContract.Presenter, LoaderManager.LoaderCallbacks { 17 | override fun loadLocals(loaderManager: LoaderManager) { 18 | loaderManager.initLoader(ID_LOADER, Bundle.EMPTY, this) 19 | } 20 | 21 | override fun onResume(loaderManager: LoaderManager) { 22 | loaderManager.restartLoader(ID_LOADER, Bundle.EMPTY, this) 23 | } 24 | 25 | override fun openLocalDetails(local: Local, view: ImageView) { 26 | this.mView.showLocalDetailUi(local, view) 27 | } 28 | 29 | override fun onCreateLoader(id: Int, args: Bundle): Loader { 30 | when (id) { 31 | ID_LOADER -> return CursorLoader(mView.getContext(), 32 | GuideContract.LocalEntry.CONTENT_URI, null, 33 | GuideContract.LocalEntry.getSqlSelectForFavorites(), null, null) 34 | 35 | else -> throw RuntimeException("Loader Not Implemented: " + id) 36 | } 37 | } 38 | 39 | override fun onLoadFinished(loader: Loader, data: Cursor) { 40 | if (data.count > 0) { 41 | mView.showLocals(DataUtil.getLocalsFromCursor(data)) 42 | mView.hideNoItemsMessage() 43 | } else { 44 | mView.showLocals(ArrayList()) 45 | mView.showNoItemsMessage() 46 | } 47 | } 48 | 49 | override fun onLoaderReset(loader: Loader) { 50 | mView.showLocals(ArrayList()) 51 | } 52 | 53 | companion object { 54 | private val ID_LOADER = 333 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/local/LocalAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.local 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.ViewGroup 5 | import android.widget.ImageView 6 | import com.bumptech.glide.Glide 7 | import com.bumptech.glide.load.engine.DiskCacheStrategy 8 | import com.guideapp.R 9 | import com.guideapp.model.Local 10 | import com.guideapp.utilities.inflate 11 | import kotlinx.android.synthetic.main.item_local.view.* 12 | import java.util.* 13 | 14 | internal class LocalAdapter(private val mListener: LocalAdapter.ItemClickListener) : RecyclerView.Adapter() { 15 | private val mDataSet: MutableList = ArrayList() 16 | 17 | internal interface ItemClickListener { 18 | fun onItemClick(item: Local, view: ImageView) 19 | } 20 | 21 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocalViewHolder { 22 | return LocalViewHolder(parent) 23 | } 24 | 25 | override fun onBindViewHolder(holder: LocalViewHolder, position: Int) { 26 | holder.bind(mDataSet[position]) 27 | } 28 | 29 | override fun getItemCount(): Int { 30 | return mDataSet.size 31 | } 32 | 33 | fun replaceData(dataSet: List) { 34 | setList(dataSet) 35 | notifyDataSetChanged() 36 | } 37 | 38 | private fun setList(dataSet: List) { 39 | mDataSet.clear() 40 | mDataSet.addAll(dataSet) 41 | } 42 | 43 | internal inner class LocalViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(parent.inflate(R.layout.item_local)) { 44 | private var mItem: Local? = null 45 | 46 | fun bind(item: Local) = with(itemView) { 47 | mItem = item 48 | local_text.text = item.description 49 | local_address.text = item.address 50 | descriptions_sub_category.text = item.descriptionSubCategories 51 | 52 | Glide.with(itemView.context) 53 | .load(item.imagePath) 54 | .placeholder(R.color.placeholder) 55 | .diskCacheStrategy(DiskCacheStrategy.ALL) 56 | .into(local_picture) 57 | 58 | itemView.setOnClickListener { mItem?.let { it1 -> mListener.onItemClick(it1, local_picture) } } 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/local/LocalContract.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.local 2 | 3 | import android.content.Context 4 | import android.support.v4.app.LoaderManager 5 | import android.widget.ImageView 6 | 7 | import com.guideapp.model.Local 8 | 9 | internal interface LocalContract { 10 | interface View { 11 | fun showLocals(locals: List) 12 | 13 | fun showLocalDetailUi(local: Local, view: ImageView) 14 | 15 | fun showProgressBar() 16 | 17 | fun hideProgressBar() 18 | 19 | fun getContext(): Context 20 | } 21 | 22 | interface Presenter { 23 | fun loadLocals(loaderManager: LoaderManager) 24 | 25 | fun restartLoadLocals(loaderManager: LoaderManager, idCategory: Long) 26 | 27 | fun openLocalDetails(local: Local, view: ImageView) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/local/LocalPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.local 2 | 3 | import android.database.Cursor 4 | import android.os.Bundle 5 | import android.support.v4.app.LoaderManager 6 | import android.support.v4.content.CursorLoader 7 | import android.support.v4.content.Loader 8 | import android.widget.ImageView 9 | 10 | import com.guideapp.data.local.GuideContract 11 | import com.guideapp.model.Local 12 | import com.guideapp.utilities.DataUtil 13 | 14 | import java.util.ArrayList 15 | 16 | internal class LocalPresenter(private val mView: LocalContract.View, private var mIdCategory: Long) : LocalContract.Presenter, LoaderManager.LoaderCallbacks { 17 | override fun loadLocals(loaderManager: LoaderManager) { 18 | mView.showProgressBar() 19 | loaderManager.initLoader(ID_LOADER, Bundle.EMPTY, this) 20 | } 21 | 22 | override fun restartLoadLocals(loaderManager: LoaderManager, idCategory: Long) { 23 | if (this.mIdCategory == 0L) { 24 | loaderManager.destroyLoader(ID_LOADER) 25 | this.mIdCategory = idCategory 26 | loadLocals(loaderManager) 27 | } 28 | } 29 | 30 | override fun openLocalDetails(local: Local, view: ImageView) { 31 | this.mView.showLocalDetailUi(local, view) 32 | } 33 | 34 | override fun onCreateLoader(id: Int, args: Bundle): Loader { 35 | when (id) { 36 | ID_LOADER -> return CursorLoader(mView.getContext(), 37 | GuideContract.LocalEntry.CONTENT_URI, null, 38 | GuideContract.LocalEntry.getSqlSelectForIdCategory(mIdCategory), null, null) 39 | else -> throw RuntimeException("Loader Not Implemented: " + id) 40 | } 41 | } 42 | 43 | override fun onLoadFinished(loader: Loader, data: Cursor) { 44 | mView.hideProgressBar() 45 | mView.showLocals(DataUtil.getLocalsFromCursor(data)) 46 | } 47 | 48 | override fun onLoaderReset(loader: Loader) { 49 | mView.showLocals(ArrayList()) 50 | mView.hideProgressBar() 51 | } 52 | 53 | companion object { 54 | private val ID_LOADER = 356 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/localdetail/LocalDetailContract.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.localdetail 2 | 3 | import android.content.Context 4 | import android.support.v4.app.LoaderManager 5 | 6 | internal interface LocalDetailContract { 7 | interface View { 8 | fun showFavoriteYes() 9 | 10 | fun showFavoriteNo() 11 | 12 | fun showSnackbarRemoveFavorite() 13 | 14 | fun showSnackbarSaveFavorite() 15 | 16 | fun shareText(textToShare: String) 17 | 18 | fun getContext(): Context 19 | 20 | fun showTitle(description: String) 21 | 22 | fun showImage(imagePath: String) 23 | 24 | fun showCategory(text: String) 25 | 26 | fun showWebSiteAction() 27 | 28 | fun showDirectionAction() 29 | 30 | fun showCallAction() 31 | 32 | fun showCall(phone: String) 33 | 34 | fun showDetail(description: String) 35 | 36 | fun showAddress(address: String) 37 | 38 | fun showMap(latitude: Double, longitude: Double, idImageMarker: Int) 39 | 40 | fun dialPhoneNumber(number: String) 41 | 42 | fun openPage(url: String) 43 | 44 | fun openDirection(description: String, latLng: String) 45 | } 46 | 47 | interface Presenter { 48 | fun loadLocal(loaderManager: LoaderManager) 49 | 50 | fun destroy(loaderManager: LoaderManager) 51 | 52 | fun saveOrRemoveFavorite() 53 | 54 | fun shareLocal() 55 | 56 | fun loadWebsite() 57 | 58 | fun loadCall() 59 | 60 | fun loadDirection() 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/map/MapActivity.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.map 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import android.support.v4.app.Fragment 7 | import com.guideapp.R 8 | import com.guideapp.ui.views.BaseActivity 9 | import kotlinx.android.synthetic.main.toolbar_transparent.* 10 | 11 | 12 | class MapActivity : BaseActivity() { 13 | private var mIdCity: Long = 0 14 | private var mIdCategory: Long = 0 15 | private var mIdTitle: Int = 0 16 | private var mIdSubCategories: LongArray? = null 17 | 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | setContentView(R.layout.activity_map) 21 | initExtra() 22 | setupToolbar() 23 | setupFragment(MapFragment.newInstance(mIdCity, mIdCategory, mIdSubCategories)) 24 | } 25 | 26 | private fun initExtra() { 27 | mIdCity = intent.getLongExtra(EXTRA_CITY, 0) 28 | mIdCategory = intent.getLongExtra(EXTRA_CATEGORY, 0) 29 | mIdTitle = intent.getIntExtra(EXTRA_ID_TITLE, 0) 30 | mIdSubCategories = intent.getLongArrayExtra(EXTRA_SUB_CATEGORY) 31 | } 32 | 33 | private fun setupFragment(fragment: Fragment) { 34 | val fragmentManager = supportFragmentManager 35 | val transaction = fragmentManager.beginTransaction() 36 | transaction.add(R.id.contentFrame, fragment) 37 | transaction.commit() 38 | } 39 | 40 | private fun setupToolbar() { 41 | setSupportActionBar(toolbar) 42 | supportActionBar?.setDisplayHomeAsUpEnabled(true) 43 | supportActionBar?.setTitle(R.string.app_name_city) 44 | 45 | if (mIdTitle > 0) { 46 | setTitle(mIdTitle) 47 | } 48 | } 49 | 50 | companion object { 51 | private val EXTRA_CITY = "id-city" 52 | private val EXTRA_CATEGORY = "id-category" 53 | private val EXTRA_SUB_CATEGORY = "id-sub-category" 54 | private val EXTRA_ID_TITLE = "id-title" 55 | 56 | fun navigate(context: Context, idCity: Long?) { 57 | val intent = Intent(context, MapActivity::class.java) 58 | intent.putExtra(EXTRA_CITY, idCity) 59 | context.startActivity(intent) 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/map/MapContract.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.map 2 | 3 | import android.content.Context 4 | import android.support.v4.app.LoaderManager 5 | import android.widget.ImageView 6 | 7 | import com.guideapp.model.Local 8 | 9 | internal interface MapContract { 10 | interface View { 11 | fun showLocals(locals: List) 12 | 13 | fun showLocalSummary(local: Local) 14 | 15 | fun showLocalDetailUi(local: Local, view: ImageView) 16 | 17 | fun getContext() : Context 18 | } 19 | 20 | interface Presenter { 21 | fun loadLocals(loaderManager: LoaderManager) 22 | 23 | fun openLocalSummary(local: Local?) 24 | 25 | fun openLocalDetails(local: Local, view: ImageView) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/map/MapPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.map 2 | 3 | import android.database.Cursor 4 | import android.os.Bundle 5 | import android.support.v4.app.LoaderManager 6 | import android.support.v4.content.CursorLoader 7 | import android.support.v4.content.Loader 8 | import android.widget.ImageView 9 | 10 | import com.guideapp.data.local.GuideContract 11 | import com.guideapp.model.Local 12 | import com.guideapp.utilities.DataUtil 13 | 14 | import java.util.ArrayList 15 | 16 | internal class MapPresenter(private val mView: MapContract.View) : MapContract.Presenter, LoaderManager.LoaderCallbacks { 17 | override fun loadLocals(loaderManager: LoaderManager) { 18 | loaderManager.initLoader(ID_LOADER, Bundle.EMPTY, this) 19 | } 20 | 21 | override fun openLocalSummary(local: Local?) { 22 | local?.let { mView.showLocalSummary(it) } 23 | } 24 | 25 | override fun openLocalDetails(local: Local, view: ImageView) { 26 | mView.showLocalDetailUi(local, view) 27 | } 28 | 29 | override fun onCreateLoader(id: Int, args: Bundle): Loader { 30 | when (id) { 31 | ID_LOADER -> return CursorLoader(mView.getContext(), GuideContract.LocalEntry.CONTENT_URI, null, null, null, null) 32 | else -> throw RuntimeException("Loader Not Implemented: " + id) 33 | } 34 | } 35 | 36 | override fun onLoadFinished(loader: Loader, data: Cursor) { 37 | mView.showLocals(DataUtil.getLocalsFromCursor(data)) 38 | } 39 | 40 | override fun onLoaderReset(loader: Loader) { 41 | mView.showLocals(ArrayList()) 42 | } 43 | 44 | companion object { 45 | private val ID_LOADER = 256 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/menu/MenuAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.menu 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.ViewGroup 5 | import com.guideapp.R 6 | import com.guideapp.model.MainMenu 7 | import com.guideapp.utilities.inflate 8 | import kotlinx.android.synthetic.main.item_menu.view.* 9 | 10 | internal class MenuAdapter(private val mDataSet: List, 11 | private val mListener: MenuAdapter.RecyclerViewItemClickListener?) : RecyclerView.Adapter() { 12 | internal interface RecyclerViewItemClickListener { 13 | fun onItemClick(item: MainMenu) 14 | } 15 | 16 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 17 | return ViewHolder(parent) 18 | } 19 | 20 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 21 | holder.bind(mDataSet[position]) 22 | } 23 | 24 | override fun getItemCount(): Int { 25 | return mDataSet.size 26 | } 27 | 28 | internal inner class ViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(parent.inflate(R.layout.item_menu)) { 29 | private var mItem: MainMenu? = null 30 | 31 | fun bind(item: MainMenu) = with(itemView) { 32 | mItem = item 33 | menu_item.setBackgroundResource(item.idColorPrimary) 34 | menu_title.setText(item.idTitle) 35 | menu_image.setImageResource(item.idImage) 36 | itemView.setOnClickListener { mItem?.let { it1 -> mListener?.onItemClick(it1) } } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/views/menu/MenuFragment.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.views.menu 2 | 3 | 4 | import android.os.Bundle 5 | import android.support.v4.app.Fragment 6 | import android.support.v7.widget.GridLayoutManager 7 | import android.view.LayoutInflater 8 | import android.view.View 9 | import android.view.ViewGroup 10 | 11 | import com.guideapp.R 12 | import com.guideapp.model.MainMenu 13 | import com.guideapp.ui.views.GridSpacingItemDecoration 14 | import com.guideapp.ui.views.local.LocalActivity 15 | import com.guideapp.ui.views.map.MapActivity 16 | import com.guideapp.utilities.Constants 17 | import com.guideapp.utilities.Utility 18 | import kotlinx.android.synthetic.main.fragment_menu.* 19 | 20 | class MenuFragment : Fragment(), MenuAdapter.RecyclerViewItemClickListener { 21 | override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 22 | return inflater?.inflate(R.layout.fragment_menu, container, false) 23 | } 24 | 25 | override fun onActivityCreated(savedInstanceState: Bundle?) { 26 | super.onActivityCreated(savedInstanceState) 27 | setupRecyclerView() 28 | } 29 | 30 | private fun setupRecyclerView() { 31 | recycler.layoutManager = GridLayoutManager(this.activity, 2) 32 | val adapter = MenuAdapter(Utility.menus, this) 33 | recycler.adapter = adapter 34 | recycler.addItemDecoration(GridSpacingItemDecoration(2, 16, true)) 35 | } 36 | 37 | override fun onItemClick(item: MainMenu) { 38 | if (item.id == 1L) { 39 | MapActivity.navigate(this.activity, Constants.City.ID) 40 | return 41 | } 42 | LocalActivity.navigate(this.activity, item.id, item.idTitle) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/ui/widget/LocalFavoriteWidget.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.ui.widget 2 | 3 | import android.app.PendingIntent 4 | import android.appwidget.AppWidgetManager 5 | import android.appwidget.AppWidgetProvider 6 | import android.content.ComponentName 7 | import android.content.Context 8 | import android.content.Intent 9 | import android.support.v4.app.TaskStackBuilder 10 | import android.widget.RemoteViews 11 | 12 | import com.guideapp.R 13 | import com.guideapp.ui.views.localdetail.LocalDetailActivity 14 | import com.guideapp.ui.views.main.MainActivity 15 | import com.guideapp.utilities.Constants 16 | 17 | class LocalFavoriteWidget : AppWidgetProvider() { 18 | 19 | private fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) { 20 | val views = RemoteViews(context.packageName, R.layout.widget_detail) 21 | val intent = Intent(context, MainActivity::class.java) 22 | val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) 23 | views.setOnClickPendingIntent(R.id.widget, pendingIntent) 24 | setRemoteAdapter(context, views) 25 | val clickPendingIntentTemplate = TaskStackBuilder.create(context) 26 | .addNextIntentWithParentStack(Intent(context, LocalDetailActivity::class.java)) 27 | .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT) 28 | views.setPendingIntentTemplate(R.id.widget_list, clickPendingIntentTemplate) 29 | views.setEmptyView(R.id.widget_list, R.id.widget_empty) 30 | appWidgetManager.updateAppWidget(appWidgetId, views) 31 | } 32 | 33 | private fun setRemoteAdapter(context: Context, views: RemoteViews) { 34 | views.setRemoteAdapter(R.id.widget_list, Intent(context, LocalFavoriteWidgetRemoteViewsService::class.java)) 35 | } 36 | 37 | override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { 38 | for (appWidgetId in appWidgetIds) { 39 | updateAppWidget(context, appWidgetManager, appWidgetId) 40 | } 41 | } 42 | 43 | override fun onReceive(context: Context, intent: Intent) { 44 | super.onReceive(context, intent) 45 | if (Constants.ACTION_DATA_UPDATED == intent.action) { 46 | val appWidgetManager = AppWidgetManager.getInstance(context) 47 | val appWidgetIds = appWidgetManager.getAppWidgetIds(ComponentName(context, javaClass)) 48 | appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list) 49 | } 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/utilities/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.utilities 2 | 3 | object Constants { 4 | const val ACTION_DATA_UPDATED = "com.guideapp.ACTION_DATA_UPDATED" 5 | const val ACTION_DATA_SYNC_ERROR = "com.guideapp.ACTION_DATA_SYNC_ERROR" 6 | 7 | interface City { 8 | companion object { 9 | const val ID = 5659118702428160L 10 | const val LATITUDE = -20.3449802 11 | const val LONGITUDE = -46.8551188 12 | } 13 | } 14 | 15 | internal interface Menu { 16 | companion object { 17 | const val ALIMENTATION = 5684666375864320L 18 | const val ATTRACTIVE = 5651124426113024L 19 | const val ACCOMMODATION = 5679413765079040L 20 | } 21 | } 22 | 23 | interface Analytics { 24 | companion object { 25 | const val SAVE_FAVORITE = "save_favorite" 26 | const val REMOVE_FAVORITE = "remove_favorite" 27 | const val SCREEN = "screen" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/utilities/Extensions.kt: -------------------------------------------------------------------------------- 1 | @file:JvmName("ExtensionsUtils") 2 | 3 | package com.guideapp.utilities 4 | 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | 9 | fun ViewGroup.inflate(layoutId: Int, attachToRoot: Boolean = false): View { 10 | return LayoutInflater.from(context).inflate(layoutId, this, attachToRoot) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/utilities/Utility.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.utilities 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.net.ConnectivityManager 6 | 7 | import com.guideapp.R 8 | import com.guideapp.model.Local 9 | import com.guideapp.model.MainMenu 10 | 11 | import java.util.ArrayList 12 | 13 | object Utility { 14 | fun isNetworkAvailable(c: Context): Boolean { 15 | val cm = c.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager 16 | 17 | val activeNetwork = cm.activeNetworkInfo 18 | return activeNetwork != null && activeNetwork.isConnectedOrConnecting 19 | } 20 | 21 | fun updateWidgets(context: Context) { 22 | val dataUpdatedIntent = Intent(Constants.ACTION_DATA_UPDATED).setPackage(context.packageName) 23 | context.sendBroadcast(dataUpdatedIntent) 24 | } 25 | 26 | fun getTextToShare(context: Context, local: Local): String { 27 | return context.getString(R.string.share_text, 28 | local.description, 29 | local.address, 30 | local.descriptionSubCategories, 31 | "http://maps.google.com/maps?saddr=" + local.latitude + "," + local.longitude) 32 | } 33 | 34 | 35 | fun getIdDescriptionCategory(id: Long): Int { 36 | if (id == Constants.Menu.ACCOMMODATION) { 37 | return R.string.menu_accommodation 38 | } 39 | 40 | if (id == Constants.Menu.ALIMENTATION) { 41 | return R.string.menu_alimentation 42 | } 43 | 44 | if (id == Constants.Menu.ATTRACTIVE) { 45 | return R.string.menu_attractive 46 | } 47 | 48 | return 0 49 | } 50 | 51 | fun getIdImageCategory(id: Long): Int { 52 | if (id == Constants.Menu.ACCOMMODATION) { 53 | return R.drawable.ic_place_hotel_48dp 54 | } 55 | 56 | if (id == Constants.Menu.ALIMENTATION) { 57 | return R.drawable.ic_place_dining_48dp 58 | } 59 | 60 | if (id == Constants.Menu.ATTRACTIVE) { 61 | return R.drawable.ic_place_terrain_48dp 62 | } 63 | 64 | return 0 65 | } 66 | 67 | val menus: List 68 | get() { 69 | val menus = ArrayList() 70 | menus.add(MainMenu(1, R.string.menu_local, R.drawable.ic_map_white_36dp, R.color.green_500)) 71 | menus.add(MainMenu(Constants.Menu.ALIMENTATION, R.string.menu_alimentation, R.drawable.ic_local_dining_white_36dp, R.color.blue_500)) 72 | menus.add(MainMenu(Constants.Menu.ATTRACTIVE, R.string.menu_attractive, R.drawable.ic_terrain_white_36dp, R.color.cyan_500)) 73 | menus.add(MainMenu(Constants.Menu.ACCOMMODATION, R.string.menu_accommodation, R.drawable.ic_local_hotel_white_36dp, R.color.purple_500)) 74 | return menus 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/guideapp/utilities/ViewUtil.kt: -------------------------------------------------------------------------------- 1 | package com.guideapp.utilities 2 | 3 | import android.content.Context 4 | import android.view.View 5 | import android.view.animation.AnimationUtils 6 | import com.guideapp.R 7 | 8 | object ViewUtil { 9 | fun showViewLayout(context: Context, view: View) { 10 | var animation = AnimationUtils.loadAnimation(context, R.anim.abc_slide_out_bottom) 11 | animation.duration = 200 12 | view.startAnimation(animation) 13 | view.visibility = View.GONE 14 | 15 | animation = AnimationUtils.loadAnimation(context, R.anim.abc_slide_in_bottom) 16 | animation.duration = 400 17 | view.startAnimation(animation) 18 | view.visibility = View.VISIBLE 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/gruta.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/gruta.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_apps_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_apps_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_apps_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_apps_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_apps_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_apps_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_apps_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_apps_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_bookmark_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_bookmark_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_bookmark_border_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_bookmark_border_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_bookmark_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_bookmark_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_call_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_call_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_directions_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_directions_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_info_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_info_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_language_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_language_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_local_dining_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_local_dining_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_local_dining_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_local_dining_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_local_hotel_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_local_hotel_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_location_on_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_location_on_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_location_on_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_location_on_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_map_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_map_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_public_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_public_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_restart_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_restart_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_terrain_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-hdpi/ic_terrain_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_apps_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_apps_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_apps_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_apps_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_apps_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_apps_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_apps_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_apps_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_bookmark_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_bookmark_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_bookmark_border_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_bookmark_border_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_bookmark_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_bookmark_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_call_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_call_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_directions_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_directions_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_info_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_info_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_language_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_language_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_local_dining_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_local_dining_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_local_dining_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_local_dining_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_local_hotel_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_local_hotel_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_location_on_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_location_on_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_location_on_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_location_on_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_map_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_map_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_public_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_public_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_restart_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_restart_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_terrain_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-mdpi/ic_terrain_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/appwidget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-nodpi/appwidget_preview.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_apps_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_apps_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_apps_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_apps_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_apps_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_apps_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_apps_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_apps_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_bookmark_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_bookmark_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_bookmark_border_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_bookmark_border_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_bookmark_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_bookmark_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_call_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_call_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_directions_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_directions_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_info_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_info_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_language_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_language_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_local_dining_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_local_dining_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_local_dining_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_local_dining_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_local_hotel_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_local_hotel_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_location_on_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_location_on_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_location_on_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_location_on_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_map_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_map_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_public_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_public_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_restart_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_restart_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_terrain_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xhdpi/ic_terrain_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_apps_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_apps_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_apps_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_apps_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_apps_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_apps_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_apps_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_apps_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_bookmark_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_bookmark_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_bookmark_border_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_bookmark_border_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_bookmark_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_bookmark_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_call_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_call_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_directions_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_directions_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_info_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_info_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_language_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_language_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_local_dining_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_local_dining_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_local_dining_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_local_dining_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_local_hotel_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_local_hotel_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_location_on_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_location_on_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_location_on_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_location_on_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_map_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_map_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_public_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_public_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_restart_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_restart_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_terrain_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxhdpi/ic_terrain_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_apps_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_apps_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_apps_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_apps_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_apps_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_apps_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_apps_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_apps_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_bookmark_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_bookmark_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_bookmark_border_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_bookmark_border_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_bookmark_grey_400_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_bookmark_grey_400_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_call_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_call_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_directions_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_directions_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_info_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_info_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_language_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_language_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_local_dining_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_local_dining_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_local_hotel_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_local_hotel_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_location_on_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_location_on_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_map_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_map_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_place_dining_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_place_dining_48dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_place_hotel_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_place_hotel_48dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_place_terrain_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_place_terrain_48dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_public_grey_72_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_public_grey_72_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_terrain_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/drawable-xxxhdpi/ic_terrain_white_36dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/action_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/action_background_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_local.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 19 | 20 | 21 | 26 | 27 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_map.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_favorite.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_local.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_map.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 19 | 20 | 30 | 31 | 42 | 43 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_menu.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_local_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_local_favorite.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 23 | 24 | 34 | 35 | 47 | 48 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_local_map.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 21 | 22 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 26 | 27 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar_transparent.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 25 | 26 | 34 | 35 | 36 | 41 | 42 | 49 | 50 | 59 | 60 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_detail_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 24 | 25 | 35 | 36 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_detail.xml: -------------------------------------------------------------------------------- 1 |

5 | 6 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thaleslima/GuideApp/11610228921dd7b0a5606bce1f585e3f0854a177/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/transition-v21/details_window_enter_transition.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/transition-v21/details_window_return_transition.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | #000000 5 | 6 | #15FFFFFF 7 | 8 | #FFFFFF 9 | #bdbdbd 10 | #f5f5f5 11 | 12 | #212121 13 | #727272 14 | #4CAF50 15 | 16 | 17 | #F5F5F5 18 | #E0E0E0 19 | #E0E0E0 20 | 21 | #FFFFFF 22 | 23 | #55000000 24 | #00000000 25 | 26 | #536DFE 27 | #EEEEEE 28 | 29 | #4CAF50 30 | #2196F3 31 | #9C27B0 32 | #00BCD4 33 | #78909C 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 4dp 6 | 2dp 7 | 8 | 32dp 9 | 10 | 16dp 11 | 16dp 12 | 13 | 4dp 14 | 250dp 15 | 16 | 8dp 17 | 250dp 18 | 180dp 19 | 220dp 20 | @dimen/widget_detail_default_height 21 | 22 | 1dp 23 | 200dp 24 | 0.5dp 25 | 1.5dp 26 | 27 | 28 | 29 | 2dp 30 | 2dp 31 | 50dp 32 | 36dp 33 | 50dp 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Delfinópolis (Brasil) 3 | 4 | Delfinópolis 5 | TN_DetailIcon 6 | ca-app-pub-3940256099942544/6300978111 7 | com.guideapp 8 | loc-status 9 | 10 | Nenhuma informação disponível 11 | Verifique sua conexão e tente novamente 12 | Tivemos um problema ao\ncarregar os dados 13 | Tentar novamente 14 | Você ainda não salvou nenhum local em seus favoritos 15 | 16 | 17 | 18 | Lugares no mapa 19 | Alimentação 20 | Atrativos 21 | hospedagem 22 | 23 | 24 | 25 | Local salvo em favoritos 26 | Local removido em favoritos 27 | Compartilhar local 28 | Local: %1$s\nEndereço: %2$s\nTipo: %3$s\n\n%4$s 29 | Ir 30 | Ligar 31 | WebSite 32 | 33 | 34 | 35 | Meus lugares 36 | Você ainda não salvou nenhum local em seus favoritos 37 | Meus lugares 38 | 39 | 40 | 41 | Imagem do local 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 |