[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.idea\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: android\njdk:\n  - oraclejdk8\nandroid:\n  components:\n    # Uncomment the lines below if you want to\n    # use the latest revision of Android SDK Tools\n    - platform-tools\n    - tools\n\n    # The BuildTools version used by your project\n    - build-tools-28.0.0\n\n    # The SDK version used to compile your project\n    - android-28\n\n    # Additional components\n    - extra-google-google_play_services\n    - extra-google-m2repository\n    - extra-android-m2repository\n\nbefore_install:\n  - export JAVA8_HOME=/usr/lib/jvm/java-8-oracle\n  - export JAVA_HOME=$JAVA8_HOME\nafter_success:\n  - bash <(curl -s https://codecov.io/bash)\nbefore_cache:\n  - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock\nscript:\n  - ./gradlew build jacocoTestReport assembleAndroidTest\n  - ./gradlew connectedCheck\ncache:\n  directories:\n    - $HOME/.gradle/caches/\n    - $HOME/.gradle/wrapper/"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## Version 1.0.5\n\n* Update dependencies\n* Fix bugs #55, #38\n\n## Version 1.0.4\n\n* Update dependencies\n* BREAKING: Removed Retrolambda. Since this library uses Java 8 features, from v1.0.4 on, only Android gradle plugin 3.0.0 or higher is supported.\n\n## Version 1.0.3\n\n* Update dependencies (Play Services 10.2.1)\n* Fix bug which lead to leaks when using `rxLocation.location().updates() (#26)\n* BREAKING: Removed `GoogleAPIClientSingle` and replaced it with `GoogleApiClientFlowable` (#22)\n* BREAKING: Replace uppercase \"API\" in `GoogleApiConnectionException` and `GoogleApiConnectionSuspendedException` with \"Api\"\n\n## Version 1.0.2\n\n* Update dependencies (RxJava 2.0.7, Play Services 10.2.0)\n* Fix bug which made activity recognition API unusable (#24)\n* Add `StatusExceptionResumeNextTransformer` to help with handlig the resolution of a `Result` yourself (#17)\n\n## Version 1.0.1\n\n* Add consumer ProGuard rules. (#7, #8 – thanks Evisceration)"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2016 Patrick Löwenstein\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."
  },
  {
    "path": "NOTICE",
    "content": "RxLocation\nCopyright 2016 Patrick Löwenstein\n\n===========================\nApache License, Version 2.0\n===========================\n\nThe following components are provided under the Apache License, Version 2.0. See project link for details.\n\n------\nRxJava\n------\n\nio.reactivex:rxjava\nhttps://github.com/ReactiveX/RxJava\n\nCopyright 2013 Netflix, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n\n------------------------\nAndroid-ReactiveLocation\n------------------------\n\npl.charmas.android:android-reactive-location\nhttps://github.com/mcharmas/Android-ReactiveLocation\n\n\nCopyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Reactive Location API Library for Android\n\n[![Build Status](https://travis-ci.org/patloew/RxLocation.svg?branch=master)](https://travis-ci.org/patloew/RxLocation) [![codecov](https://codecov.io/gh/patloew/RxLocation/branch/master/graph/badge.svg)](https://codecov.io/gh/patloew/RxLocation) [![Download](https://api.bintray.com/packages/patloew/maven/RxLocation/images/download.svg) ](https://bintray.com/patloew/maven/RxLocation/_latestVersion) [![API](https://img.shields.io/badge/API-14%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=14)\n\n**This library is now deprecated and not maintained anymore. Please switch to the [CoLocation](https://github.com/patloew/CoLocation) library.**\n\nThis library wraps the Location APIs in [RxJava 2](https://github.com/ReactiveX/RxJava/tree/2.x) Observables, Singles, Maybes and Completables. No more managing GoogleApiClients! Also, the resolution of the location settings check is optionally handled by the lib.\n\nFor [RxJava 1](https://github.com/ReactiveX/RxJava/tree/1.x), please take a look at the [Android-ReactiveLocation](https://github.com/mcharmas/Android-ReactiveLocation) library by Michał Charmas.\n\n# Usage\n\nCreate an RxLocation instance once, preferably in your Application's `onCreate()` or by using a dependency injection framework. The RxLocation class is very similar to the classes provided by the Location APIs. Instead of `LocationServices.FusedLocationApi.getLastLocation(apiClient)` you can use `rxLocation.location().lastLocation()`. Make sure to have the Location and Activity Recognition permissions from Marshmallow on, if they are needed by your API requests.\n\nExample:\n\n```java\n// Create one instance and share it\nRxLocation rxLocation = new RxLocation(context);\n\nLocationRequest locationRequest = LocationRequest.create()\n                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)\n                .setInterval(5000);\n\nrxLocation.location().updates(locationRequest)\n\t\t.flatMap(location -> rxLocation.geocoding().fromLocation(location).toObservable())\n\t\t.subscribe(address -> {\n\t\t\t/* do something */\n\t\t});\n```\n\nThe following APIs are wrapped by this library:\n\n* `ActivityRecognition.ActivityRecognitionApi` via `rxLocation.activity()`\n* `LocationServices.FusedLocationApi` via `rxLocation.location()`\n* `LocationServices.GeofencingApi` via `rxLocation.geofencing()`\n* `LocationServices.SettingsApi` via `rxLocation.settings()`\n* `Geocoder` via `rxLocation.geocoding()`\n\nChecking the location settings is simplified with this library, by providing a `Single<Boolean>` via `rxLocation.settings().checkAndHandleResolution(locationRequest)`, which handles showing the resolution dialog if the location settings do not satisfy your request. It returns `true` if the settings are satisfied (optionally after showing the dialog, if a resolution is possible), and `false` otherwise. If you want to handle the `LocationSettingsResult` yourself, you can do so via `rxLocation.settings().check(locationRequest)`.\n\nAn optional global default timeout for all Location API requests made through the library can be set via `rxLocation.setDefaultTimeout(...)`. In addition, timeouts can be set when creating a new Observable by providing timeout parameters, e.g. `rxLocation.geofencing().add(geofencingRequest, pendingIntent, 15, TimeUnit.SECONDS)`. These parameters override the default timeout. When a timeout occurs, a StatusException is provided via `onError()`. Keep in mind that these timeouts only apply to calls to the Location API, e.g. when registering a location update listener. As an example, the timeout provided to `rxLocation.location().updates(locationRequest, 15, TimeUnit.Seconds)` does *not* mean that you will not receive location updates anymore after 15 seconds. Use `setExpirationDuration()` on your locationRequest for this use case.\n\nDon't forget to dispose of your Subscriber/Observer when you are finished:\n\n```java\nDisposable disposable = rxLocation.location().updates(locationRequest).subscribe();\n\n// Dispose of your Observer when you no longer need updates\ndisposable.dispose();\n```\n\nAs an alternative, multiple Disposables can be collected to dipose of at once via `CompositeDisposable`:\n\n```java\nCompositeDisposable disposable = new CompositeDisposable();\ndisposable.add(rxLocation.location().updates(locationRequest).subscribe());\n\n// Dispose of all collected Disposables at once, e.g. in onDestroy()\ndisposable.clear();\n```\n\nYou can also obtain a `Flowable<GoogleApiClient>`, which connects on subscribe and disconnects on dispose via `GoogleApiClientFlowable.create(...)`.\n\nThe following Exceptions are thrown in the lib and provided via `onError()`:\n\n* `StatusException`: When the call to the Location APIs was not successful or timed out\n* `GoogleApiConnectionException`: When connecting to the GoogleApiClient was not successful.\n* `GoogleApiConnectionSuspendedException`: When the GoogleApiClient connection was suspended.\n* `SecurityException`: When you try to call an API without proper permissions.\n* `LocationSettingsNotSatisfiedException`: When you use `rxLocation.settings().checkAndHandleResolutionCompletable(...)` and the location settings were not satisfied, even after handling the resolution.\n\nWhen using the Geocoding component of RxLocation, exceptions can be thrown even after disposing, which can lead to app crashes. To prevent this, install a global `RxJavaPlugins.setErrorHandler()`, e.g. in your Application class.\n\n# Sample\n\nA basic sample app is available in the `sample` project.\n\n# Setup\n\nThe latest version 1.0.5 of this library is available on Maven Central. Add the following to your `build.gradle`:\n\n```groovy\ndependencies {\n    compile 'com.patloew.rxlocation:rxlocation:1.0.5'\n    compile 'com.google.android.gms:play-services-location:15.0.0'\n}\n```\n\nIf you want to use a newer version of Google Play Services, declare the newer version in your `build.gradle`. This then overrides the version declared in the library.\n\nFrom v1.0.4 on, RxLocation only works with Android gradle plugin 3.0.0 or higher, since it uses Java 8 language features.  \nAnd don't forget to set the source code compatibility to Java 8:\n\n```groovy\nandroid {\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n}\n```\n\n# Testing\n\nWhen unit testing your app's classes, RxLocation behavior can be mocked easily. See the `MainPresenterTest` in the `sample` project for an example test.\n\n# Credits\n\nThe code for managing the GoogleApiClient was adapted from the [Android-ReactiveLocation](https://github.com/mcharmas/Android-ReactiveLocation) library by Michał Charmas, which is licensed under the Apache License, Version 2.0.\n\n# Donations\n\nIf you like the library and want to support the creator for development/maintenance, you can make a donation in Bitcoin to `bc1q5uejfyl2kskhhveg7lx4fcwgv8hz88r92yzjsu`. Thank you!\n\n# License\n\n\tCopyright 2016 Patrick Löwenstein\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use this file except in compliance with the License.\n\tYou may obtain a copy of the License at\n\n\t    http://www.apache.org/licenses/LICENSE-2.0\n\n\tUnless required by applicable law or agreed to in writing, software\n\tdistributed under the License is distributed on an \"AS IS\" BASIS,\n\tWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\tSee the License for the specific language governing permissions and\n\tlimitations under the License.\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.1.3'\n\n        classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2'\n        classpath \"com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0\"\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\napply plugin: \"com.vanniktech.android.junit.jacoco\"\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.0-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\norg.gradle.jvmargs=-Xmx2048m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\nGROUP=com.patloew.rxlocation\nPOM_ARTIFACT_ID=rxlocation\nVERSION_NAME=1.0.5\n\nPOM_NAME=rxlocation\nPOM_PACKAGING=aar\n\nPOM_DESCRIPTION=Reactive Location APIs Library for Android and RxJava 2\nPOM_INCEPTION_YEAR=2016\n\nPOM_URL=https://github.com/patloew/RxLocation\nPOM_SCM_URL=https://github.com/patloew/RxLocation\nPOM_SCM_CONNECTION=scm:git@github.com:patloew/RxLocation.git\nPOM_SCM_DEV_CONNECTION=scm:git@github.com:patloew/RxLocation.git\n\nPOM_LICENCE_NAME=The Apache Software License, Version 2.0\nPOM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt\nPOM_LICENCE_DIST=repo\n\nPOM_DEVELOPER_ID=patloew\nPOM_DEVELOPER_NAME=Patrick Lwenstein\nPOM_DEVELOPER_URL=https://github.com/patloew"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "library/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "library/build.gradle",
    "content": "ext {\n    RELEASE_REPOSITORY_URL = \"https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/\"\n    SNAPSHOT_REPOSITORY_URL = \"https://s01.oss.sonatype.org/content/repositories/snapshots/\"\n}\n\napply plugin: 'com.android.library'\napply plugin: 'com.vanniktech.maven.publish'\n\nandroid {\n    compileSdkVersion 28\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 28\n        versionCode 5\n        versionName \"1.0.5\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n            consumerProguardFiles 'proguard-rules-consumer.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    testOptions {\n        unitTests.returnDefaultValues = true\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n    api fileTree(dir: 'libs', include: ['*.jar'])\n    api 'io.reactivex.rxjava2:rxjava:2.1.14'\n    // Updating play services breaks unit tests\n    api 'com.google.android.gms:play-services-location:10.2.1'\n\n    testImplementation 'junit:junit:4.12'\n    testImplementation 'org.mockito:mockito-core:2.18.3'\n    testImplementation \"org.powermock:powermock-module-junit4:2.0.0-beta.5\"\n    testImplementation \"org.powermock:powermock-api-mockito2:2.0.0-beta.5\"\n}\n\ntask generateSourcesJar(type: Jar) {\n    from android.sourceSets.main.java.srcDirs\n    classifier 'sources'\n}\n\ntask generateJavadocs(type: Javadoc) {\n    source = android.sourceSets.main.java.srcDirs\n    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))\n}\n\ntask generateJavadocsJar(type: Jar) {\n    from generateJavadocs.destinationDir\n    classifier 'javadoc'\n}\n\ngenerateJavadocsJar.dependsOn generateJavadocs\n\nartifacts {\n    archives generateJavadocsJar\n    archives generateSourcesJar\n}"
  },
  {
    "path": "library/proguard-rules-consumer.pro",
    "content": "-dontwarn java.lang.invoke.*\n"
  },
  {
    "path": "library/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/patricklowenstein/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "library/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.patloew.rxlocation\">\n\n    <application>\n\n        <activity\n            android:name=\"com.patloew.rxlocation.LocationSettingsActivity\"\n            android:launchMode=\"singleTask\"\n            android:theme=\"@android:style/Theme.Translucent.NoTitleBar\" />\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/ActivityRecognition.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.RequiresPermission;\n\nimport com.google.android.gms.common.api.Status;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Single;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class ActivityRecognition {\n\n    private final RxLocation rxLocation;\n\n    ActivityRecognition(RxLocation rxLocation) {\n        this.rxLocation = rxLocation;\n    }\n\n\n    // Request Updates\n\n    @RequiresPermission(\"com.google.android.gms.permission.ACTIVITY_RECOGNITION\")\n    public Single<Status> requestUpdates(long detectionIntervalMillis, @NonNull PendingIntent pendingIntent) {\n        return requestUpdatesInternal(detectionIntervalMillis, pendingIntent, null, null);\n    }\n\n    @RequiresPermission(\"com.google.android.gms.permission.ACTIVITY_RECOGNITION\")\n    public Single<Status> requestUpdates(long detectionIntervalMillis, @NonNull PendingIntent pendingIntent, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return requestUpdatesInternal(detectionIntervalMillis, pendingIntent, timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> requestUpdatesInternal(long detectionIntervalMillis, PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {\n        return Single.create(new ActivityRequestUpdatesSingleOnSubscribe(rxLocation, detectionIntervalMillis, pendingIntent, timeout, timeUnit));\n    }\n\n    // Remove Updates\n\n    @RequiresPermission(\"com.google.android.gms.permission.ACTIVITY_RECOGNITION\")\n    public Single<Status> removeUpdates(@NonNull PendingIntent pendingIntent) {\n        return removeUpdatesInternal(pendingIntent, null, null);\n    }\n\n    @RequiresPermission(\"com.google.android.gms.permission.ACTIVITY_RECOGNITION\")\n    public Single<Status> removeUpdates(@NonNull PendingIntent pendingIntent, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return removeUpdatesInternal(pendingIntent, timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> removeUpdatesInternal(PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {\n        return Single.create(new ActivityRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, timeout, timeUnit));\n    }\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/ActivityRemoveUpdatesSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass ActivityRemoveUpdatesSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    final PendingIntent pendingIntent;\n\n    ActivityRemoveUpdatesSingleOnSubscribe(@NonNull RxLocation rxLocation, PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n        this.pendingIntent = pendingIntent;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        //noinspection MissingPermission\n        setupLocationPendingResult(\n                ActivityRecognition.ActivityRecognitionApi.removeActivityUpdates(apiClient, pendingIntent),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/ActivityRequestUpdatesSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass ActivityRequestUpdatesSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    final long detectionIntervalMillis;\n    final PendingIntent pendingIntent;\n\n    ActivityRequestUpdatesSingleOnSubscribe(@NonNull RxLocation rxLocation, long detectionIntervalMillis, PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n        this.detectionIntervalMillis = detectionIntervalMillis;\n        this.pendingIntent = pendingIntent;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        //noinspection MissingPermission\n        setupLocationPendingResult(\n                ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(apiClient, detectionIntervalMillis, pendingIntent),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/FusedLocation.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.Manifest;\nimport android.app.PendingIntent;\nimport android.location.Location;\nimport android.os.Looper;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.RequiresPermission;\n\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationRequest;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.BackpressureStrategy;\nimport io.reactivex.Flowable;\nimport io.reactivex.Maybe;\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class FusedLocation {\n\n    private final RxLocation rxLocation;\n\n    FusedLocation(RxLocation rxLocation) {\n        this.rxLocation = rxLocation;\n    }\n\n\n    // Flush\n\n    public Single<Status> flush() {\n        return flushInternal(null, null);\n    }\n\n    public Single<Status> flush(long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return flushInternal(timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> flushInternal(Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new LocationFlushSingleOnSubscribe(rxLocation, timeoutTime, timeoutUnit));\n    }\n\n\n    // Last Location\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Maybe<Location> lastLocation() {\n        return Maybe.create(new LocationLastMaybeOnSubscribe(rxLocation));\n    }\n\n\n    // Location Availability\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Single<Boolean> isLocationAvailable() {\n        return Single.create(new LocationAvailabilitySingleOnSubscribe(rxLocation));\n    }\n\n\n    // Location Updates\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Observable<Location> updates(@NonNull LocationRequest locationRequest) {\n        return updatesInternal(locationRequest, null, null, null, BackpressureStrategy.MISSING).toObservable();\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Observable<Location> updates(@NonNull LocationRequest locationRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return updatesInternal(locationRequest, null, timeoutTime, timeoutUnit, BackpressureStrategy.MISSING).toObservable();\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Observable<Location> updates(@NonNull LocationRequest locationRequest, @NonNull Looper looper) {\n        return updatesInternal(locationRequest, looper, null, null, BackpressureStrategy.MISSING).toObservable();\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Observable<Location> updates(@NonNull LocationRequest locationRequest, @NonNull Looper looper, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return updatesInternal(locationRequest, looper, timeoutTime, timeoutUnit, BackpressureStrategy.MISSING).toObservable();\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Flowable<Location> updates(@NonNull LocationRequest locationRequest, BackpressureStrategy backpressureStrategy) {\n        return updatesInternal(locationRequest, null, null, null, backpressureStrategy);\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Flowable<Location> updates(@NonNull LocationRequest locationRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit, BackpressureStrategy backpressureStrategy) {\n        return updatesInternal(locationRequest, null, timeoutTime, timeoutUnit, backpressureStrategy);\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Flowable<Location> updates(@NonNull LocationRequest locationRequest, @NonNull Looper looper, BackpressureStrategy backpressureStrategy) {\n        return updatesInternal(locationRequest, looper, null, null, backpressureStrategy);\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Flowable<Location> updates(@NonNull LocationRequest locationRequest, @NonNull Looper looper, long timeoutTime, @NonNull TimeUnit timeoutUnit, BackpressureStrategy backpressureStrategy) {\n        return updatesInternal(locationRequest, looper, timeoutTime, timeoutUnit, backpressureStrategy);\n    }\n\n    private Flowable<Location> updatesInternal(LocationRequest locationRequest, Looper looper, Long timeoutTime, TimeUnit timeoutUnit, BackpressureStrategy backpressureStrategy) {\n        return Flowable.create(new LocationUpdatesFlowableOnSubscribe(rxLocation, locationRequest, looper, timeoutTime, timeoutUnit), backpressureStrategy);\n    }\n\n\n    // Request Updates\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Single<Status> requestUpdates(@NonNull LocationRequest locationRequest, @NonNull PendingIntent pendingIntent) {\n        return requestUpdatesInternal(locationRequest, pendingIntent, null, null);\n    }\n\n    @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})\n    public Single<Status> requestUpdates(@NonNull LocationRequest locationRequest, @NonNull PendingIntent pendingIntent, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return requestUpdatesInternal(locationRequest, pendingIntent, timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> requestUpdatesInternal(LocationRequest locationRequest, PendingIntent pendingIntent, Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new LocationRequestUpdatesSingleOnSubscribe(rxLocation, locationRequest, pendingIntent, timeoutTime, timeoutUnit));\n    }\n\n\n    // Remove Updates\n\n    public Single<Status> removeUpdates(@NonNull PendingIntent pendingIntent) {\n        return removeUpdatesInternal(pendingIntent, null, null);\n    }\n\n    public Single<Status> removeUpdates(@NonNull PendingIntent pendingIntent, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return removeUpdatesInternal(pendingIntent, timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> removeUpdatesInternal(PendingIntent pendingIntent, Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new LocationRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, timeoutTime, timeoutUnit));\n    }\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/Geocoding.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.location.Address;\nimport android.location.Geocoder;\nimport android.location.Location;\nimport android.support.annotation.NonNull;\n\nimport java.util.List;\nimport java.util.Locale;\n\nimport io.reactivex.Maybe;\nimport io.reactivex.Single;\nimport io.reactivex.functions.Function;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class Geocoding {\n\n    private static final Function<List<Address>, Maybe<Address>> ADDRESS_MAYBE_FUNCTION = addresses -> addresses.isEmpty() ? Maybe.empty(): Maybe.just(addresses.get(0));\n\n    private final Context context;\n\n    Geocoding(Context context) {\n        this.context = context;\n    }\n\n    Geocoder getGeocoder(Locale locale) {\n        if(locale != null) {\n            return new Geocoder(context, locale);\n        } else {\n            return new Geocoder(context);\n        }\n    }\n\n\n\n    public Maybe<Address> fromLocation(@NonNull Location location) {\n        return fromLocation(null, location, 1).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Maybe<Address> fromLocation(Locale locale, @NonNull Location location) {\n        return fromLocation(locale, location, 1).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Single<List<Address>> fromLocation(@NonNull Location location, int maxResults) {\n        return fromLocation(null, location, maxResults);\n    }\n\n    public Single<List<Address>> fromLocation(Locale locale, @NonNull Location location, int maxResults) {\n        return Single.fromCallable(() -> getGeocoder(locale).getFromLocation(location.getLatitude(), location.getLongitude(), maxResults));\n    }\n\n\n\n    public Maybe<Address> fromLocation(double latitude, double longitude) {\n        return fromLocation(null, latitude, longitude, 1).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Maybe<Address> fromLocation(Locale locale, double latitude, double longitude) {\n        return fromLocation(locale, latitude, longitude, 1).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Single<List<Address>> fromLocation(double latitude, double longitude, int maxResults) {\n        return fromLocation(null, latitude, longitude, maxResults);\n    }\n\n    public Single<List<Address>> fromLocation(Locale locale, double latitude, double longitude, int maxResults) {\n        return Single.fromCallable(() -> getGeocoder(locale).getFromLocation(latitude, longitude, maxResults));\n    }\n\n\n\n    public Maybe<Address> fromLocationName(@NonNull String locationName, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude) {\n        return fromLocationName(null, locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Maybe<Address> fromLocationName(Locale locale, @NonNull String locationName, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude) {\n        return fromLocationName(locale, locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Single<List<Address>> fromLocationName(@NonNull String locationName, int maxResults, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude) {\n        return fromLocationName(null, locationName, maxResults, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude);\n    }\n\n    public Single<List<Address>> fromLocationName(Locale locale, @NonNull String locationName, int maxResults, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude) {\n        return Single.fromCallable(() -> getGeocoder(locale).getFromLocationName(locationName, maxResults, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude));\n    }\n\n\n\n    public Maybe<Address> fromLocationName(@NonNull String locationName) {\n        return fromLocationName(null, locationName, 1).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Maybe<Address> fromLocationName(Locale locale, @NonNull String locationName) {\n        return fromLocationName(locale, locationName, 1).flatMapMaybe(ADDRESS_MAYBE_FUNCTION);\n    }\n\n    public Single<List<Address>> fromLocationName(@NonNull String locationName, int maxResults) {\n        return fromLocationName(null, locationName, maxResults);\n    }\n\n    public Single<List<Address>> fromLocationName(Locale locale, @NonNull String locationName, int maxResults) {\n        return Single.fromCallable(() -> getGeocoder(locale).getFromLocationName(locationName, maxResults));\n    }\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/Geofencing.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.Manifest;\nimport android.app.PendingIntent;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.RequiresPermission;\n\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.GeofencingRequest;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Single;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class Geofencing {\n\n    private final RxLocation rxLocation;\n\n    Geofencing(RxLocation rxLocation) {\n        this.rxLocation = rxLocation;\n    }\n\n\n    // Add\n\n    @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)\n    public Single<Status> add(@NonNull GeofencingRequest geofencingRequest, @NonNull PendingIntent pendingIntent) {\n        return addInternal(geofencingRequest, pendingIntent, null, null);\n    }\n\n    @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)\n    public Single<Status> add(@NonNull GeofencingRequest geofencingRequest, @NonNull PendingIntent pendingIntent, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return addInternal(geofencingRequest, pendingIntent, timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> addInternal(GeofencingRequest geofencingRequest, PendingIntent pendingIntent, Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new GeofencingAddSingleOnSubscribe(rxLocation, geofencingRequest, pendingIntent, timeoutTime, timeoutUnit));\n    }\n\n\n    // Remove\n\n    public Single<Status> remove(@NonNull List<String> geofenceRequestIds) {\n        return removeInternal(geofenceRequestIds, null, null, null);\n    }\n\n    public Single<Status> remove(@NonNull List<String> geofenceRequestIds, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return removeInternal(geofenceRequestIds, null, timeoutTime, timeoutUnit);\n    }\n\n    public Single<Status> remove(@NonNull PendingIntent pendingIntent) {\n        return removeInternal(null, pendingIntent, null, null);\n    }\n\n    public Single<Status> remove(@NonNull PendingIntent pendingIntent, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return removeInternal(null, pendingIntent, timeoutTime, timeoutUnit);\n    }\n\n    private Single<Status> removeInternal(List<String> geofenceRequestIds, PendingIntent pendingIntent, Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new GeofencingRemoveSingleOnSubscribe(rxLocation, geofenceRequestIds, pendingIntent, timeoutTime, timeoutUnit));\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/GeofencingAddSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.GeofencingRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass GeofencingAddSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    final GeofencingRequest geofencingRequest;\n    final PendingIntent pendingIntent;\n\n    GeofencingAddSingleOnSubscribe(RxLocation rxLocation, GeofencingRequest geofencingRequest, PendingIntent pendingIntent, Long timeoutTime, TimeUnit timeoutUnit) {\n        super(rxLocation, timeoutTime, timeoutUnit);\n        this.geofencingRequest = geofencingRequest;\n        this.pendingIntent = pendingIntent;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        //noinspection MissingPermission\n        setupLocationPendingResult(\n                LocationServices.GeofencingApi.addGeofences(apiClient, geofencingRequest, pendingIntent),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/GeofencingRemoveSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.ResultCallback;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass GeofencingRemoveSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    final List<String> geofenceRequestIds;\n    final PendingIntent pendingIntent;\n\n    GeofencingRemoveSingleOnSubscribe(RxLocation rxLocation, List<String> geofenceRequestIds, PendingIntent pendingIntent, Long timeoutTime, TimeUnit timeoutUnit) {\n        super(rxLocation, timeoutTime, timeoutUnit);\n        this.geofenceRequestIds = geofenceRequestIds;\n        this.pendingIntent = pendingIntent;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        ResultCallback<Status> resultCallback = SingleResultCallBack.get(emitter);\n\n        if (geofenceRequestIds != null) {\n            setupLocationPendingResult(LocationServices.GeofencingApi.removeGeofences(apiClient, geofenceRequestIds), resultCallback);\n        } else {\n            setupLocationPendingResult(LocationServices.GeofencingApi.removeGeofences(apiClient, pendingIntent), resultCallback);\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/GoogleApiClientFlowable.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Scope;\n\nimport io.reactivex.BackpressureStrategy;\nimport io.reactivex.Flowable;\nimport io.reactivex.FlowableEmitter;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------\n *\n * FILE MODIFIED by Patrick Löwenstein, 2016\n *\n */\npublic class GoogleApiClientFlowable extends RxLocationFlowableOnSubscribe<GoogleApiClient> {\n\n    GoogleApiClientFlowable(Context ctx, Api<? extends Api.ApiOptions.NotRequiredOptions>[] apis, Scope[] scopes) {\n        super(ctx, apis, scopes);\n    }\n\n    @SafeVarargs\n    public static Flowable<GoogleApiClient> create(@NonNull Context context, @NonNull Api<? extends Api.ApiOptions.NotRequiredOptions>... apis) {\n        return Flowable.create(new GoogleApiClientFlowable(context, apis, null), BackpressureStrategy.LATEST);\n    }\n\n    public static Flowable<GoogleApiClient> create(@NonNull Context context, @NonNull Api<? extends Api.ApiOptions.NotRequiredOptions>[] apis, Scope[] scopes) {\n        return Flowable.create(new GoogleApiClientFlowable(context, apis, scopes), BackpressureStrategy.LATEST);\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<GoogleApiClient> emitter) {\n        emitter.onNext(apiClient);\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/GoogleApiConnectionException.java",
    "content": "package com.patloew.rxlocation;\n\nimport com.google.android.gms.common.ConnectionResult;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npublic class GoogleApiConnectionException extends RuntimeException {\n    private final ConnectionResult connectionResult;\n\n    GoogleApiConnectionException(String detailMessage, ConnectionResult connectionResult) {\n        super(detailMessage);\n        this.connectionResult = connectionResult;\n    }\n\n    public ConnectionResult getConnectionResult() {\n        return connectionResult;\n    }\n\n    public boolean wasResolutionUnsuccessful() {\n        if (connectionResult != null) {\n            return connectionResult.hasResolution();\n        } else {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/GoogleApiConnectionSuspendedException.java",
    "content": "package com.patloew.rxlocation;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npublic class GoogleApiConnectionSuspendedException extends RuntimeException {\n    private final int cause;\n\n    GoogleApiConnectionSuspendedException(int cause) {\n        this.cause = cause;\n    }\n\n    public int getErrorCause() {\n        return cause;\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationAvailabilitySingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.location.LocationAvailability;\nimport com.google.android.gms.location.LocationServices;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass LocationAvailabilitySingleOnSubscribe extends RxLocationSingleOnSubscribe<Boolean> {\n\n    LocationAvailabilitySingleOnSubscribe(@NonNull RxLocation rxLocation) {\n        super(rxLocation, null, null);\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Boolean> emitter) {\n        //noinspection MissingPermission\n        LocationAvailability locationAvailability = LocationServices.FusedLocationApi.getLocationAvailability(apiClient);\n\n        if (locationAvailability != null) {\n            emitter.onSuccess(locationAvailability.isLocationAvailable());\n        } else {\n            emitter.onSuccess(false);\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationFlushSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass LocationFlushSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    LocationFlushSingleOnSubscribe(@NonNull RxLocation rxLocation, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        setupLocationPendingResult(\n                LocationServices.FusedLocationApi.flushLocations(apiClient),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationLastMaybeOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.location.Location;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.location.LocationServices;\n\nimport io.reactivex.MaybeEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass LocationLastMaybeOnSubscribe extends RxLocationMaybeOnSubscribe<Location> {\n\n    LocationLastMaybeOnSubscribe(@NonNull RxLocation rxLocation) {\n        super(rxLocation, null, null);\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, MaybeEmitter<Location> emitter) {\n        //noinspection MissingPermission\n        Location location = LocationServices.FusedLocationApi.getLastLocation(apiClient);\n\n        if (location != null) {\n            emitter.onSuccess(location);\n        } else {\n            emitter.onComplete();\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationRemoveUpdatesSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass LocationRemoveUpdatesSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    final PendingIntent pendingIntent;\n\n    LocationRemoveUpdatesSingleOnSubscribe(@NonNull RxLocation rxLocation, PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n        this.pendingIntent = pendingIntent;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        setupLocationPendingResult(\n                LocationServices.FusedLocationApi.removeLocationUpdates(apiClient, pendingIntent),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationRequestUpdatesSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass LocationRequestUpdatesSingleOnSubscribe extends RxLocationSingleOnSubscribe<Status> {\n\n    final LocationRequest locationRequest;\n    final PendingIntent pendingIntent;\n\n    LocationRequestUpdatesSingleOnSubscribe(@NonNull RxLocation rxLocation, LocationRequest locationRequest, PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n        this.locationRequest = locationRequest;\n        this.pendingIntent = pendingIntent;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Status> emitter) {\n        //noinspection MissingPermission\n        setupLocationPendingResult(\n                LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, pendingIntent),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationSettings.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.location.LocationRequest;\nimport com.google.android.gms.location.LocationSettingsRequest;\nimport com.google.android.gms.location.LocationSettingsResult;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Completable;\nimport io.reactivex.Single;\nimport io.reactivex.functions.Function;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class LocationSettings {\n\n    private final RxLocation rxLocation;\n\n    LocationSettings(RxLocation rxLocation) {\n        this.rxLocation = rxLocation;\n    }\n\n\n    LocationSettingsRequest.Builder getLocationSettingsRequestBuilder() {\n        return new LocationSettingsRequest.Builder();\n    }\n\n    // Check\n\n    public Single<LocationSettingsResult> check(@NonNull LocationRequest locationRequest) {\n        return checkInternal(getLocationSettingsRequestBuilder().addLocationRequest(locationRequest).build(), null, null);\n    }\n\n    public Single<LocationSettingsResult> check(@NonNull LocationRequest locationRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return checkInternal(getLocationSettingsRequestBuilder().addLocationRequest(locationRequest).build(), timeoutTime, timeoutUnit);\n    }\n\n    public Single<LocationSettingsResult> check(@NonNull LocationSettingsRequest locationSettingsRequest) {\n        return checkInternal(locationSettingsRequest, null, null);\n    }\n\n    public Single<LocationSettingsResult> check(@NonNull LocationSettingsRequest locationSettingsRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return checkInternal(locationSettingsRequest, timeoutTime, timeoutUnit);\n    }\n\n    private Single<LocationSettingsResult> checkInternal(LocationSettingsRequest locationSettingsRequest, Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new SettingsCheckSingleOnSubscribe(rxLocation, locationSettingsRequest, timeoutTime, timeoutUnit));\n    }\n\n    // Check and handle resolution\n\n    private static final Function<Boolean, Completable> CHECK_SETTINGS_COMPLETABLE_FUNCTION = success -> success ? Completable.complete() : Completable.error(new LocationSettingsNotSatisfiedException());\n\n\n    public Completable checkAndHandleResolutionCompletable(@NonNull LocationRequest locationRequest) {\n        return checkAndHandleResolution(locationRequest).flatMapCompletable(CHECK_SETTINGS_COMPLETABLE_FUNCTION);\n    }\n\n    public Single<Boolean> checkAndHandleResolution(@NonNull LocationRequest locationRequest) {\n        return checkAndHandleResolutionInternal(getLocationSettingsRequestBuilder().addLocationRequest(locationRequest).build(), null, null);\n    }\n\n\n    public Completable checkAndHandleResolutionCompletable(@NonNull LocationRequest locationRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return checkAndHandleResolution(locationRequest, timeoutTime, timeoutUnit).flatMapCompletable(CHECK_SETTINGS_COMPLETABLE_FUNCTION);\n    }\n\n    public Single<Boolean> checkAndHandleResolution(@NonNull LocationRequest locationRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return checkAndHandleResolutionInternal(getLocationSettingsRequestBuilder().addLocationRequest(locationRequest).build(), timeoutTime, timeoutUnit);\n    }\n\n\n    public Completable checkAndHandleResolutionCompletable(@NonNull LocationSettingsRequest locationSettingsRequest) {\n        return checkAndHandleResolutionInternal(locationSettingsRequest, null, null).flatMapCompletable(CHECK_SETTINGS_COMPLETABLE_FUNCTION);\n    }\n\n    public Single<Boolean> checkAndHandleResolution(@NonNull LocationSettingsRequest locationSettingsRequest) {\n        return checkAndHandleResolutionInternal(locationSettingsRequest, null, null);\n    }\n\n\n    public Completable checkAndHandleResolutionCompletable(@NonNull LocationSettingsRequest locationSettingsRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return checkAndHandleResolutionInternal(locationSettingsRequest, timeoutTime, timeoutUnit).flatMapCompletable(CHECK_SETTINGS_COMPLETABLE_FUNCTION);\n    }\n\n    public Single<Boolean> checkAndHandleResolution(@NonNull LocationSettingsRequest locationSettingsRequest, long timeoutTime, @NonNull TimeUnit timeoutUnit) {\n        return checkAndHandleResolutionInternal(locationSettingsRequest, timeoutTime, timeoutUnit);\n    }\n\n\n    private Single<Boolean> checkAndHandleResolutionInternal(LocationSettingsRequest locationSettingsRequest, Long timeoutTime, TimeUnit timeoutUnit) {\n        return Single.create(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, timeoutTime, timeoutUnit));\n    }\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationSettingsActivity.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.content.IntentSender;\nimport android.os.Bundle;\n\nimport com.google.android.gms.common.api.Status;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class LocationSettingsActivity extends Activity {\n\n    protected static final String ARG_STATUS = \"status\";\n    protected static final String ARG_ID = \"id\";\n\n    static final int REQUEST_CODE_RESOLUTION = 123;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        if (savedInstanceState == null) {\n            handleIntent();\n        }\n    }\n\n    @Override\n    protected void onNewIntent(Intent intent) {\n        setIntent(intent);\n        handleIntent();\n    }\n\n    void handleIntent() {\n        Status status = getIntent().getParcelableExtra(ARG_STATUS);\n\n        try {\n            status.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);\n        } catch (IntentSender.SendIntentException | NullPointerException e) {\n\n            setResolutionResultAndFinish(Activity.RESULT_CANCELED);\n        }\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        if (requestCode == REQUEST_CODE_RESOLUTION) {\n            setResolutionResultAndFinish(resultCode);\n        } else {\n            setResolutionResultAndFinish(Activity.RESULT_CANCELED);\n        }\n    }\n\n    void setResolutionResultAndFinish(int resultCode) {\n        SettingsCheckHandleSingleOnSubscribe.onResolutionResult(getIntent().getStringExtra(ARG_ID), resultCode);\n        finish();\n    }\n}"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationSettingsNotSatisfiedException.java",
    "content": "package com.patloew.rxlocation;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npublic class LocationSettingsNotSatisfiedException extends Exception {\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/LocationUpdatesFlowableOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.location.Location;\nimport android.os.Looper;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.location.LocationListener;\nimport com.google.android.gms.location.LocationRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.FlowableEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass LocationUpdatesFlowableOnSubscribe extends RxLocationFlowableOnSubscribe<Location> {\n\n    final LocationRequest locationRequest;\n    final Looper looper;\n    RxLocationListener locationListener;\n\n    protected LocationUpdatesFlowableOnSubscribe(@NonNull RxLocation rxLocation, LocationRequest locationRequest, Looper looper, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n        this.locationRequest = locationRequest;\n        this.looper = looper;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<Location> emitter) {\n        locationListener = new RxLocationListener(emitter);\n\n        //noinspection MissingPermission\n        setupLocationPendingResult(\n                LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, locationListener, looper),\n                new StatusErrorResultCallBack(emitter)\n        );\n    }\n\n    @Override\n    protected void onUnsubscribed(GoogleApiClient apiClient) {\n        if(locationListener != null) {\n            LocationServices.FusedLocationApi.removeLocationUpdates(apiClient, locationListener);\n            locationListener.onUnsubscribed();\n            locationListener = null;\n        }\n    }\n\n    static class RxLocationListener implements LocationListener {\n\n        private FlowableEmitter<Location> emitter;\n\n        RxLocationListener(FlowableEmitter<Location> emitter) {\n            this.emitter = emitter;\n        }\n\n        void onUnsubscribed() {\n            emitter = null;\n        }\n\n        @Override\n        public void onLocationChanged(Location location) {\n            if(emitter != null) { emitter.onNext(location); }\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/RxLocation.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\n\nimport java.util.concurrent.TimeUnit;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * -----------------------------\n *\n * Make sure to have the Location permission from on Marshmallow on,\n * if they are needed by your requests.\n */\npublic class RxLocation {\n\n    final Context ctx;\n    private final ActivityRecognition activityRecognition = new ActivityRecognition(this);\n    private final FusedLocation fusedLocation = new FusedLocation(this);\n    private final Geocoding geocoding;\n    private final Geofencing geofencing = new Geofencing(this);\n    private final LocationSettings locationSettings = new LocationSettings(this);\n    Long timeoutTime = null;\n    TimeUnit timeoutUnit = null;\n\n\n    /* Creates a new RxLocation instance.\n     *\n     * @param ctx Context.\n     */\n    public RxLocation(@NonNull Context ctx) {\n        this.ctx = ctx.getApplicationContext();\n        this.geocoding = new Geocoding(ctx.getApplicationContext());\n    }\n\n    /* Set a default timeout for all requests to the Location APIs made in the lib.\n     * When a timeout occurs, onError() is called with a StatusException.\n     */\n    public void setDefaultTimeout(long time, @NonNull TimeUnit timeUnit) {\n        if (timeUnit != null) {\n            timeoutTime = time;\n            timeoutUnit = timeUnit;\n        } else {\n            throw new IllegalArgumentException(\"timeUnit parameter must not be null\");\n        }\n    }\n\n    /* Reset the default timeout.\n     */\n    public void resetDefaultTimeout() {\n        timeoutTime = null;\n        timeoutUnit = null;\n    }\n\n\n    public ActivityRecognition activity() {\n        return activityRecognition;\n    }\n\n    public Geocoding geocoding() {\n        return geocoding;\n    }\n\n    public Geofencing geofencing() {\n        return geofencing;\n    }\n\n    public FusedLocation location() {\n        return fusedLocation;\n    }\n\n    public LocationSettings settings() {\n        return locationSettings;\n    }\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/RxLocationBaseOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.PendingResult;\nimport com.google.android.gms.common.api.Result;\nimport com.google.android.gms.common.api.ResultCallback;\nimport com.google.android.gms.common.api.Scope;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.LocationServices;\n\nimport java.util.concurrent.TimeUnit;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------\n *\n * FILE MODIFIED by Patrick Löwenstein, 2016\n *\n */\nabstract class RxLocationBaseOnSubscribe<T> {\n    protected final Context ctx;\n    final Long timeoutTime;\n    final TimeUnit timeoutUnit;\n    private final Api<? extends Api.ApiOptions.NotRequiredOptions>[] services;\n    private final Scope[] scopes;\n\n    protected RxLocationBaseOnSubscribe(@NonNull RxLocation rxLocation, Long timeout, TimeUnit timeUnit) {\n        this.ctx = rxLocation.ctx;\n        this.services = new Api[]{ LocationServices.API, ActivityRecognition.API };\n        this.scopes = null;\n\n        if (timeout != null && timeUnit != null) {\n            this.timeoutTime = timeout;\n            this.timeoutUnit = timeUnit;\n        } else {\n            this.timeoutTime = rxLocation.timeoutTime;\n            this.timeoutUnit = rxLocation.timeoutUnit;\n        }\n    }\n\n    protected RxLocationBaseOnSubscribe(@NonNull Context ctx, @NonNull Api<? extends Api.ApiOptions.NotRequiredOptions>[] services, Scope[] scopes) {\n        this.ctx = ctx;\n        this.services = services;\n        this.scopes = scopes;\n        timeoutTime = null;\n        timeoutUnit = null;\n    }\n\n    protected final <T extends Result> void setupLocationPendingResult(PendingResult<T> pendingResult, ResultCallback<T> resultCallback) {\n        if (timeoutTime != null && timeoutUnit != null) {\n            pendingResult.setResultCallback(resultCallback, timeoutTime, timeoutUnit);\n        } else {\n            pendingResult.setResultCallback(resultCallback);\n        }\n    }\n\n    protected GoogleApiClient.Builder getApiClientBuilder() {\n        return new GoogleApiClient.Builder(ctx);\n    }\n\n    protected GoogleApiClient createApiClient(ApiClientConnectionCallbacks apiClientConnectionCallbacks) {\n\n        GoogleApiClient.Builder apiClientBuilder = getApiClientBuilder();\n\n\n        for (Api<? extends Api.ApiOptions.NotRequiredOptions> service : services) {\n            apiClientBuilder.addApi(service);\n        }\n\n        if (scopes != null) {\n            for (Scope scope : scopes) {\n                apiClientBuilder.addScope(scope);\n            }\n        }\n\n        apiClientBuilder.addConnectionCallbacks(apiClientConnectionCallbacks);\n        apiClientBuilder.addOnConnectionFailedListener(apiClientConnectionCallbacks);\n\n        GoogleApiClient apiClient = apiClientBuilder.build();\n\n        apiClientConnectionCallbacks.setClient(apiClient);\n\n        return apiClient;\n    }\n\n    protected void onUnsubscribed(GoogleApiClient apiClient) { }\n\n    protected abstract class ApiClientConnectionCallbacks implements\n            GoogleApiClient.ConnectionCallbacks,\n            GoogleApiClient.OnConnectionFailedListener {\n\n        protected GoogleApiClient apiClient;\n\n        protected ApiClientConnectionCallbacks() {\n        }\n\n        public void setClient(GoogleApiClient client) {\n            this.apiClient = client;\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/RxLocationFlowableOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Scope;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.FlowableEmitter;\nimport io.reactivex.FlowableOnSubscribe;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------\n *\n * FILE MODIFIED by Patrick Löwenstein, 2016\n *\n */\nabstract class RxLocationFlowableOnSubscribe<T> extends RxLocationBaseOnSubscribe<T> implements FlowableOnSubscribe<T> {\n\n    protected RxLocationFlowableOnSubscribe(@NonNull RxLocation rxLocation, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n    }\n\n    protected RxLocationFlowableOnSubscribe(@NonNull Context ctx, @NonNull Api<? extends Api.ApiOptions.NotRequiredOptions>[] services, Scope[] scopes) {\n        super(ctx, services, scopes);\n    }\n\n    @Override\n    public final void subscribe(FlowableEmitter<T> emitter) throws Exception {\n        final GoogleApiClient apiClient = createApiClient(new ApiClientConnectionCallbacks(emitter));\n\n        try {\n            apiClient.connect();\n        } catch (Throwable ex) {\n            emitter.onError(ex);\n        }\n\n        emitter.setCancellable(() -> {\n            if (apiClient.isConnected()) {\n                onUnsubscribed(apiClient);\n            }\n\n            apiClient.disconnect();\n        });\n    }\n\n    protected abstract void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<T> emitter);\n\n    protected class ApiClientConnectionCallbacks extends RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks {\n\n        final protected FlowableEmitter<T> emitter;\n\n        private GoogleApiClient apiClient;\n\n        private ApiClientConnectionCallbacks(FlowableEmitter<T> emitter) {\n            this.emitter = emitter;\n        }\n\n        @Override\n        public void onConnected(Bundle bundle) {\n            try {\n                onGoogleApiClientReady(apiClient, emitter);\n            } catch (Throwable ex) {\n                emitter.onError(ex);\n            }\n        }\n\n        @Override\n        public void onConnectionSuspended(int cause) {\n            emitter.onError(new GoogleApiConnectionSuspendedException(cause));\n        }\n\n        @Override\n        public void onConnectionFailed(ConnectionResult connectionResult) {\n            emitter.onError(new GoogleApiConnectionException(\"Error connecting to GoogleApiClient.\", connectionResult));\n        }\n\n        public void setClient(GoogleApiClient client) {\n            this.apiClient = client;\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/RxLocationMaybeOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Scope;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.MaybeEmitter;\nimport io.reactivex.MaybeOnSubscribe;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------\n *\n * FILE MODIFIED by Patrick Löwenstein, 2016\n *\n */\nabstract class RxLocationMaybeOnSubscribe<T> extends RxLocationBaseOnSubscribe<T> implements MaybeOnSubscribe<T> {\n    protected RxLocationMaybeOnSubscribe(@NonNull RxLocation rxLocation, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n    }\n\n    protected RxLocationMaybeOnSubscribe(@NonNull Context ctx, @NonNull Api<? extends Api.ApiOptions.NotRequiredOptions>[] services, Scope[] scopes) {\n        super(ctx, services, scopes);\n    }\n\n    @Override\n    public final void subscribe(MaybeEmitter<T> emitter) throws Exception {\n        final GoogleApiClient apiClient = createApiClient(new ApiClientConnectionCallbacks(emitter));\n\n        try {\n            apiClient.connect();\n        } catch (Throwable ex) {\n            emitter.onError(ex);\n        }\n\n        emitter.setCancellable(() -> {\n            if (apiClient.isConnected()) {\n                onUnsubscribed(apiClient);\n            }\n\n            apiClient.disconnect();\n        });\n    }\n\n    protected abstract void onGoogleApiClientReady(GoogleApiClient apiClient, MaybeEmitter<T> emitter);\n\n    protected class ApiClientConnectionCallbacks extends RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks {\n\n        final protected MaybeEmitter<T> emitter;\n\n        private GoogleApiClient apiClient;\n\n        private ApiClientConnectionCallbacks(MaybeEmitter<T> emitter) {\n            this.emitter = emitter;\n        }\n\n        @Override\n        public void onConnected(Bundle bundle) {\n            try {\n                onGoogleApiClientReady(apiClient, emitter);\n            } catch (Throwable ex) {\n                emitter.onError(ex);\n            }\n        }\n\n        @Override\n        public void onConnectionSuspended(int cause) {\n            emitter.onError(new GoogleApiConnectionSuspendedException(cause));\n        }\n\n        @Override\n        public void onConnectionFailed(ConnectionResult connectionResult) {\n            emitter.onError(new GoogleApiConnectionException(\"Error connecting to GoogleApiClient.\", connectionResult));\n        }\n\n        public void setClient(GoogleApiClient client) {\n            this.apiClient = client;\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/RxLocationSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Scope;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.SingleOnSubscribe;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------\n *\n * FILE MODIFIED by Patrick Löwenstein, 2016\n *\n */\nabstract class RxLocationSingleOnSubscribe<T> extends RxLocationBaseOnSubscribe<T> implements SingleOnSubscribe<T> {\n    protected RxLocationSingleOnSubscribe(@NonNull RxLocation rxLocation, Long timeout, TimeUnit timeUnit) {\n        super(rxLocation, timeout, timeUnit);\n    }\n\n    protected RxLocationSingleOnSubscribe(@NonNull Context ctx, @NonNull Api<? extends Api.ApiOptions.NotRequiredOptions>[] services, Scope[] scopes) {\n        super(ctx, services, scopes);\n    }\n\n    @Override\n    public final void subscribe(SingleEmitter<T> emitter) throws Exception {\n        final GoogleApiClient apiClient = createApiClient(new ApiClientConnectionCallbacks(emitter));\n\n        try {\n            apiClient.connect();\n        } catch (Throwable ex) {\n            emitter.onError(ex);\n        }\n\n        emitter.setCancellable(() -> {\n            if (apiClient.isConnected()) {\n                onUnsubscribed(apiClient);\n            }\n\n            apiClient.disconnect();\n        });\n    }\n\n    protected abstract void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<T> emitter);\n\n    protected class ApiClientConnectionCallbacks extends RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks {\n\n        final protected SingleEmitter<T> emitter;\n\n        private GoogleApiClient apiClient;\n\n        private ApiClientConnectionCallbacks(SingleEmitter<T> emitter) {\n            this.emitter = emitter;\n        }\n\n        @Override\n        public void onConnected(Bundle bundle) {\n            try {\n                onGoogleApiClientReady(apiClient, emitter);\n            } catch (Throwable ex) {\n                emitter.onError(ex);\n            }\n        }\n\n        @Override\n        public void onConnectionSuspended(int cause) {\n            emitter.onError(new GoogleApiConnectionSuspendedException(cause));\n        }\n\n        @Override\n        public void onConnectionFailed(ConnectionResult connectionResult) {\n            emitter.onError(new GoogleApiConnectionException(\"Error connecting to GoogleApiClient.\", connectionResult));\n        }\n\n        public void setClient(GoogleApiClient client) {\n            this.apiClient = client;\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/SettingsCheckHandleSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\nimport com.google.android.gms.location.LocationSettingsRequest;\nimport com.google.android.gms.location.LocationSettingsStatusCodes;\n\nimport java.lang.ref.WeakReference;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass SettingsCheckHandleSingleOnSubscribe extends RxLocationSingleOnSubscribe<Boolean> {\n\n    static final Map<String, WeakReference<SettingsCheckHandleSingleOnSubscribe>> observableMap = new HashMap<>();\n\n    final Context context;\n    final LocationSettingsRequest locationSettingsRequest;\n    private WeakReference<SingleEmitter<Boolean>> emitterWeakRef;\n\n    SettingsCheckHandleSingleOnSubscribe(RxLocation rxLocation, LocationSettingsRequest locationSettingsRequest, Long timeoutTime, TimeUnit timeoutUnit) {\n        super(rxLocation, timeoutTime, timeoutUnit);\n        this.context = rxLocation.ctx;\n        this.locationSettingsRequest = locationSettingsRequest;\n    }\n\n    static void onResolutionResult(String observableId, int resultCode) {\n        if (observableMap.containsKey(observableId)) {\n            SettingsCheckHandleSingleOnSubscribe observable = observableMap.get(observableId).get();\n\n            if (observable != null && observable.emitterWeakRef != null) {\n                SingleEmitter<Boolean> observer = observable.emitterWeakRef.get();\n\n                if (observer != null) {\n                    observer.onSuccess(resultCode == Activity.RESULT_OK);\n                }\n            }\n\n            observableMap.remove(observableId);\n        }\n\n        observableMapCleanup();\n    }\n\n    static void observableMapCleanup() {\n        if(!observableMap.isEmpty()) {\n            Iterator<Map.Entry<String, WeakReference<SettingsCheckHandleSingleOnSubscribe>>> it = observableMap.entrySet().iterator();\n\n            while(it.hasNext()) {\n                Map.Entry<String, WeakReference<SettingsCheckHandleSingleOnSubscribe>> entry = it.next();\n                if(entry.getValue().get() == null) { it.remove(); }\n            }\n        }\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Boolean> emitter) {\n        emitterWeakRef = new WeakReference<>(emitter);\n\n        setupLocationPendingResult(\n                LocationServices.SettingsApi.checkLocationSettings(apiClient, locationSettingsRequest),\n                result -> {\n                    Status status = result.getStatus();\n\n                    switch (status.getStatusCode()) {\n                        case LocationSettingsStatusCodes.SUCCESS:\n                            // All location settings are satisfied. The client can initialize location\n                            // requests here.\n                            emitter.onSuccess(true);\n                            break;\n\n                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:\n                            // Location settings are not satisfied. But could be fixed by showing the user\n                            // a dialog.\n\n                            if (context != null) {\n                                String observableId = UUID.randomUUID().toString();\n                                observableMap.put(observableId, new WeakReference<>(SettingsCheckHandleSingleOnSubscribe.this));\n\n                                Intent intent = new Intent(context, LocationSettingsActivity.class);\n                                intent.putExtra(LocationSettingsActivity.ARG_STATUS, status);\n                                intent.putExtra(LocationSettingsActivity.ARG_ID, observableId);\n                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                                context.startActivity(intent);\n                            } else {\n                                emitter.onSuccess(false);\n                            }\n\n                            break;\n\n                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:\n                            // Location settings are not satisfied. However, we have no way to fix the\n                            // settings so we won't show the dialog.\n\n                            emitter.onSuccess(false);\n                            break;\n\n                        default:\n                            emitter.onError(new StatusException(result));\n                            break;\n                    }\n                }\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/SettingsCheckSingleOnSubscribe.java",
    "content": "package com.patloew.rxlocation;\n\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.location.LocationServices;\nimport com.google.android.gms.location.LocationSettingsRequest;\nimport com.google.android.gms.location.LocationSettingsResult;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.SingleEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass SettingsCheckSingleOnSubscribe extends RxLocationSingleOnSubscribe<LocationSettingsResult> {\n\n    final LocationSettingsRequest locationSettingsRequest;\n\n    SettingsCheckSingleOnSubscribe(RxLocation rxLocation, LocationSettingsRequest locationSettingsRequest, Long timeoutTime, TimeUnit timeoutUnit) {\n        super(rxLocation, timeoutTime, timeoutUnit);\n        this.locationSettingsRequest = locationSettingsRequest;\n    }\n\n    @Override\n    protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<LocationSettingsResult> emitter) {\n        setupLocationPendingResult(\n                LocationServices.SettingsApi.checkLocationSettings(apiClient, locationSettingsRequest),\n                SingleResultCallBack.get(emitter)\n        );\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/SingleResultCallBack.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.Result;\nimport com.google.android.gms.common.api.ResultCallback;\n\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.functions.Function;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass SingleResultCallBack<T extends Result, R> implements ResultCallback<T> {\n\n    private static final Function ID_FUNC = input -> input;\n\n    private final SingleEmitter<R> emitter;\n    private final Function<T, R> mapper;\n\n    private SingleResultCallBack(@NonNull SingleEmitter<R> emitter, @NonNull Function<T, R> mapper) {\n        this.emitter = emitter;\n        this.mapper = mapper;\n    }\n\n    static <T extends Result, R> ResultCallback<T> get(@NonNull SingleEmitter<R> emitter, @NonNull Function<T, R> mapper) {\n        return new SingleResultCallBack<>(emitter, mapper);\n    }\n\n    static <T extends Result> ResultCallback<T> get(@NonNull SingleEmitter<T> emitter) {\n        //noinspection unchecked\n        return new SingleResultCallBack<>(emitter, ID_FUNC);\n    }\n\n    @Override\n    public void onResult(@NonNull T result) {\n        if (!result.getStatus().isSuccess()) {\n            emitter.onError(new StatusException(result));\n        } else {\n            try {\n                emitter.onSuccess(mapper.apply(result));\n            } catch (Exception e) {\n                emitter.onError(e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/StatusErrorResultCallBack.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.annotation.NonNull;\n\nimport com.google.android.gms.common.api.ResultCallback;\nimport com.google.android.gms.common.api.Status;\n\nimport io.reactivex.FlowableEmitter;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\nclass StatusErrorResultCallBack implements ResultCallback<Status> {\n\n    private final FlowableEmitter emitter;\n\n    StatusErrorResultCallBack(@NonNull FlowableEmitter emitter) {\n        this.emitter = emitter;\n    }\n\n    @Override\n    public void onResult(@NonNull Status status) {\n        if (!status.isSuccess()) {\n            emitter.onError(new StatusException(status));\n        }\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/StatusException.java",
    "content": "package com.patloew.rxlocation;\n\nimport com.google.android.gms.common.api.Result;\nimport com.google.android.gms.common.api.Status;\n\n/* Copyright (C) 2015 Michał Charmas (http://blog.charmas.pl)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ------------\n *\n *\n * FILE MODIFIED by Patrick Löwenstein 2017\n */\npublic class StatusException extends RuntimeException {\n    private final Result result;\n\n    public StatusException(Result result) {\n        super(result.getStatus().toString());\n        this.result = result;\n    }\n\n    public Result getResult() {\n        return result;\n    }\n\n    public Status getStatus() {\n        return result.getStatus();\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/patloew/rxlocation/StatusExceptionResumeNextTransformer.java",
    "content": "package com.patloew.rxlocation;\n\nimport com.google.android.gms.common.api.Result;\n\nimport io.reactivex.Flowable;\nimport io.reactivex.FlowableTransformer;\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableTransformer;\nimport io.reactivex.Single;\nimport io.reactivex.SingleTransformer;\n\n/* Copyright 2017 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class StatusExceptionResumeNextTransformer {\n\n    public static <R extends Result> FlowableTransformer<R, R> forFlowable() {\n        return upstream -> upstream.onErrorResumeNext(throwable -> {\n            if(throwable instanceof StatusException) {\n                StatusException statusException = (StatusException) throwable;\n\n                if(statusException.getStatus().hasResolution()) {\n                    return Flowable.just((R) statusException.getResult());\n                } else {\n                    return Flowable.error(throwable);\n                }\n\n            } else {\n                return Flowable.error(throwable);\n            }\n        });\n    }\n\n    public static <R extends Result> ObservableTransformer<R, R> forObservable() {\n        return upstream -> upstream.onErrorResumeNext(throwable -> {\n            if(throwable instanceof StatusException) {\n                StatusException statusException = (StatusException) throwable;\n\n                if(statusException.getStatus().hasResolution()) {\n                    return Observable.just((R) statusException.getResult());\n                } else {\n                    return Observable.error(throwable);\n                }\n\n            } else {\n                return Observable.error(throwable);\n            }\n        });\n    }\n\n    public static <R extends Result> SingleTransformer<R, R> forSingle() {\n        return upstream -> upstream.onErrorResumeNext(throwable -> {\n            if(throwable instanceof StatusException) {\n                StatusException statusException = (StatusException) throwable;\n\n                if(statusException.getStatus().hasResolution()) {\n                    return Single.just((R) statusException.getResult());\n                } else {\n                    return Single.error(throwable);\n                }\n\n            } else {\n                return Single.error(throwable);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "library/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"define_rxlocation\"></string>\n    <!-- Author section -->\n    <string name=\"library_rxlocation_author\">Patrick Löwenstein</string>\n    <string name=\"library_rxlocation_authorWebsite\">https://nullpointer.wtf</string>\n    <!-- Library section -->\n    <string name=\"library_rxlocation_libraryName\">RxLocation</string>\n    <string name=\"library_rxlocation_libraryDescription\">This library wraps the Location APIs in RxJava 2 Observables, Singles and Maybes. No more managing GoogleApiClients! Also, the resolution of the location settings check is optionally handled by the lib.</string>\n    <string name=\"library_rxlocation_libraryWebsite\">https://github.com/patloew/RxLocation</string>\n    <string name=\"library_rxlocation_libraryVersion\">1.0.2</string>\n    <!-- OpenSource section -->\n    <string name=\"library_rxlocation_isOpenSource\">true</string>\n    <string name=\"library_rxlocation_repositoryLink\">https://github.com/patloew/RxLocation</string>\n    <!-- ClassPath for autoDetect section -->\n    <string name=\"library_rxlocation_classPath\">com.patloew.rxlocation.RxLocation</string>\n    <!-- License section -->\n    <string name=\"library_rxlocation_licenseId\">apache_2_0</string>\n</resources>\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/ActivityOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.content.Context;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.MockitoAnnotations;\nimport org.mockito.MockitoSession;\nimport org.mockito.quality.Strictness;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.Single;\n\nimport static org.powermock.api.mockito.PowerMockito.doReturn;\nimport static org.powermock.api.mockito.PowerMockito.when;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })\npublic class ActivityOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Mock PendingIntent pendingIntent;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    // ActivityRequestUpdatesSingle\n\n    @Test\n    public void ActivityRequestUpdatesSingle_Success() {\n        ActivityRequestUpdatesSingleOnSubscribe single = PowerMockito.spy(new ActivityRequestUpdatesSingleOnSubscribe(rxLocation, 1L, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        doReturn(true).when(status).isSuccess();\n        doReturn(pendingResult).when(activityRecognitionApi).requestActivityUpdates(apiClient, 1L, pendingIntent);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void ActivityRequestUpdatesSingle_StatusException() {\n        ActivityRequestUpdatesSingleOnSubscribe single = PowerMockito.spy(new ActivityRequestUpdatesSingleOnSubscribe(rxLocation, 1L, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(activityRecognitionApi.requestActivityUpdates(apiClient, 1L, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n    // ActivityRemoveUpdatesSingle\n\n    @Test\n    public void ActivityRemoveUpdatesSingle_Success() {\n        ActivityRemoveUpdatesSingleOnSubscribe single = PowerMockito.spy(new ActivityRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(activityRecognitionApi.removeActivityUpdates(apiClient, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void ActivityRemoveUpdatesSingle_StatusException() {\n        ActivityRemoveUpdatesSingleOnSubscribe single = PowerMockito.spy(new ActivityRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(activityRecognitionApi.removeActivityUpdates(apiClient, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/ActivityTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.Single;\n\nimport static junit.framework.Assert.assertEquals;\nimport static org.mockito.Mockito.times;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ Single.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class })\npublic class ActivityTest extends BaseTest {\n\n    @Mock PendingIntent pendingIntent;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        PowerMockito.spy(Single.class);\n        super.setup();\n    }\n\n    // Request Updates\n\n    @Test\n    public void Activity_RequestUpdates() throws Exception {\n        ArgumentCaptor<ActivityRequestUpdatesSingleOnSubscribe> captor = ArgumentCaptor.forClass(ActivityRequestUpdatesSingleOnSubscribe.class);\n\n        long detectionIntervalMillis = 123L;\n        rxLocation.activity().requestUpdates(detectionIntervalMillis,pendingIntent);\n        rxLocation.activity().requestUpdates(detectionIntervalMillis,pendingIntent, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        ActivityRequestUpdatesSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(detectionIntervalMillis, single.detectionIntervalMillis);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(detectionIntervalMillis, single.detectionIntervalMillis);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertTimeoutSet(single);\n    }\n\n    // Remove Updates\n\n    @Test\n    public void Activity_RemoveUpdates() throws Exception {\n        ArgumentCaptor<ActivityRemoveUpdatesSingleOnSubscribe> captor = ArgumentCaptor.forClass(ActivityRemoveUpdatesSingleOnSubscribe.class);\n\n        rxLocation.activity().removeUpdates(pendingIntent);\n        rxLocation.activity().removeUpdates(pendingIntent, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        ActivityRemoveUpdatesSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertTimeoutSet(single);\n    }\n\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/BaseOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.support.annotation.CallSuper;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.PendingResult;\nimport com.google.android.gms.common.api.Result;\nimport com.google.android.gms.common.api.ResultCallback;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.ActivityRecognitionApi;\nimport com.google.android.gms.location.FusedLocationProviderApi;\nimport com.google.android.gms.location.GeofencingApi;\nimport com.google.android.gms.location.LocationServices;\nimport com.google.android.gms.location.SettingsApi;\n\nimport org.mockito.Matchers;\nimport org.mockito.Mock;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.reflect.Whitebox;\n\nimport io.reactivex.FlowableEmitter;\nimport io.reactivex.MaybeEmitter;\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.observers.TestObserver;\nimport io.reactivex.subscribers.TestSubscriber;\n\nimport static org.powermock.api.mockito.PowerMockito.doAnswer;\nimport static org.powermock.api.mockito.PowerMockito.doReturn;\n\n\npublic abstract class BaseOnSubscribeTest extends BaseTest {\n\n    @Mock GoogleApiClient apiClient;\n    @Mock Status status;\n    @Mock ConnectionResult connectionResult;\n    @Mock PendingResult pendingResult;\n    @Mock PendingIntent pendingIntent;\n\n    @Mock FusedLocationProviderApi fusedLocationProviderApi;\n    @Mock ActivityRecognitionApi activityRecognitionApi;\n    @Mock GeofencingApi geofencingApi;\n    @Mock SettingsApi settingsApi;\n\n    @CallSuper\n    public void setup() throws Exception {\n        PowerMockito.mockStatic(LocationServices.class);\n        PowerMockito.mockStatic(ActivityRecognition.class);\n        Whitebox.setInternalState(LocationServices.class, fusedLocationProviderApi);\n        Whitebox.setInternalState(LocationServices.class, geofencingApi);\n        Whitebox.setInternalState(LocationServices.class, settingsApi);\n        Whitebox.setInternalState(ActivityRecognition.class, activityRecognitionApi);\n\n        doReturn(status).when(status).getStatus();\n\n        super.setup();\n    }\n\n    // Mock GoogleApiClient connection success behaviour\n    protected <T> void setupBaseFlowableSuccess(final RxLocationFlowableOnSubscribe<T> rxLocationFlowableOnSubscribe) {\n        setupBaseFlowableSuccess(rxLocationFlowableOnSubscribe, apiClient);\n    }\n\n    // Mock GoogleApiClient connection success behaviour\n    protected <T> void setupBaseFlowableSuccess(final RxLocationFlowableOnSubscribe<T> rxLocationFlowableOnSubscribe, final GoogleApiClient apiClient) {\n        doAnswer(invocation -> {\n            final FlowableEmitter<T> subscriber = ((RxLocationFlowableOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter;\n\n            doAnswer(invocation1 -> {\n                rxLocationFlowableOnSubscribe.onGoogleApiClientReady(apiClient, subscriber);\n                return null;\n            }).when(apiClient).connect();\n\n            return apiClient;\n        }).when(rxLocationFlowableOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n    }\n\n    // Mock GoogleApiClient connection success behaviour\n    protected <T> void setupBaseSingleSuccess(final RxLocationSingleOnSubscribe<T> rxLocationSingleOnSubscribe) {\n        setupBaseSingleSuccess(rxLocationSingleOnSubscribe, apiClient);\n    }\n\n    // Mock GoogleApiClient connection success behaviour\n    protected <T> void setupBaseSingleSuccess(final RxLocationSingleOnSubscribe<T> rxLocationSingleOnSubscribe, final GoogleApiClient apiClient) {\n        doAnswer(invocation -> {\n            final SingleEmitter<T> subscriber = ((RxLocationSingleOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter;\n\n            doAnswer(invocation1 -> {\n                rxLocationSingleOnSubscribe.onGoogleApiClientReady(apiClient, subscriber);\n                return null;\n            }).when(apiClient).connect();\n\n            return apiClient;\n        }).when(rxLocationSingleOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n    }\n\n    // Mock GoogleApiClient connection success behaviour\n    protected <T> void setupBaseMaybeSuccess(final RxLocationMaybeOnSubscribe<T> baseSingle) {\n        setupBaseMaybeSuccess(baseSingle, apiClient);\n    }\n\n    // Mock GoogleApiClient connection success behaviour\n    protected <T> void setupBaseMaybeSuccess(final RxLocationMaybeOnSubscribe<T> baseSingle, final GoogleApiClient apiClient) {\n        doAnswer(invocation -> {\n            final MaybeEmitter<T> subscriber = ((RxLocationMaybeOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter;\n\n            doAnswer(invocation1 -> {\n                baseSingle.onGoogleApiClientReady(apiClient, subscriber);\n                return null;\n            }).when(apiClient).connect();\n\n            return apiClient;\n        }).when(baseSingle).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n    }\n\n    // Mock GoogleApiClient connection error behaviour\n    protected <T> void setupBaseSingleError(final RxLocationSingleOnSubscribe<T> rxLocationSingleOnSubscribe) {\n        doAnswer(invocation -> {\n            final SingleEmitter<T> subscriber = ((RxLocationSingleOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter;\n\n            doAnswer(invocation1 -> {\n                subscriber.onError(new GoogleApiConnectionException(\"Error connecting to GoogleApiClient.\", connectionResult));\n                return null;\n            }).when(apiClient).connect();\n\n            return apiClient;\n        }).when(rxLocationSingleOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n    }\n\n    // Mock GoogleApiClient connection error behaviour\n    protected <T> void setupBaseFlowableError(final RxLocationFlowableOnSubscribe<T> rxLocationFlowableOnSubscribe) {\n        doAnswer(invocation -> {\n            final FlowableEmitter<T> subscriber = ((RxLocationFlowableOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter;\n\n            doAnswer(invocation1 -> {\n                subscriber.onError(new GoogleApiConnectionException(\"Error connecting to GoogleApiClient.\", connectionResult));\n                return null;\n            }).when(apiClient).connect();\n\n            return apiClient;\n        }).when(rxLocationFlowableOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    protected void setPendingResultValue(final Result result) {\n        doAnswer(invocation -> {\n            ((ResultCallback)invocation.getArguments()[0]).onResult(result);\n            return null;\n        }).when(pendingResult).setResultCallback(Matchers.<ResultCallback>any());\n    }\n\n    protected static void assertError(TestObserver sub, Class<? extends Throwable> errorClass) {\n        sub.assertError(errorClass);\n        sub.assertNoValues();\n    }\n\n    protected static void assertError(TestSubscriber sub, Class<? extends Throwable> errorClass) {\n        sub.assertError(errorClass);\n        sub.assertNoValues();\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    protected static void assertSingleValue(TestObserver sub, Object value) {\n        sub.assertComplete();\n        sub.assertValue(value);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    protected static void assertSingleValue(TestSubscriber sub, Object value) {\n        sub.assertComplete();\n        sub.assertValue(value);\n    }\n\n    protected static void assertNoValue(TestObserver sub) {\n        sub.assertComplete();\n        sub.assertNoValues();\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/BaseTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.content.Context;\nimport android.support.annotation.CallSuper;\n\nimport org.mockito.Mock;\n\nimport java.util.concurrent.TimeUnit;\n\nimport static junit.framework.Assert.assertEquals;\nimport static junit.framework.Assert.assertNull;\nimport static org.powermock.api.mockito.PowerMockito.doReturn;\nimport static org.powermock.api.mockito.PowerMockito.mock;\n\npublic abstract class BaseTest {\n\n    protected static final long TIMEOUT_TIME = 1L;\n    protected static final TimeUnit TIMEOUT_TIMEUNIT = TimeUnit.SECONDS;\n\n    @Mock Context ctx;\n\n    RxLocation rxLocation;\n\n    @CallSuper\n    public void setup() throws Exception {\n        doReturn(ctx).when(ctx).getApplicationContext();\n\n        rxLocation = new RxLocation(ctx);\n    }\n\n    protected static final void assertNoTimeoutSet(RxLocationBaseOnSubscribe rxLocationBaseOnSubscribe) {\n        assertNull(rxLocationBaseOnSubscribe.timeoutTime);\n        assertNull(rxLocationBaseOnSubscribe.timeoutUnit);\n    }\n\n    protected static final void assertTimeoutSet(RxLocationBaseOnSubscribe rxLocationBaseOnSubscribe) {\n        assertEquals(TIMEOUT_TIME, (long) rxLocationBaseOnSubscribe.timeoutTime);\n        assertEquals(TIMEOUT_TIMEUNIT, rxLocationBaseOnSubscribe.timeoutUnit);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/GeocodingTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.location.Address;\nimport android.location.Geocoder;\nimport android.location.Location;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\n\nimport io.reactivex.Single;\n\nimport static org.mockito.Matchers.any;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.powermock.api.mockito.PowerMockito.spy;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ Single.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class })\npublic class GeocodingTest extends BaseTest {\n\n    @Mock PendingIntent pendingIntent;\n    @Mock Geocoder geocoder;\n    @Mock Address address;\n    @Mock Location location;\n    Locale locale = new Locale(\"en\");\n\n    final double latitude = 1.0;\n    final double longitude = 2.0;\n\n    final String locationName = \"name\";\n    final double lowerLeftLatitude = 1.0;\n    final double lowerLeftLongitude = 2.0;\n    final double upperRightLatitude = 3.0;\n    final double upperRightLongitude = 4.0;\n\n    Geocoding geocoding;\n    List<Address> addressList;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        spy(Single.class);\n        super.setup();\n\n        geocoding = spy(rxLocation.geocoding());\n        doReturn(geocoder).when(geocoding).getGeocoder(any());\n        doReturn(latitude).when(location).getLatitude();\n        doReturn(longitude).when(location).getLongitude();\n\n        addressList = new ArrayList<>(1);\n        addressList.add(address);\n    }\n\n    private void verifyGeocoderWithLocale() {\n        verify(geocoding).getGeocoder(locale);\n        verify(geocoding, never()).getGeocoder(null);\n    }\n\n    private void verifyGeocoderWithNull() {\n        verify(geocoding, never()).getGeocoder(locale);\n        verify(geocoding).getGeocoder(null);\n    }\n\n    // fromLocation with Location\n\n    @Test\n    public void FromLocation_Location_Maybe_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(location).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocation_Location_Maybe_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(locale, location).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    @Test\n    public void FromLocation_Location_Single_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(location, 1).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocation_Location_Single_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(locale, location, 1).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    // fromLocation with LatLong\n\n    @Test\n    public void FromLocation_LatLong_Maybe_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(latitude, longitude).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocation_LatLong_Maybe_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(locale, latitude, longitude).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    @Test\n    public void FromLocation_LatLong_Single_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(latitude, longitude, 1).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocation_LatLong_Single_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocation(latitude, longitude, 1);\n\n        geocoding.fromLocation(locale, latitude, longitude, 1).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    // fromLocationName with LatLong Rect\n\n    @Test\n    public void FromLocationName_LatLong_Maybe_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude);\n\n        geocoding.fromLocationName(locationName, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocationName_LatLong_Maybe_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude);\n\n        geocoding.fromLocationName(locale, locationName, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    @Test\n    public void FromLocationName_LatLong_Single_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude);\n\n        geocoding.fromLocationName(locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocationName_LatLong_Single_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude);\n\n        geocoding.fromLocationName(locale, locationName, 1, lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    // fromLocationName\n\n    @Test\n    public void FromLocationName_Maybe_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1);\n\n        geocoding.fromLocationName(locationName).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocationName_Maybe_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1);\n\n        geocoding.fromLocationName(locale, locationName).test()\n                .assertValue(address)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n    @Test\n    public void FromLocationName_Single_NoLocale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1);\n\n        geocoding.fromLocationName(locationName, 1).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithNull();\n    }\n\n    @Test\n    public void FromLocationName_Single_Locale() throws Exception {\n        doReturn(addressList).when(geocoder).getFromLocationName(locationName, 1);\n\n        geocoding.fromLocationName(locale, locationName, 1).test()\n                .assertValue(addressList)\n                .assertComplete();\n\n        verifyGeocoderWithLocale();\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/GeofencingOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.GeofencingRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Single;\n\nimport static org.mockito.Mockito.when;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })\npublic class GeofencingOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Mock GeofencingRequest geofencingRequest;\n    @Mock PendingIntent pendingIntent;\n    List<String> geofenceRequestIds;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n        geofenceRequestIds = new ArrayList<>(0);\n    }\n\n    // GeofencingAddSingle\n\n    @Test\n    public void GeofencingAddSingle_Success() {\n        GeofencingAddSingleOnSubscribe single = PowerMockito.spy(new GeofencingAddSingleOnSubscribe(rxLocation, geofencingRequest, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(geofencingApi.addGeofences(apiClient, geofencingRequest, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void GeofencingAddSingle_StatusException() {\n        GeofencingAddSingleOnSubscribe single = PowerMockito.spy(new GeofencingAddSingleOnSubscribe(rxLocation, geofencingRequest, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(geofencingApi.addGeofences(apiClient, geofencingRequest, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n    // GeofencingRemoveSingle\n\n    @Test\n    public void GeofencingRemoveSingle_PendingIntent_Success() {\n        GeofencingRemoveSingleOnSubscribe single = PowerMockito.spy(new GeofencingRemoveSingleOnSubscribe(rxLocation, null, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(geofencingApi.removeGeofences(apiClient, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void GeofencingRemoveSingle_PendingIntent_StatusException() {\n        GeofencingRemoveSingleOnSubscribe single = PowerMockito.spy(new GeofencingRemoveSingleOnSubscribe(rxLocation, null, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(geofencingApi.removeGeofences(apiClient, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n    @Test\n    public void GeofencingRemoveSingle_IdList_Success() {\n        GeofencingRemoveSingleOnSubscribe single = PowerMockito.spy(new GeofencingRemoveSingleOnSubscribe(rxLocation, geofenceRequestIds, null, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(geofencingApi.removeGeofences(apiClient, geofenceRequestIds)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void GeofencingRemoveSingle_IdList_StatusException() {\n        GeofencingRemoveSingleOnSubscribe single = PowerMockito.spy(new GeofencingRemoveSingleOnSubscribe(rxLocation, geofenceRequestIds, null, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(geofencingApi.removeGeofences(apiClient, geofenceRequestIds)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/GeofencingTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.GeofencingRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Single;\n\nimport static junit.framework.Assert.assertEquals;\nimport static junit.framework.Assert.assertNull;\nimport static org.mockito.Mockito.times;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ Single.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class })\npublic class GeofencingTest extends BaseTest {\n\n    @Mock GeofencingRequest geofencingRequest;\n    @Mock PendingIntent pendingIntent;\n    List<String> geofenceRequestIds;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        PowerMockito.spy(Single.class);\n        super.setup();\n        geofenceRequestIds = new ArrayList<>(0);\n    }\n\n    // Add\n\n    @Test\n    public void Add() throws Exception {\n        ArgumentCaptor<GeofencingAddSingleOnSubscribe> captor = ArgumentCaptor.forClass(GeofencingAddSingleOnSubscribe.class);\n\n        rxLocation.geofencing().add(geofencingRequest, pendingIntent);\n        rxLocation.geofencing().add(geofencingRequest, pendingIntent, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        GeofencingAddSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(geofencingRequest, single.geofencingRequest);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(geofencingRequest, single.geofencingRequest);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertTimeoutSet(single);\n    }\n\n    // Remove PendingIntent\n\n    @Test\n    public void Remove_PendingIntent() throws Exception {\n        ArgumentCaptor<GeofencingRemoveSingleOnSubscribe> captor = ArgumentCaptor.forClass(GeofencingRemoveSingleOnSubscribe.class);\n\n        rxLocation.geofencing().remove(pendingIntent);\n        rxLocation.geofencing().remove(pendingIntent, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        GeofencingRemoveSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNull(single.geofenceRequestIds);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNull(single.geofenceRequestIds);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void Remove_IdList() throws Exception {\n        ArgumentCaptor<GeofencingRemoveSingleOnSubscribe> captor = ArgumentCaptor.forClass(GeofencingRemoveSingleOnSubscribe.class);\n\n        rxLocation.geofencing().remove(geofenceRequestIds);\n        rxLocation.geofencing().remove(geofenceRequestIds, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        GeofencingRemoveSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(geofenceRequestIds, single.geofenceRequestIds);\n        assertNull(single.pendingIntent);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(geofenceRequestIds, single.geofenceRequestIds);\n        assertNull(single.pendingIntent);\n        assertTimeoutSet(single);\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/LocationOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.location.Location;\nimport android.os.Looper;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationAvailability;\nimport com.google.android.gms.location.LocationListener;\nimport com.google.android.gms.location.LocationRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.BackpressureStrategy;\nimport io.reactivex.Flowable;\nimport io.reactivex.Maybe;\nimport io.reactivex.Single;\n\nimport static org.mockito.Matchers.any;\nimport static org.mockito.Matchers.eq;\nimport static org.mockito.Matchers.isNull;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.when;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ LocationRequest.class, LocationAvailability.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })\npublic class LocationOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Mock PendingIntent pendingIntent;\n    @Mock LocationRequest locationRequest;\n    @Mock Location location;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    // LocationAvailabilitySingle\n\n    @Test\n    public void LocationAvailabilitySingle_Success() {\n        LocationAvailabilitySingleOnSubscribe single = PowerMockito.spy(new LocationAvailabilitySingleOnSubscribe(rxLocation));\n\n        LocationAvailability locationAvailability = Mockito.mock(LocationAvailability.class);\n        doReturn(true).when(locationAvailability).isLocationAvailable();\n        when(fusedLocationProviderApi.getLocationAvailability(apiClient)).thenReturn(locationAvailability);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), true);\n    }\n\n    @Test\n    public void LocationAvailabilitySingle_Null_False() {\n        LocationAvailabilitySingleOnSubscribe single = PowerMockito.spy(new LocationAvailabilitySingleOnSubscribe(rxLocation));\n\n        when(fusedLocationProviderApi.getLocationAvailability(apiClient)).thenReturn(null);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), false);\n    }\n\n    // LocationFlushSingle\n\n    @Test\n    public void LocationFlushSingle_Success() {\n        LocationFlushSingleOnSubscribe single = PowerMockito.spy(new LocationFlushSingleOnSubscribe(rxLocation, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(fusedLocationProviderApi.flushLocations(apiClient)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void LocationFlushSingle_StatusException() {\n        LocationFlushSingleOnSubscribe single = PowerMockito.spy(new LocationFlushSingleOnSubscribe(rxLocation, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(fusedLocationProviderApi.flushLocations(apiClient)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n    // LocationLastMaybe\n\n    @Test\n    public void LocationLastMaybe_Success() {\n        LocationLastMaybeOnSubscribe maybe = PowerMockito.spy(new LocationLastMaybeOnSubscribe(rxLocation));\n\n        Location location = Mockito.mock(Location.class);\n        when(fusedLocationProviderApi.getLastLocation(apiClient)).thenReturn(location);\n\n        setupBaseMaybeSuccess(maybe);\n\n        assertSingleValue(Maybe.create(maybe).test(), location);\n    }\n\n    @Test\n    public void LocationLastMaybe_Null_False() {\n        LocationLastMaybeOnSubscribe maybe = PowerMockito.spy(new LocationLastMaybeOnSubscribe(rxLocation));\n\n        when(fusedLocationProviderApi.getLocationAvailability(apiClient)).thenReturn(null);\n\n        setupBaseMaybeSuccess(maybe);\n\n        assertNoValue(Maybe.create(maybe).test());\n    }\n\n    // LocationRemoveUpdatesSingle\n\n    @Test\n    public void LocationRemoveUpdatesSingle_Success() {\n        LocationRemoveUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(fusedLocationProviderApi.removeLocationUpdates(apiClient, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void LocationRemoveUpdatesSingle_StatusException() {\n        LocationRemoveUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(fusedLocationProviderApi.removeLocationUpdates(apiClient, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n    // LocationRequestUpdatesSingle\n\n    @Test\n    public void LocationRequestUpdatesSingle_Success() {\n        LocationRequestUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRequestUpdatesSingleOnSubscribe(rxLocation, locationRequest, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(true);\n        when(fusedLocationProviderApi.requestLocationUpdates(apiClient, locationRequest, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), status);\n    }\n\n    @Test\n    public void LocationRequestUpdatesSingle_StatusException() {\n        LocationRequestUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRequestUpdatesSingleOnSubscribe(rxLocation, locationRequest, pendingIntent, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        when(fusedLocationProviderApi.requestLocationUpdates(apiClient, locationRequest, pendingIntent)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n    // LocationUpdatesFlowable\n\n    @Test\n    public void LocationUpdatesFlowable_Success() {\n        LocationUpdatesFlowableOnSubscribe single = PowerMockito.spy(new LocationUpdatesFlowableOnSubscribe(rxLocation, locationRequest, null, null, null));\n\n        setPendingResultValue(status);\n\n        doReturn(true).when(status).isSuccess();\n        doAnswer(invocation -> {\n            single.locationListener.onLocationChanged(location);\n            return pendingResult;\n        }).when(fusedLocationProviderApi).requestLocationUpdates(eq(apiClient), eq(locationRequest), any(LocationListener.class), isNull(Looper.class));\n\n        setupBaseFlowableSuccess(single);\n\n        Flowable.create(single, BackpressureStrategy.BUFFER).test()\n                .assertValue(location)\n                .assertNotTerminated();\n\n    }\n\n    @Test\n    public void LocationUpdatesFlowable_StatusException() {\n        LocationUpdatesFlowableOnSubscribe single = PowerMockito.spy(new LocationUpdatesFlowableOnSubscribe(rxLocation, locationRequest, null, null, null));\n\n        setPendingResultValue(status);\n        when(status.isSuccess()).thenReturn(false);\n        doReturn(pendingResult).when(fusedLocationProviderApi).requestLocationUpdates(eq(apiClient), eq(locationRequest), any(LocationListener.class), isNull(Looper.class));\n\n        setupBaseFlowableSuccess(single);\n\n        Flowable.create(single, BackpressureStrategy.BUFFER).test()\n                .assertNoValues()\n                .assertError(StatusException.class);\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/LocationSettingsActivityTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.content.IntentSender;\n\nimport com.google.android.gms.common.api.Status;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport java.util.UUID;\n\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.verify;\nimport static org.powermock.api.mockito.PowerMockito.spy;\n\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ SettingsCheckHandleSingleOnSubscribe.class, Status.class })\npublic class LocationSettingsActivityTest  {\n\n    @Mock Status status;\n    @Mock Intent intent;\n    LocationSettingsActivity activity;\n\n    final String observableId = UUID.randomUUID().toString();\n\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        PowerMockito.spy(SettingsCheckHandleSingleOnSubscribe.class);\n\n        activity = spy(new LocationSettingsActivity());\n\n        doReturn(observableId).when(intent).getStringExtra(LocationSettingsActivity.ARG_ID);\n        doReturn(status).when(intent).getParcelableExtra(LocationSettingsActivity.ARG_STATUS);\n        doReturn(intent).when(activity).getIntent();\n    }\n\n    @Test\n    public void onCreate() {\n        activity.onCreate(null);\n        doAnswer(invocation -> null).when(activity).handleIntent();\n        verify(activity).handleIntent();\n    }\n\n    @Test\n    public void onNewIntent() {\n        activity.onNewIntent(intent);\n\n        doAnswer(invocation -> null).when(activity).handleIntent();\n        verify(activity).setIntent(intent);\n        verify(activity).handleIntent();\n    }\n\n    @Test\n    public void handleIntent() throws IntentSender.SendIntentException {\n        activity.handleIntent();\n        verify(status).startResolutionForResult(activity, LocationSettingsActivity.REQUEST_CODE_RESOLUTION);\n    }\n\n    @Test\n    public void handleIntent_SendIntentException() throws IntentSender.SendIntentException {\n        doThrow(new IntentSender.SendIntentException()).when(status).startResolutionForResult(activity, LocationSettingsActivity.REQUEST_CODE_RESOLUTION);\n        activity.handleIntent();\n\n    }\n\n    @Test\n    public void onActivityResult() {\n        activity.onActivityResult(LocationSettingsActivity.REQUEST_CODE_RESOLUTION, Activity.RESULT_OK, null);\n        verify(activity).setResolutionResultAndFinish(Activity.RESULT_OK);\n    }\n\n    @Test\n    public void onActivityResult_wrongRequestCode() {\n        activity.onActivityResult(-123, Activity.RESULT_OK, null);\n        verify(activity).setResolutionResultAndFinish(Activity.RESULT_CANCELED);\n    }\n\n    @Test\n    public void setResolutionResultAndFinish_OK() {\n        activity.setResolutionResultAndFinish(Activity.RESULT_OK);\n\n        PowerMockito.verifyStatic(SettingsCheckHandleSingleOnSubscribe.class);\n        SettingsCheckHandleSingleOnSubscribe.onResolutionResult(observableId, Activity.RESULT_OK);\n\n        verify(activity).finish();\n    }\n\n    @Test\n    public void setResolutionResultAndFinish_Canceled() {\n        activity.setResolutionResultAndFinish(Activity.RESULT_CANCELED);\n\n        PowerMockito.verifyStatic(SettingsCheckHandleSingleOnSubscribe.class);\n        SettingsCheckHandleSingleOnSubscribe.onResolutionResult(observableId, Activity.RESULT_CANCELED);\n\n        verify(activity).finish();\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/LocationTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.PendingIntent;\nimport android.location.Location;\nimport android.os.Looper;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationRequest;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.BackpressureStrategy;\nimport io.reactivex.Flowable;\nimport io.reactivex.Maybe;\nimport io.reactivex.Single;\n\nimport static junit.framework.Assert.assertEquals;\nimport static junit.framework.Assert.assertNull;\nimport static org.mockito.Matchers.eq;\nimport static org.mockito.Mockito.times;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ Flowable.class, Maybe.class, Single.class, Looper.class, LocationRequest.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class })\npublic class LocationTest extends BaseTest {\n\n    @Mock PendingIntent pendingIntent;\n    @Mock LocationRequest locationRequest;\n    @Mock Location location;\n    @Mock Looper looper;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        PowerMockito.spy(Single.class);\n        PowerMockito.spy(Maybe.class);\n        PowerMockito.spy(Flowable.class);\n        super.setup();\n    }\n\n    @Test\n    public void Flush() throws Exception {\n        ArgumentCaptor<LocationFlushSingleOnSubscribe> captor = ArgumentCaptor.forClass(LocationFlushSingleOnSubscribe.class);\n\n        rxLocation.location().flush();\n        rxLocation.location().flush(TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        LocationFlushSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void LastLocation() throws Exception {\n        ArgumentCaptor<LocationLastMaybeOnSubscribe> captor = ArgumentCaptor.forClass(LocationLastMaybeOnSubscribe.class);\n\n        rxLocation.location().lastLocation();\n\n        PowerMockito.verifyStatic(Maybe.class, times(1));\n        Maybe.create(captor.capture());\n\n        LocationLastMaybeOnSubscribe single = captor.getAllValues().get(0);\n        assertNoTimeoutSet(single);\n    }\n\n    @Test\n    public void LocationAvailable() throws Exception {\n        ArgumentCaptor<LocationAvailabilitySingleOnSubscribe> captor = ArgumentCaptor.forClass(LocationAvailabilitySingleOnSubscribe.class);\n\n        rxLocation.location().isLocationAvailable();\n\n        PowerMockito.verifyStatic(Single.class, times(1));\n        Single.create(captor.capture());\n\n        LocationAvailabilitySingleOnSubscribe single = captor.getAllValues().get(0);\n        assertNoTimeoutSet(single);\n    }\n\n    @Test\n    public void RequestUpdates() throws Exception {\n        ArgumentCaptor<LocationRequestUpdatesSingleOnSubscribe> captor = ArgumentCaptor.forClass(LocationRequestUpdatesSingleOnSubscribe.class);\n\n        rxLocation.location().requestUpdates(locationRequest, pendingIntent);\n        rxLocation.location().requestUpdates(locationRequest, pendingIntent, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        LocationRequestUpdatesSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationRequest, single.locationRequest);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationRequest, single.locationRequest);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void RemoveUpdates() throws Exception {\n        ArgumentCaptor<LocationRemoveUpdatesSingleOnSubscribe> captor = ArgumentCaptor.forClass(LocationRemoveUpdatesSingleOnSubscribe.class);\n\n        rxLocation.location().removeUpdates(pendingIntent);\n        rxLocation.location().removeUpdates(pendingIntent, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        LocationRemoveUpdatesSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(pendingIntent, single.pendingIntent);\n        assertTimeoutSet(single);\n    }\n\n    // Location Updates\n\n    @Test\n    public void LocationUpdates() throws Exception {\n        ArgumentCaptor<LocationUpdatesFlowableOnSubscribe> captor = ArgumentCaptor.forClass(LocationUpdatesFlowableOnSubscribe.class);\n\n        rxLocation.location().updates(locationRequest);\n        rxLocation.location().updates(locationRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Flowable.class, times(2));\n        Flowable.create(captor.capture(), eq(BackpressureStrategy.MISSING));\n\n        LocationUpdatesFlowableOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationRequest, single.locationRequest);\n        assertNull(single.looper);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationRequest, single.locationRequest);\n        assertNull(single.looper);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void LocationUpdates_Looper() throws Exception {\n        ArgumentCaptor<LocationUpdatesFlowableOnSubscribe> captor = ArgumentCaptor.forClass(LocationUpdatesFlowableOnSubscribe.class);\n\n        rxLocation.location().updates(locationRequest, looper);\n        rxLocation.location().updates(locationRequest, looper, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Flowable.class, times(2));\n        Flowable.create(captor.capture(), eq(BackpressureStrategy.MISSING));\n\n        LocationUpdatesFlowableOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationRequest, single.locationRequest);\n        assertEquals(looper, single.looper);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationRequest, single.locationRequest);\n        assertEquals(looper, single.looper);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void LocationUpdates_BackpressureStrategy() throws Exception {\n        ArgumentCaptor<LocationUpdatesFlowableOnSubscribe> captor = ArgumentCaptor.forClass(LocationUpdatesFlowableOnSubscribe.class);\n\n        rxLocation.location().updates(locationRequest, BackpressureStrategy.LATEST);\n        rxLocation.location().updates(locationRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT, BackpressureStrategy.LATEST);\n\n        PowerMockito.verifyStatic(Flowable.class, times(2));\n        Flowable.create(captor.capture(), eq(BackpressureStrategy.LATEST));\n\n        LocationUpdatesFlowableOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationRequest, single.locationRequest);\n        assertNull(single.looper);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationRequest, single.locationRequest);\n        assertNull(single.looper);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void LocationUpdates_Looper_BackpressureStrategy() throws Exception {\n        ArgumentCaptor<LocationUpdatesFlowableOnSubscribe> captor = ArgumentCaptor.forClass(LocationUpdatesFlowableOnSubscribe.class);\n\n        rxLocation.location().updates(locationRequest, looper, BackpressureStrategy.LATEST);\n        rxLocation.location().updates(locationRequest, looper, TIMEOUT_TIME, TIMEOUT_TIMEUNIT, BackpressureStrategy.LATEST);\n\n        PowerMockito.verifyStatic(Flowable.class, times(2));\n        Flowable.create(captor.capture(), eq(BackpressureStrategy.LATEST));\n\n        LocationUpdatesFlowableOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationRequest, single.locationRequest);\n        assertEquals(looper, single.looper);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationRequest, single.locationRequest);\n        assertEquals(looper, single.looper);\n        assertTimeoutSet(single);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/RxLocationBaseOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.v4.content.ContextCompat;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.ResultCallback;\nimport com.google.android.gms.common.api.Scope;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Matchers;\nimport org.mockito.Mockito;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport static junit.framework.Assert.assertEquals;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\n\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ ContextCompat.class, Status.class, LocationServices.class, ActivityRecognition.class, ConnectionResult.class, GoogleApiClient.Builder.class })\npublic class RxLocationBaseOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    @Test\n    public void setupFitnessPendingResult_NoTimeout() {\n        RxLocationBaseOnSubscribe<Object> rxLocationBaseOnSubscribe = spy(new RxLocationBaseOnSubscribe<Object>(rxLocation, null, null) { });\n\n        ResultCallback resultCallback = Mockito.mock(ResultCallback.class);\n\n        rxLocationBaseOnSubscribe.setupLocationPendingResult(pendingResult, resultCallback);\n\n        verify(pendingResult).setResultCallback(resultCallback);\n    }\n\n    @Test\n    public void setupFitnessPendingResult_Timeout() {\n        RxLocationBaseOnSubscribe<Object> rxLocationBaseOnSubscribe = spy(new RxLocationBaseOnSubscribe<Object>(rxLocation, TIMEOUT_TIME, TIMEOUT_TIMEUNIT) { });\n\n        ResultCallback resultCallback = Mockito.mock(ResultCallback.class);\n\n        rxLocationBaseOnSubscribe.setupLocationPendingResult(pendingResult, resultCallback);\n\n        verify(pendingResult).setResultCallback(resultCallback, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n    }\n\n    @Test\n    public void createApiClient_NoScopes() {\n        GoogleApiClient.Builder builder = Mockito.mock(GoogleApiClient.Builder.class);\n\n        RxLocationBaseOnSubscribe<Object> rxLocationBaseOnSubscribe = spy(new RxLocationBaseOnSubscribe<Object>(ctx, new Api[]{ LocationServices.API }, null) { });\n\n        doReturn(builder).when(rxLocationBaseOnSubscribe).getApiClientBuilder();\n        doReturn(apiClient).when(builder).build();\n\n        RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = Mockito.mock(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class);\n\n        assertEquals(apiClient, rxLocationBaseOnSubscribe.createApiClient(callbacks));\n        verify(builder).addApi(LocationServices.API);\n        verify(builder).addConnectionCallbacks(callbacks);\n        verify(builder).addOnConnectionFailedListener(callbacks);\n        verify(builder, never()).addScope(Matchers.any(Scope.class));\n        verify(callbacks).setClient(Matchers.any(GoogleApiClient.class));\n    }\n\n    @Test\n    public void createApiClient_Scopes() {\n        GoogleApiClient.Builder builder = Mockito.mock(GoogleApiClient.Builder.class);\n\n        Scope scope = new Scope(\"Test\");\n        RxLocationBaseOnSubscribe<Object> rxLocationBaseOnSubscribe = spy(new RxLocationBaseOnSubscribe<Object>(ctx, new Api[]{ LocationServices.API }, new Scope[]{ scope } ) { });\n\n        doReturn(builder).when(rxLocationBaseOnSubscribe).getApiClientBuilder();\n        doReturn(apiClient).when(builder).build();\n\n        RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = Mockito.mock(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class);\n\n        assertEquals(apiClient, rxLocationBaseOnSubscribe.createApiClient(callbacks));\n        verify(builder).addApi(LocationServices.API);\n        verify(builder).addScope(scope);\n        verify(builder).addConnectionCallbacks(callbacks);\n        verify(builder).addOnConnectionFailedListener(callbacks);\n        verify(callbacks).setClient(Matchers.any(GoogleApiClient.class));\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/RxLocationFlowableOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.v4.content.ContextCompat;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Matchers;\nimport org.mockito.MockitoAnnotations;\nimport org.mockito.invocation.InvocationOnMock;\nimport org.mockito.stubbing.Answer;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.BackpressureStrategy;\nimport io.reactivex.Flowable;\nimport io.reactivex.FlowableEmitter;\nimport io.reactivex.subscribers.TestSubscriber;\n\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\n\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ ContextCompat.class, LocationServices.class, ActivityRecognition.class, Status.class, ConnectionResult.class })\npublic class RxLocationFlowableOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    @Test\n    public void BaseObservable_ApiClient_Connected() {\n        final Object object = new Object();\n        RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) {\n                subscriber.onNext(object);\n                subscriber.onComplete();\n            }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnected(null);\n            return apiClient;\n        }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestSubscriber<Object> sub = Flowable.create(observable, BackpressureStrategy.MISSING).test();\n\n        sub.assertValue(object);\n        sub.assertComplete();\n    }\n\n    @Test\n    public void BaseObservable_ApiClient_Connected_Dispose() {\n        final Object object = new Object();\n        RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) {\n                subscriber.onNext(object);\n            }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnected(null);\n            return apiClient;\n        }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        doReturn(true).when(apiClient).isConnected();\n\n        Flowable.create(observable, BackpressureStrategy.MISSING).subscribe().dispose();\n\n        verify(observable).onUnsubscribed(apiClient);\n        verify(apiClient).disconnect();\n    }\n\n    @Test\n    public void BaseObservable_ApiClient_ConnectionSuspended() {\n        final Object object = new Object();\n        RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) {\n                subscriber.onNext(object);\n                subscriber.onComplete();\n            }\n        });\n\n        doAnswer(new Answer() {\n            @Override\n            public Object answer(InvocationOnMock invocation) throws Throwable {\n                RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n                callbacks.setClient(apiClient);\n                callbacks.onConnectionSuspended(0);\n                return apiClient;\n            }\n        }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestSubscriber<Object> sub = Flowable.create(observable, BackpressureStrategy.MISSING).test();\n\n        sub.assertNoValues();\n        sub.assertError(GoogleApiConnectionSuspendedException.class);\n    }\n\n    @Test\n    public void BaseObservable_ApiClient_ConnectionFailed() {\n        final Object object = new Object();\n        RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) {\n                subscriber.onNext(object);\n                subscriber.onComplete();\n            }\n        });\n\n        doReturn(false).when(connectionResult).hasResolution();\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnectionFailed(connectionResult);\n            return apiClient;\n        }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestSubscriber<Object> sub = Flowable.create(observable, BackpressureStrategy.MISSING).test();\n\n        sub.assertNoValues();\n        sub.assertError(GoogleApiConnectionException.class);\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/RxLocationMaybeOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.v4.content.ContextCompat;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Matchers;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.Maybe;\nimport io.reactivex.MaybeEmitter;\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.observers.TestObserver;\n\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\n\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ ContextCompat.class, Status.class, LocationServices.class, ActivityRecognition.class, ConnectionResult.class, SingleEmitter.class })\npublic class RxLocationMaybeOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    @Test\n    public void ApiClient_Connected() {\n        final Object object = new Object();\n        RxLocationMaybeOnSubscribe<Object> maybeOnSubscribe = spy(new RxLocationMaybeOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, MaybeEmitter<? super Object> emitter) {\n                emitter.onSuccess(object);\n            }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnected(null);\n            return apiClient;\n        }).when(maybeOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestObserver<Object> sub = Maybe.create(maybeOnSubscribe).test();\n\n        sub.assertValue(object);\n        sub.assertComplete();\n    }\n\n\n    @Test\n    public void ApiClient_Connected_Dispose() {\n        RxLocationMaybeOnSubscribe<Object> maybeOnSubscribe = spy(new RxLocationMaybeOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, MaybeEmitter<? super Object> emitter) { }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnected(null);\n            return apiClient;\n        }).when(maybeOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        doReturn(true).when(apiClient).isConnected();\n\n        Maybe.create(maybeOnSubscribe).subscribe().dispose();\n\n        verify(maybeOnSubscribe).onUnsubscribed(apiClient);\n        verify(apiClient).disconnect();\n    }\n\n    @Test\n    public void ApiClient_ConnectionSuspended() {\n        final Object object = new Object();\n        RxLocationMaybeOnSubscribe<Object> maybeOnSubscribe = spy(new RxLocationMaybeOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, MaybeEmitter<? super Object> emitter) {\n                emitter.onSuccess(object);\n            }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnectionSuspended(0);\n            return apiClient;\n        }).when(maybeOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestObserver<Object> sub = Maybe.create(maybeOnSubscribe).test();\n\n        sub.assertNoValues();\n        sub.assertError(GoogleApiConnectionSuspendedException.class);\n    }\n\n    @Test\n    public void ApiClient_ConnectionFailed() {\n        final Object object = new Object();\n        RxLocationMaybeOnSubscribe<Object> maybeOnSubscribe = spy(new RxLocationMaybeOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, MaybeEmitter<? super Object> emitter) {\n                emitter.onSuccess(object);\n            }\n        });\n\n        doReturn(false).when(connectionResult).hasResolution();\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnectionFailed(connectionResult);\n            return apiClient;\n        }).when(maybeOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestObserver<Object> sub = Maybe.create(maybeOnSubscribe).test();\n\n        sub.assertNoValues();\n        sub.assertError(GoogleApiConnectionException.class);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/RxLocationSingleOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.v4.content.ContextCompat;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Matchers;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.Single;\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.observers.TestObserver;\n\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\n\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ ContextCompat.class, Status.class, LocationServices.class, ActivityRecognition.class, ConnectionResult.class, SingleEmitter.class })\npublic class RxLocationSingleOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    @Test\n    public void ApiClient_Connected() {\n        final Object object = new Object();\n        RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) {\n                emitter.onSuccess(object);\n            }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnected(null);\n            return apiClient;\n        }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestObserver<Object> sub = Single.create(single).test();\n\n        sub.assertValue(object);\n        sub.assertComplete();\n    }\n\n    @Test\n    public void ApiClient_Connected_Dispose() {\n        RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) { }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnected(null);\n            return apiClient;\n        }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        doReturn(true).when(apiClient).isConnected();\n\n        Single.create(single).subscribe().dispose();\n\n        verify(single).onUnsubscribed(apiClient);\n        verify(apiClient).disconnect();\n    }\n\n    @Test\n    public void ApiClient_ConnectionSuspended() {\n        final Object object = new Object();\n        RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) {\n                emitter.onSuccess(object);\n            }\n        });\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnectionSuspended(0);\n            return apiClient;\n        }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestObserver<Object> sub = Single.create(single).test();\n\n        sub.assertNoValues();\n        sub.assertError(GoogleApiConnectionSuspendedException.class);\n    }\n\n    @Test\n    public void ApiClient_ConnectionFailed() {\n        final Object object = new Object();\n        RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) {\n            @Override\n            protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) {\n                emitter.onSuccess(object);\n            }\n        });\n\n        doReturn(false).when(connectionResult).hasResolution();\n\n        doAnswer(invocation -> {\n            RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgument(0);\n            callbacks.setClient(apiClient);\n            callbacks.onConnectionFailed(connectionResult);\n            return apiClient;\n        }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class));\n\n        TestObserver<Object> sub = Single.create(single).test();\n\n        sub.assertNoValues();\n        sub.assertError(GoogleApiConnectionException.class);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/RxLocationTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.support.v4.content.ContextCompat;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Api;\nimport com.google.android.gms.common.api.Scope;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.ActivityRecognition;\nimport com.google.android.gms.location.LocationServices;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.BackpressureStrategy;\nimport io.reactivex.Flowable;\nimport io.reactivex.Observable;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ Observable.class, ContextCompat.class, LocationServices.class, ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })\npublic class RxLocationTest extends BaseOnSubscribeTest {\n\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    // RxFit\n\n    @Test\n    public void setTimeout() {\n        rxLocation.setDefaultTimeout(TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n        assertEquals(TIMEOUT_TIME, (long) rxLocation.timeoutTime);\n        assertEquals(TIMEOUT_TIMEUNIT, rxLocation.timeoutUnit);\n    }\n\n    @Test(expected = IllegalArgumentException.class)\n    public void setTimeout_TimeUnitMissing() {\n        rxLocation.setDefaultTimeout(TIMEOUT_TIME, null);\n        assertNull(rxLocation.timeoutTime);\n        assertNull(rxLocation.timeoutUnit);\n    }\n\n    @Test\n    public void resetDefaultTimeout() {\n        rxLocation.setDefaultTimeout(TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n        rxLocation.resetDefaultTimeout();\n        assertNull(rxLocation.timeoutTime);\n        assertNull(rxLocation.timeoutUnit);\n    }\n\n    // GoogleApiClientObservable\n\n    @Test\n    public void GoogleAPIClientObservable_Success() {\n        GoogleApiClientFlowable single = PowerMockito.spy(new GoogleApiClientFlowable(ctx, new Api[]{}, new Scope[]{}));\n\n        setupBaseFlowableSuccess(single);\n\n        Flowable.create(single, BackpressureStrategy.LATEST).test().assertValue(apiClient);\n    }\n\n    @Test\n    public void GoogleAPIClientObservable_ConnectionException() {\n        final GoogleApiClientFlowable single = PowerMockito.spy(new GoogleApiClientFlowable(ctx, new Api[]{}, new Scope[]{}));\n\n        setupBaseFlowableError(single);\n\n        assertError(Flowable.create(single, BackpressureStrategy.LATEST).test(), GoogleApiConnectionException.class);\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/SettingsOnSubscribeTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.CommonStatusCodes;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationAvailability;\nimport com.google.android.gms.location.LocationServices;\nimport com.google.android.gms.location.LocationSettingsRequest;\nimport com.google.android.gms.location.LocationSettingsResult;\nimport com.google.android.gms.location.LocationSettingsStatusCodes;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.Single;\n\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Matchers.any;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.when;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ LocationSettingsRequest.class, LocationSettingsResult.class, LocationAvailability.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })\npublic class SettingsOnSubscribeTest extends BaseOnSubscribeTest {\n\n    @Mock LocationSettingsRequest locationSettingsRequest;\n    @Mock LocationSettingsResult locationSettingsResult;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        super.setup();\n    }\n\n    // SettingsCheckSingle\n\n    @Test\n    public void SettingsCheckSingle_Success() {\n        SettingsCheckSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(true).when(status).isSuccess();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), locationSettingsResult);\n    }\n\n    @Test\n    public void SettingsCheckSingle_StatusException() {\n        SettingsCheckSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(false).when(status).isSuccess();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n\n    // SettingsCheckHandleSingle\n\n    @Test\n    public void SettingsCheckHandleSingle_Success() {\n        SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(LocationSettingsStatusCodes.SUCCESS).when(status).getStatusCode();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), true);\n    }\n\n    @Test\n    public void SettingsCheckHandleSingle_ChangeUnavailable() {\n        SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE).when(status).getStatusCode();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), false);\n    }\n\n    @Test\n    public void SettingsCheckHandleSingle_ResolutionRequired_Success() {\n        SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(LocationSettingsStatusCodes.RESOLUTION_REQUIRED).when(status).getStatusCode();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        doAnswer(invocation -> {\n            String key = (String) SettingsCheckHandleSingleOnSubscribe.observableMap.keySet().toArray()[0];\n            SettingsCheckHandleSingleOnSubscribe.onResolutionResult(key, Activity.RESULT_OK);\n            return null;\n        }).when(ctx).startActivity(any(Intent.class));\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), true);\n        assertTrue(SettingsCheckHandleSingleOnSubscribe.observableMap.isEmpty());\n    }\n\n    @Test\n    public void SettingsCheckHandleSingle_ResolutionRequired_Canceled() {\n        SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(LocationSettingsStatusCodes.RESOLUTION_REQUIRED).when(status).getStatusCode();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        doAnswer(invocation -> {\n            String key = (String) SettingsCheckHandleSingleOnSubscribe.observableMap.keySet().toArray()[0];\n            SettingsCheckHandleSingleOnSubscribe.onResolutionResult(key, Activity.RESULT_CANCELED);\n            return null;\n        }).when(ctx).startActivity(any(Intent.class));\n\n        setupBaseSingleSuccess(single);\n\n        assertSingleValue(Single.create(single).test(), false);\n        assertTrue(SettingsCheckHandleSingleOnSubscribe.observableMap.isEmpty());\n    }\n\n    @Test\n    public void SettingsCheckHandleSingle_StatusException() {\n        SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));\n\n        setPendingResultValue(locationSettingsResult);\n        doReturn(status).when(locationSettingsResult).getStatus();\n        doReturn(CommonStatusCodes.TIMEOUT).when(status).getStatusCode();\n        when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);\n\n        setupBaseSingleSuccess(single);\n\n        assertError(Single.create(single).test(), StatusException.class);\n    }\n\n}\n"
  },
  {
    "path": "library/src/test/java/com/patloew/rxlocation/SettingsTest.java",
    "content": "package com.patloew.rxlocation;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.api.Status;\nimport com.google.android.gms.location.LocationRequest;\nimport com.google.android.gms.location.LocationServices;\nimport com.google.android.gms.location.LocationSettingsRequest;\nimport com.google.android.gms.location.LocationSettingsResult;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport io.reactivex.Single;\n\nimport static junit.framework.Assert.assertEquals;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.times;\nimport static org.powermock.api.mockito.PowerMockito.spy;\n\n@SuppressWarnings(\"MissingPermission\")\n@RunWith(PowerMockRunner.class)\n@PrepareOnlyThisForTest({ Single.class, LocationRequest.class, LocationSettingsRequest.Builder.class, LocationSettingsRequest.class, LocationSettingsResult.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class })\npublic class SettingsTest extends BaseTest {\n\n    @Mock LocationSettingsRequest.Builder locationSettingsRequestBuilder;\n    @Mock LocationSettingsRequest locationSettingsRequest;\n    @Mock LocationSettingsResult locationSettingsResult;\n    @Mock LocationRequest locationRequest;\n\n    @Override\n    @Before\n    public void setup() throws Exception {\n        MockitoAnnotations.initMocks(this);\n        spy(Single.class);\n        super.setup();\n    }\n\n    @Test\n    public void Check_LocationRequest() throws Exception {\n        ArgumentCaptor<SettingsCheckSingleOnSubscribe> captor = ArgumentCaptor.forClass(SettingsCheckSingleOnSubscribe.class);\n\n        doReturn(locationSettingsRequestBuilder).when(locationSettingsRequestBuilder).addLocationRequest(locationRequest);\n        doReturn(locationSettingsRequest).when(locationSettingsRequestBuilder).build();\n\n        LocationSettings settings = spy(rxLocation.settings());\n        doReturn(locationSettingsRequestBuilder).when(settings).getLocationSettingsRequestBuilder();\n\n        settings.check(locationRequest);\n        settings.check(locationRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        SettingsCheckSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void Check_LocationSettingsRequest() throws Exception {\n        ArgumentCaptor<SettingsCheckSingleOnSubscribe> captor = ArgumentCaptor.forClass(SettingsCheckSingleOnSubscribe.class);\n\n        rxLocation.settings().check(locationSettingsRequest);\n        rxLocation.settings().check(locationSettingsRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        SettingsCheckSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void CheckAndHandleResolution_Completable_LocationRequest() throws Exception {\n        ArgumentCaptor<SettingsCheckHandleSingleOnSubscribe> captor = ArgumentCaptor.forClass(SettingsCheckHandleSingleOnSubscribe.class);\n\n        doReturn(locationSettingsRequestBuilder).when(locationSettingsRequestBuilder).addLocationRequest(locationRequest);\n        doReturn(locationSettingsRequest).when(locationSettingsRequestBuilder).build();\n\n        LocationSettings settings = spy(rxLocation.settings());\n        doReturn(locationSettingsRequestBuilder).when(settings).getLocationSettingsRequestBuilder();\n\n        settings.checkAndHandleResolutionCompletable(locationRequest);\n        settings.checkAndHandleResolutionCompletable(locationRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        SettingsCheckHandleSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void CheckAndHandleResolution_LocationRequest() throws Exception {\n        ArgumentCaptor<SettingsCheckHandleSingleOnSubscribe> captor = ArgumentCaptor.forClass(SettingsCheckHandleSingleOnSubscribe.class);\n\n        doReturn(locationSettingsRequestBuilder).when(locationSettingsRequestBuilder).addLocationRequest(locationRequest);\n        doReturn(locationSettingsRequest).when(locationSettingsRequestBuilder).build();\n\n        LocationSettings settings = spy(rxLocation.settings());\n        doReturn(locationSettingsRequestBuilder).when(settings).getLocationSettingsRequestBuilder();\n\n        settings.checkAndHandleResolution(locationRequest);\n        settings.checkAndHandleResolution(locationRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        SettingsCheckHandleSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void CheckAndHandleResolution_Completable_LocationSettingsRequest() throws Exception {\n        ArgumentCaptor<SettingsCheckHandleSingleOnSubscribe> captor = ArgumentCaptor.forClass(SettingsCheckHandleSingleOnSubscribe.class);\n\n        rxLocation.settings().checkAndHandleResolutionCompletable(locationSettingsRequest);\n        rxLocation.settings().checkAndHandleResolutionCompletable(locationSettingsRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        SettingsCheckHandleSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertTimeoutSet(single);\n    }\n\n    @Test\n    public void CheckAndHandleResolution_LocationSettingsRequest() throws Exception {\n        ArgumentCaptor<SettingsCheckHandleSingleOnSubscribe> captor = ArgumentCaptor.forClass(SettingsCheckHandleSingleOnSubscribe.class);\n\n        rxLocation.settings().checkAndHandleResolution(locationSettingsRequest);\n        rxLocation.settings().checkAndHandleResolution(locationSettingsRequest, TIMEOUT_TIME, TIMEOUT_TIMEUNIT);\n\n        PowerMockito.verifyStatic(Single.class, times(2));\n        Single.create(captor.capture());\n\n        SettingsCheckHandleSingleOnSubscribe single = captor.getAllValues().get(0);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertNoTimeoutSet(single);\n\n        single = captor.getAllValues().get(1);\n        assertEquals(locationSettingsRequest, single.locationSettingsRequest);\n        assertTimeoutSet(single);\n    }\n}\n"
  },
  {
    "path": "sample/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "sample/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 28\n\n    defaultConfig {\n        applicationId \"com.patloew.rxlocationsample\"\n        minSdkVersion 14\n        targetSdkVersion 22\n        versionCode 1\n        versionName \"1.0.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    lintOptions {\n        abortOnError false\n    }\n    testOptions {\n        unitTests.returnDefaultValues = true\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation 'com.android.support:appcompat-v7:27.1.1'\n    implementation 'com.android.support:support-v4:27.1.1'\n    implementation \"com.android.support:design:27.1.1\"\n    implementation \"com.android.support:cardview-v7:27.1.1\"\n\n    implementation project(':library')\n    //implementation 'com.patloew.rxlocation:rxlocation:1.0.5'\n\n    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'\n    implementation 'io.reactivex.rxjava2:rxjava:2.1.14'\n\n    implementation 'com.google.android.gms:play-services-location:15.0.1'\n\n    implementation('com.mikepenz:aboutlibraries:6.0.9@aar') {\n        transitive = true\n    }\n\n    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'\n    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'\n\n    testImplementation 'junit:junit:4.12'\n    testImplementation 'junit:junit:4.12'\n    testImplementation 'org.mockito:mockito-core:2.18.3'\n}\n"
  },
  {
    "path": "sample/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/patricklowenstein/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "sample/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.patloew.rxlocationsample\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n\n    <application\n        android:name=\".MyApplication\"\n        android:allowBackup=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\"com.patloew.rxlocationsample.MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "sample/src/main/java/com/patloew/rxlocationsample/MainActivity.java",
    "content": "package com.patloew.rxlocationsample;\n\nimport android.location.Address;\nimport android.location.Location;\nimport android.os.Bundle;\nimport android.support.design.widget.Snackbar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widget.TextView;\n\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.GoogleApiAvailability;\nimport com.mikepenz.aboutlibraries.Libs;\nimport com.mikepenz.aboutlibraries.LibsBuilder;\nimport com.patloew.rxlocation.RxLocation;\n\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.concurrent.TimeUnit;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class MainActivity extends AppCompatActivity implements MainView {\n\n    private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance();\n\n    private TextView lastUpdate;\n    private TextView locationText;\n    private TextView addressText;\n\n    private RxLocation rxLocation;\n\n    private MainPresenter presenter;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        lastUpdate = findViewById(R.id.tv_last_update);\n        locationText = findViewById(R.id.tv_current_location);\n        addressText = findViewById(R.id.tv_current_address);\n\n        rxLocation = new RxLocation(this);\n        rxLocation.setDefaultTimeout(15, TimeUnit.SECONDS);\n\n        presenter = new MainPresenter(rxLocation);\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n        presenter.attachView(this);\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        checkPlayServicesAvailable();\n    }\n\n    private void checkPlayServicesAvailable() {\n        final GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();\n        final int status = apiAvailability.isGooglePlayServicesAvailable(this);\n\n        if(status != ConnectionResult.SUCCESS) {\n            if(apiAvailability.isUserResolvableError(status)) {\n                apiAvailability.getErrorDialog(this, status, 1).show();\n            } else {\n                Snackbar.make(lastUpdate, \"Google Play Services unavailable. This app will not work\", Snackbar.LENGTH_INDEFINITE).show();\n            }\n        }\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        presenter.detachView();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        MyApplication.getRefWatcher().watch(presenter);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if(item.getItemId() == R.id.menu_licenses) {\n            new LibsBuilder()\n                    .withFields(Libs.toStringArray(R.string.class.getFields()))\n                    .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR)\n                    .withActivityTitle(\"Open Source Licenses\")\n                    .withLicenseShown(true)\n                    .start(this);\n\n            return true;\n        }\n\n        return false;\n    }\n\n    // View Interface\n\n    @Override\n    public void onLocationUpdate(Location location) {\n        lastUpdate.setText(DATE_FORMAT.format(new Date()));\n        locationText.setText(location.getLatitude() + \", \" + location.getLongitude());\n    }\n\n    @Override\n    public void onAddressUpdate(Address address) {\n        addressText.setText(getAddressText(address));\n    }\n\n    @Override\n    public void onLocationSettingsUnsuccessful() {\n        Snackbar.make(lastUpdate, \"Location settings requirements not satisfied. Showing last known location if available.\", Snackbar.LENGTH_INDEFINITE)\n                .setAction(\"Retry\", view -> presenter.startLocationRefresh())\n                .show();\n    }\n\n    private String getAddressText(Address address) {\n        String addressText = \"\";\n        final int maxAddressLineIndex = address.getMaxAddressLineIndex();\n\n        for(int i=0; i<=maxAddressLineIndex; i++) {\n            addressText += address.getAddressLine(i);\n            if(i != maxAddressLineIndex) { addressText += \"\\n\"; }\n        }\n\n        return addressText;\n    }\n\n}\n"
  },
  {
    "path": "sample/src/main/java/com/patloew/rxlocationsample/MainPresenter.java",
    "content": "package com.patloew.rxlocationsample;\n\nimport android.location.Address;\nimport android.location.Location;\nimport android.util.Log;\n\nimport com.google.android.gms.location.LocationRequest;\nimport com.patloew.rxlocation.RxLocation;\n\nimport io.reactivex.Observable;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.disposables.CompositeDisposable;\nimport io.reactivex.schedulers.Schedulers;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic class MainPresenter {\n\n    private final CompositeDisposable disposable = new CompositeDisposable();\n\n    private final RxLocation rxLocation;\n    private final LocationRequest locationRequest;\n\n    private MainView view;\n\n    public MainPresenter(RxLocation rxLocation) {\n        this.rxLocation = rxLocation;\n\n        this.locationRequest = LocationRequest.create()\n                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)\n                .setInterval(5000);\n    }\n\n    public void attachView(MainView view) {\n        this.view = view;\n        startLocationRefresh();\n    }\n\n    public void detachView() {\n        this.view = null;\n        disposable.clear();\n    }\n\n    public void startLocationRefresh() {\n        disposable.add(\n                rxLocation.settings().checkAndHandleResolution(locationRequest)\n                        .flatMapObservable(this::getAddressObservable)\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe(view::onAddressUpdate, throwable -> Log.e(\"MainPresenter\", \"Error fetching location/address updates\", throwable))\n        );\n    }\n\n    private Observable<Address> getAddressObservable(boolean success) {\n        if(success) {\n            return rxLocation.location().updates(locationRequest)\n                            .subscribeOn(Schedulers.io())\n                            .observeOn(AndroidSchedulers.mainThread())\n                            .doOnNext(view::onLocationUpdate)\n                            .flatMap(this::getAddressFromLocation);\n\n        } else {\n            view.onLocationSettingsUnsuccessful();\n\n            return rxLocation.location().lastLocation()\n                            .doOnSuccess(view::onLocationUpdate)\n                            .flatMapObservable(this::getAddressFromLocation);\n        }\n    }\n\n    private Observable<Address> getAddressFromLocation(Location location) {\n        return rxLocation.geocoding().fromLocation(location).toObservable()\n                .subscribeOn(Schedulers.io());\n    }\n\n\n}\n"
  },
  {
    "path": "sample/src/main/java/com/patloew/rxlocationsample/MainView.java",
    "content": "package com.patloew.rxlocationsample;\n\nimport android.location.Address;\nimport android.location.Location;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\npublic interface MainView {\n    void onLocationUpdate(Location location);\n    void onAddressUpdate(Address address);\n    void onLocationSettingsUnsuccessful();\n}\n"
  },
  {
    "path": "sample/src/main/java/com/patloew/rxlocationsample/MyApplication.java",
    "content": "package com.patloew.rxlocationsample;\n\nimport android.app.Application;\n\nimport com.squareup.leakcanary.LeakCanary;\nimport com.squareup.leakcanary.RefWatcher;\n\npublic class MyApplication extends Application {\n\n    private static RefWatcher refWatcher;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        refWatcher = LeakCanary.install(this);\n    }\n\n    public static RefWatcher getRefWatcher() {\n        return refWatcher;\n    }\n}\n"
  },
  {
    "path": "sample/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:padding=\"16dp\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Last update\"\n        style=\"@style/TextAppearance.AppCompat.Caption\"/>\n\n    <TextView\n        android:id=\"@+id/tv_last_update\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Never\"\n        style=\"@style/TextAppearance.AppCompat.Body1\"/>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:text=\"Current location\"\n        style=\"@style/TextAppearance.AppCompat.Caption\"/>\n\n    <TextView\n        android:id=\"@+id/tv_current_location\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Not available\"\n        style=\"@style/TextAppearance.AppCompat.Body1\"/>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:text=\"Current address\"\n        style=\"@style/TextAppearance.AppCompat.Caption\"/>\n\n    <TextView\n        android:id=\"@+id/tv_current_address\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Not available\"\n        style=\"@style/TextAppearance.AppCompat.Body1\"/>\n\n\n</LinearLayout>"
  },
  {
    "path": "sample/src/main/res/menu/menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item android:title=\"Open Source Licenses\"\n        app:showAsAction=\"never\"\n        android:id=\"@+id/menu_licenses\" />\n\n</menu>"
  },
  {
    "path": "sample/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">RxLocation Sample</string>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "sample/src/test/java/com/patloew/rxlocationsample/MainPresenterTest.java",
    "content": "package com.patloew.rxlocationsample;\n\nimport android.location.Address;\nimport android.location.Location;\n\nimport com.google.android.gms.location.LocationRequest;\nimport com.patloew.rxlocation.FusedLocation;\nimport com.patloew.rxlocation.Geocoding;\nimport com.patloew.rxlocation.RxLocation;\nimport com.patloew.rxlocation.LocationSettings;\n\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.junit.runners.JUnit4;\nimport org.mockito.Matchers;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.MockitoAnnotations;\n\nimport java.util.Arrays;\n\nimport io.reactivex.Maybe;\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\n\nimport static org.mockito.Matchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\n\n/* Copyright 2016 Patrick Löwenstein\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\n@RunWith(JUnit4.class)\npublic class MainPresenterTest {\n\n    @Rule public RxSchedulersOverrideRule rxSchedulersOverrideRule = new RxSchedulersOverrideRule();\n\n    @Mock RxLocation rxLocation;\n    @Mock FusedLocation fusedLocation;\n    @Mock\n    LocationSettings locationSettings;\n    @Mock Geocoding geocoding;\n\n    @Mock MainView mainView;\n\n    MainPresenter mainPresenter;\n\n    @Before\n    public void setup() {\n        MockitoAnnotations.initMocks(this);\n\n        doReturn(fusedLocation).when(rxLocation).location();\n        doReturn(locationSettings).when(rxLocation).settings();\n        doReturn(geocoding).when(rxLocation).geocoding();\n\n        mainPresenter = new MainPresenter(rxLocation);\n    }\n\n    @Test\n    public void settingsSatisfied_1Location() {\n        Location loc = Mockito.mock(Location.class);\n        Address address = Mockito.mock(Address.class);\n\n        doReturn(Single.just(true)).when(locationSettings).checkAndHandleResolution(Matchers.any(LocationRequest.class));\n        doReturn(Observable.just(loc)).when(fusedLocation).updates(Matchers.any(LocationRequest.class));\n        doReturn(Maybe.just(address)).when(geocoding).fromLocation(Matchers.any(android.location.Location.class));\n\n        mainPresenter.attachView(mainView);\n\n        verify(mainView).onLocationUpdate(loc);\n        verify(mainView).onAddressUpdate(address);\n        verifyNoMoreInteractions(mainView);\n    }\n\n    @Test\n    public void settingsNotSatisfied_LastLocation() {\n        Location loc = Mockito.mock(Location.class);\n        Address address = Mockito.mock(Address.class);\n\n        doReturn(Single.just(false)).when(locationSettings).checkAndHandleResolution(Matchers.any(LocationRequest.class));\n        doReturn(Maybe.just(loc)).when(fusedLocation).lastLocation();\n        doReturn(Maybe.just(address)).when(geocoding).fromLocation(Matchers.any(android.location.Location.class));\n\n        mainPresenter.attachView(mainView);\n\n        verify(mainView).onLocationSettingsUnsuccessful();\n        verify(mainView).onLocationUpdate(loc);\n        verify(mainView).onAddressUpdate(address);\n        verifyNoMoreInteractions(mainView);\n    }\n\n    @Test\n    public void settingsNotSatisfied_NoLastLocation() {\n        doReturn(Single.just(false)).when(locationSettings).checkAndHandleResolution(Matchers.any(LocationRequest.class));\n        doReturn(Maybe.empty()).when(fusedLocation).lastLocation();\n        mainPresenter.attachView(mainView);\n\n        verify(mainView).onLocationSettingsUnsuccessful();\n        verifyNoMoreInteractions(mainView);\n    }\n}\n"
  },
  {
    "path": "sample/src/test/java/com/patloew/rxlocationsample/RxSchedulersOverrideRule.java",
    "content": "package com.patloew.rxlocationsample;\n\nimport org.junit.rules.TestRule;\nimport org.junit.runner.Description;\nimport org.junit.runners.model.Statement;\n\nimport io.reactivex.android.plugins.RxAndroidPlugins;\nimport io.reactivex.plugins.RxJavaPlugins;\nimport io.reactivex.schedulers.Schedulers;\n\n/*  Copyright 2015 Ribot Ltd.\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at\n           http://www.apache.org/licenses/LICENSE-2.0\n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License. */\n\npublic class RxSchedulersOverrideRule implements TestRule {\n\n    @Override\n    public Statement apply(final Statement base, Description description) {\n        return new Statement() {\n            @Override\n            public void evaluate() throws Throwable {\n                RxAndroidPlugins.reset();\n                RxAndroidPlugins.setInitMainThreadSchedulerHandler(scheduler -> Schedulers.trampoline());\n\n                RxJavaPlugins.reset();\n                RxJavaPlugins.setIoSchedulerHandler(scheduler -> Schedulers.trampoline());\n                RxJavaPlugins.setComputationSchedulerHandler(scheduler -> Schedulers.trampoline());\n\n                base.evaluate();\n\n                RxAndroidPlugins.reset();\n                RxJavaPlugins.reset();\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':sample', ':library'"
  }
]