Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ apply plugin: 'com.android.application'

android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
buildToolsVersion '25.0.0'

defaultConfig {
applicationId "com.github.plastiv.rxautocompletesample"
Expand Down
8 changes: 5 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.plastiv.rxautocompletesample" >
package="com.github.plastiv.rxautocompletesample">

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

<application
android:name=".AutocompleteSampleApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:theme="@style/AppTheme">
<activity
android:name=".view.AddressAutocompleteActivity"
android:label="@string/app_name" >
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.github.plastiv.rxautocompletesample.domain;

import java.util.List;
import java.util.concurrent.TimeUnit;

import android.text.TextUtils;

import com.github.plastiv.rxautocompletesample.googleplaces.GooglePlacesApiError;
import com.github.plastiv.rxautocompletesample.googleplaces.GooglePlacesConnector;
import com.github.plastiv.rxautocompletesample.googleplaces.model.AddressComponent;
import com.github.plastiv.rxautocompletesample.googleplaces.model.Geometry;
import com.github.plastiv.rxautocompletesample.googleplaces.model.PlaceDetails;
import com.github.plastiv.rxautocompletesample.googleplaces.model.PlaceDetailsResult;
import com.github.plastiv.rxautocompletesample.googleplaces.model.Prediction;
Expand All @@ -19,10 +17,12 @@
import com.github.plastiv.rxautocompletesample.storage.ContactStorage;
import com.github.plastiv.rxautocompletesample.storage.ProfileStorage;

import java.util.List;
import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.functions.Func1;
import rx.subjects.PublishSubject;
import rx.subjects.Subject;

public class AddressAutocomplete {

Expand All @@ -42,15 +42,16 @@ public AddressAutocomplete(ProfileStorage profileStorage,

public Observable<List<Address>> asObservable() {
return searchQuery.asObservable()
.debounce(500, TimeUnit.MILLISECONDS)
.switchMap(new Func1<String, Observable<List<Address>>>() {
@Override public Observable<List<Address>> call(String s) {
return Observable.merge(contactAddress(s),
profileAddress(s),
googleAddress(s))
.toList();
}
});
.debounce(500, TimeUnit.MILLISECONDS)
.switchMap(new Func1<String, Observable<List<Address>>>() {
@Override
public Observable<List<Address>> call(String s) {
return Observable.merge(contactAddress(s),
profileAddress(s),
googleAddress(s))
.toList();
}
});
}

public void onQueryChange(String query) {
Expand All @@ -60,36 +61,40 @@ public void onQueryChange(String query) {
public Observable<Address> contactAddress(final String search) {
Observable<Contact> contacts = contactStorage.getAll();
return contacts.map(new Func1<Contact, Address>() {
@Override public Address call(Contact contact) {
@Override
public Address call(Contact contact) {
return contact.getAddress();
}
})
.filter(new Func1<Address, Boolean>() {
@Override public Boolean call(Address address) {
if (address == null) {
return false;
}
return address.contains(search);
}
});
.filter(new Func1<Address, Boolean>() {
@Override
public Boolean call(Address address) {
if (address == null) {
return false;
}
return address.contains(search);
}
});
}

public Observable<Address> profileAddress(final String search) {
Observable<Profile> profile = profileStorage.get();
return profile.flatMap(new Func1<Profile, Observable<Address>>() {
@Override public Observable<Address> call(Profile profile) {
@Override
public Observable<Address> call(Profile profile) {
return Observable.just(profile.getHomeAddress(),
profile.getWorkAddress());
profile.getWorkAddress());
}
})
.filter(new Func1<Address, Boolean>() {
@Override public Boolean call(Address address) {
if (address == null) {
return false;
}
return address.contains(search);
}
});
.filter(new Func1<Address, Boolean>() {
@Override
public Boolean call(Address address) {
if (address == null) {
return false;
}
return address.contains(search);
}
});
}

public Observable<Address> googleAddress(final String search) {
Expand All @@ -100,7 +105,8 @@ public Observable<Address> googleAddress(final String search) {
return googlePlacesConnector
.autocomplete(search, "country:de")
.onErrorResumeNext(new Func1<Throwable, Observable<? extends PredictionResult>>() {
@Override public Observable<? extends PredictionResult> call(Throwable throwable) {
@Override
public Observable<? extends PredictionResult> call(Throwable throwable) {
if (throwable instanceof GooglePlacesApiError) {
GooglePlacesApiError error = (GooglePlacesApiError) throwable;
if (error.getStatusCode() == StatusCode.InvalidRequest) {
Expand All @@ -113,18 +119,21 @@ public Observable<Address> googleAddress(final String search) {
}
})
.flatMap(new Func1<PredictionResult, Observable<Prediction>>() {
@Override public Observable<Prediction> call(PredictionResult predictionResult) {
@Override
public Observable<Prediction> call(PredictionResult predictionResult) {
return Observable.from(predictionResult.getPredictions());
}
})
.flatMap(new Func1<Prediction, Observable<PlaceDetailsResult>>() {
@Override public Observable<PlaceDetailsResult> call(Prediction prediction) {
@Override
public Observable<PlaceDetailsResult> call(Prediction prediction) {
return googlePlacesConnector.details(prediction.getPlaceId());
}
})
.onErrorResumeNext(Observable.<PlaceDetailsResult>empty())
.map(new Func1<PlaceDetailsResult, Address>() {
@Override public Address call(PlaceDetailsResult placeDetailsResult) {
@Override
public Address call(PlaceDetailsResult placeDetailsResult) {
PlaceDetails details = placeDetailsResult.getResult();
return convert(details);
}
Expand All @@ -134,6 +143,7 @@ public Observable<Address> googleAddress(final String search) {
public static Address convert(PlaceDetails placeDetails) {
Address.Builder builder = new Address.Builder();
List<AddressComponent> addressComponents = placeDetails.getAddressComponents();
Geometry geometry = placeDetails.getGeometry();
for (AddressComponent component : addressComponents) {
if (component.isCountry()) {
builder.country(component.getLongName());
Expand All @@ -147,6 +157,8 @@ public static Address convert(PlaceDetails placeDetails) {
builder.houseNumber(component.getLongName());
}
}
builder.latitude(geometry.getLocation().getLat());
builder.longitude(geometry.getLocation().getLng());
return builder.build();
}
}
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.1.3'
classpath 'com.android.tools.build:gradle:2.3.1'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013
#Sat Apr 15 23:17:30 IST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip