Skip to content

Commit 00e5563

Browse files
committed
DriverCollection, MarkerCollection and Firebase Child listener are added.
1 parent 0eef0c7 commit 00e5563

File tree

18 files changed

+466
-10
lines changed

18 files changed

+466
-10
lines changed

.idea/dictionaries/root.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,4 @@ dependencies {
6868
androidTestImplementation 'com.android.support.test:runner:1.0.2'
6969
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
7070
}
71+
apply plugin: 'com.google.gms.google-services'

app/src/main/java/spartons/com/frisbee/activities/main/ui/MainActivity.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import spartons.com.frisbee.activities.main.viewModel.MainActivityViewModel;
2525
import spartons.com.frisbee.activities.main.viewModel.MainActivityViewModelFactory;
2626
import spartons.com.frisbee.lsitener.LatLngInterpolator;
27+
import spartons.com.frisbee.repo.DriverRepo;
28+
import spartons.com.frisbee.repo.MarkerRepo;
2729
import spartons.com.frisbee.util.AppRxSchedulers;
2830
import spartons.com.frisbee.util.GoogleMapHelper;
2931
import spartons.com.frisbee.util.MarkerAnimationHelper;
@@ -44,6 +46,10 @@ public class MainActivity extends BaseActivity implements GoogleMap.OnCameraIdle
4446
GoogleMapHelper googleMapHelper;
4547
@Inject
4648
AppRxSchedulers appRxSchedulers;
49+
@Inject
50+
DriverRepo driverRepo;
51+
@Inject
52+
MarkerRepo markerRepo;
4753

4854
private TextView currentPlaceTextView;
4955

@@ -61,7 +67,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
6167
activityComponent.inject(this);
6268
MainActivityViewModelFactory factory = new MainActivityViewModelFactory(uiHelper,
6369
LocationServices.getFusedLocationProviderClient(this),
64-
appRxSchedulers
70+
appRxSchedulers,
71+
driverRepo,
72+
markerRepo,
73+
googleMapHelper
6574
);
6675
viewModel = ViewModelProviders.of(this, factory).get(MainActivityViewModel.class);
6776
geocoder = new Geocoder(this);
@@ -86,6 +95,13 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
8695
}
8796
showOrAnimateMarker(location);
8897
});
98+
viewModel.addNewMarker
99+
.observe(this, markerPair -> {
100+
if (googleMap != null && markerPair != null) {
101+
Marker marker = googleMap.addMarker(markerPair.second);
102+
viewModel.insertDriverMarker(markerPair.first, marker);
103+
}
104+
});
89105
}
90106

91107
private void initViews() {

app/src/main/java/spartons/com/frisbee/activities/main/viewModel/MainActivityViewModel.java

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,37 @@
88
import android.location.Geocoder;
99
import android.location.Location;
1010
import android.os.Looper;
11+
import android.support.v4.util.Pair;
1112
import com.google.android.gms.location.FusedLocationProviderClient;
1213
import com.google.android.gms.location.LocationCallback;
1314
import com.google.android.gms.location.LocationResult;
1415
import com.google.android.gms.maps.model.LatLng;
16+
import com.google.android.gms.maps.model.Marker;
17+
import com.google.android.gms.maps.model.MarkerOptions;
18+
import com.google.firebase.database.DatabaseReference;
19+
import com.google.firebase.database.FirebaseDatabase;
1520
import io.reactivex.Observable;
1621
import io.reactivex.disposables.CompositeDisposable;
17-
import spartons.com.frisbee.util.AppRxSchedulers;
18-
import spartons.com.frisbee.util.UiHelper;
22+
import spartons.com.frisbee.lsitener.FirebaseObjectValueListener;
23+
import spartons.com.frisbee.lsitener.LatLngInterpolator;
24+
import spartons.com.frisbee.models.Driver;
25+
import spartons.com.frisbee.repo.DriverRepo;
26+
import spartons.com.frisbee.repo.MarkerRepo;
27+
import spartons.com.frisbee.util.*;
1928

2029
import java.util.List;
2130

22-
public class MainActivityViewModel extends ViewModel {
31+
public class MainActivityViewModel extends ViewModel implements FirebaseObjectValueListener {
2332

33+
private static final String ONLINE_DRIVERS = "online_drivers";
2434
private static final String TAG = MainActivityViewModel.class.getSimpleName();
2535

36+
private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child(ONLINE_DRIVERS);
2637
private CompositeDisposable compositeDisposable = new CompositeDisposable();
2738

2839
private MediatorLiveData<String> _reverseGeocodeResult = new MediatorLiveData<>();
2940
private MediatorLiveData<Location> _currentLocation = new MediatorLiveData<>();
41+
private MediatorLiveData<Pair<String, MarkerOptions>> _addNewMarker = new MediatorLiveData<>();
3042

3143
private LocationCallback locationCallback = new LocationCallback() {
3244

@@ -40,22 +52,64 @@ public void onLocationResult(LocationResult locationResult) {
4052

4153
private final UiHelper uiHelper;
4254
private final FusedLocationProviderClient locationProviderClient;
55+
private final DriverRepo driverRepo;
56+
private final GoogleMapHelper googleMapHelper;
57+
private final MarkerRepo markerRepo;
4358
private final AppRxSchedulers appRxSchedulers;
59+
private FirebaseValueEventListenerHelper valueEventListener;
4460

4561
public LiveData<String> reverseGeocodeResult = _reverseGeocodeResult;
4662
public LiveData<Location> currentLocation = _currentLocation;
63+
public LiveData<Pair<String, MarkerOptions>> addNewMarker = _addNewMarker;
4764

48-
public MainActivityViewModel(UiHelper uiHelper, FusedLocationProviderClient locationProviderClient, AppRxSchedulers appRxSchedulers) {
65+
public MainActivityViewModel(UiHelper uiHelper, FusedLocationProviderClient locationProviderClient, DriverRepo driverRepo, MarkerRepo markerRepo, AppRxSchedulers appRxSchedulers, GoogleMapHelper googleMapHelper) {
4966
this.uiHelper = uiHelper;
5067
this.locationProviderClient = locationProviderClient;
68+
this.driverRepo = driverRepo;
69+
this.markerRepo = markerRepo;
5170
this.appRxSchedulers = appRxSchedulers;
71+
this.googleMapHelper = googleMapHelper;
72+
valueEventListener = new FirebaseValueEventListenerHelper(this);
73+
databaseReference.addChildEventListener(valueEventListener);
5274
}
5375

5476
@SuppressLint("MissingPermission")
5577
public void requestLocationUpdates() {
5678
locationProviderClient.requestLocationUpdates(uiHelper.getLocationRequest(), locationCallback, Looper.myLooper());
5779
}
5880

81+
@Override
82+
public void onDriverOnline(Driver driver) {
83+
if (driverRepo.insert(driver)) {
84+
MarkerOptions markerOptions = googleMapHelper.getDriverMarkerOptions(new LatLng(driver.lat, driver.lng), driver.angle);
85+
_addNewMarker.setValue(new Pair<>(driver.getId(), markerOptions));
86+
}
87+
}
88+
89+
public void insertDriverMarker(String key, Marker marker) {
90+
markerRepo.insert(key, marker);
91+
}
92+
93+
@Override
94+
public void onDriverChanged(Driver driver) {
95+
Driver fetchedDriver = driverRepo.get(driver.getId());
96+
if (fetchedDriver == null) return;
97+
fetchedDriver.update(driver.lat, driver.lng, driver.angle);
98+
Marker marker = markerRepo.get(fetchedDriver.getId());
99+
if (marker == null) return;
100+
marker.setRotation(fetchedDriver.angle + 90);
101+
MarkerAnimationHelper.animateMarkerToGB(marker, new LatLng(fetchedDriver.lat, fetchedDriver.lng), new LatLngInterpolator.Spherical());
102+
}
103+
104+
@Override
105+
public void onDriverOffline(Driver driver) {
106+
compositeDisposable.add(driverRepo.remove(driver.getId())
107+
.subscribe(b -> {
108+
if (b)
109+
markerRepo.remove(driver.getId());
110+
}, Throwable::printStackTrace));
111+
}
112+
59113
public void makeReverseGeocodeRequest(LatLng latLng, Geocoder geocoder) {
60114
compositeDisposable.add(Observable.<String>create(emitter -> {
61115
try {
@@ -78,7 +132,9 @@ protected void onCleared() {
78132
super.onCleared();
79133
compositeDisposable.clear();
80134
locationProviderClient.removeLocationUpdates(locationCallback);
135+
databaseReference.removeEventListener(valueEventListener);
136+
databaseReference = null;
81137
compositeDisposable = null;
82138
locationCallback = null;
83139
}
84-
}
140+
}

app/src/main/java/spartons/com/frisbee/activities/main/viewModel/MainActivityViewModelFactory.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,33 @@
44
import android.arch.lifecycle.ViewModelProvider;
55
import android.support.annotation.NonNull;
66
import com.google.android.gms.location.FusedLocationProviderClient;
7+
import spartons.com.frisbee.repo.DriverRepo;
8+
import spartons.com.frisbee.repo.MarkerRepo;
79
import spartons.com.frisbee.util.AppRxSchedulers;
10+
import spartons.com.frisbee.util.GoogleMapHelper;
811
import spartons.com.frisbee.util.UiHelper;
912

1013
public class MainActivityViewModelFactory implements ViewModelProvider.Factory {
1114

1215
private final UiHelper uiHelper;
1316
private final FusedLocationProviderClient locationProviderClient;
1417
private final AppRxSchedulers appRxSchedulers;
18+
private final DriverRepo driverRepo;
19+
private final MarkerRepo markerRepo;
20+
private final GoogleMapHelper googleMapHelper;
1521

16-
public MainActivityViewModelFactory(UiHelper uiHelper, FusedLocationProviderClient locationProviderClient, AppRxSchedulers appRxSchedulers) {
22+
public MainActivityViewModelFactory(UiHelper uiHelper, FusedLocationProviderClient locationProviderClient, AppRxSchedulers appRxSchedulers, DriverRepo driverRepo, MarkerRepo markerRepo, GoogleMapHelper googleMapHelper) {
1723
this.uiHelper = uiHelper;
1824
this.locationProviderClient = locationProviderClient;
1925
this.appRxSchedulers = appRxSchedulers;
26+
this.driverRepo = driverRepo;
27+
this.markerRepo = markerRepo;
28+
this.googleMapHelper = googleMapHelper;
2029
}
2130

2231
@NonNull
2332
@Override
2433
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
25-
return (T) new MainActivityViewModel(uiHelper, locationProviderClient, appRxSchedulers);
34+
return (T) new MainActivityViewModel(uiHelper, locationProviderClient, driverRepo, markerRepo, appRxSchedulers, googleMapHelper);
2635
}
2736
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package spartons.com.frisbee.collections;
2+
3+
import android.annotation.TargetApi;
4+
import android.os.Build;
5+
import io.reactivex.Observable;
6+
import spartons.com.frisbee.models.Driver;
7+
import spartons.com.frisbee.util.AppRxSchedulers;
8+
9+
import javax.inject.Inject;
10+
import java.util.List;
11+
import java.util.concurrent.CopyOnWriteArrayList;
12+
import java.util.stream.Collector;
13+
import java.util.stream.Collectors;
14+
15+
public class DriverCollection {
16+
17+
private final AppRxSchedulers appRxSchedulers;
18+
19+
private List<Driver> driverList = new CopyOnWriteArrayList<>();
20+
21+
@Inject
22+
public DriverCollection(AppRxSchedulers appRxSchedulers) {
23+
this.appRxSchedulers = appRxSchedulers;
24+
}
25+
26+
public boolean insertDriver(Driver driver) {
27+
return driverList.add(driver);
28+
}
29+
30+
private Observable<Boolean> removeDriver(Driver driver) {
31+
return Observable.fromIterable(driverList)
32+
.subscribeOn(appRxSchedulers.computation())
33+
.filter(driver1 -> driver.getId().equals(driver1.getId()))
34+
.map(driver1 -> driverList.remove(driver1))
35+
.observeOn(appRxSchedulers.mainThread());
36+
}
37+
38+
public Observable<Boolean> removeDriver(String id) {
39+
Driver driver = getDriverWithId(id);
40+
if (driver != null)
41+
return removeDriver(driver);
42+
return Observable.just(false);
43+
}
44+
45+
public List<Driver> allDriver() {
46+
return driverList;
47+
}
48+
49+
public Driver getDriverWithId(String id) {
50+
Driver driver1;
51+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
52+
driver1 = getStreamAbleDriver(id);
53+
else
54+
driver1 = getSynchronousDriver(id);
55+
return driver1;
56+
}
57+
58+
private Driver getSynchronousDriver(String driverId) {
59+
for (Driver driver : driverList)
60+
if (driverId.equals(driver.getId()))
61+
return driver;
62+
return null;
63+
}
64+
65+
@TargetApi(Build.VERSION_CODES.N)
66+
private Driver getStreamAbleDriver(String driverId) {
67+
try {
68+
return driverList
69+
.stream()
70+
.filter(driver -> driver.getId().equals(driverId))
71+
.collect(toSingleton());
72+
} catch (Exception __) {
73+
return null;
74+
}
75+
}
76+
77+
@TargetApi(Build.VERSION_CODES.N)
78+
private <T> Collector<T, ?, T> toSingleton() {
79+
return Collectors.collectingAndThen(
80+
Collectors.toList(),
81+
list -> {
82+
if (list.size() != 1)
83+
throw new IllegalStateException("No item found");
84+
return list.get(0);
85+
}
86+
);
87+
}
88+
}
89+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package spartons.com.frisbee.collections;
2+
3+
import android.util.Log;
4+
import com.google.android.gms.maps.model.Marker;
5+
6+
import javax.inject.Inject;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
public class MarkerCollection {
11+
12+
private Map<String, Marker> markerMap = new HashMap<>();
13+
14+
@Inject
15+
public MarkerCollection() {
16+
17+
}
18+
19+
public void insertMarker(String key, Marker marker) {
20+
if (!markerMap.containsKey(key))
21+
markerMap.put(key, marker);
22+
else
23+
Log.e("MarkerCollection", "false");
24+
}
25+
26+
public void removeMarker(String driverId) {
27+
Marker marker = getMarker(driverId);
28+
if (marker != null) {
29+
marker.remove();
30+
markerMap.remove(driverId);
31+
}
32+
}
33+
34+
public Marker getMarker(String driverId) {
35+
return markerMap.get(driverId);
36+
}
37+
38+
public Map<String, Marker> allMarkers() {
39+
return markerMap;
40+
}
41+
42+
}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package spartons.com.frisbee.di.component;
22

33
import dagger.Component;
4+
import spartons.com.frisbee.di.modules.RepositoryModule;
45
import spartons.com.frisbee.di.modules.UtilModule;
56
import spartons.com.frisbee.di.scopes.CustomApplicationScope;
7+
import spartons.com.frisbee.repo.DriverRepo;
8+
import spartons.com.frisbee.repo.MarkerRepo;
69
import spartons.com.frisbee.util.AppRxSchedulers;
710
import spartons.com.frisbee.util.GoogleMapHelper;
811
import spartons.com.frisbee.util.UiHelper;
912

1013
@CustomApplicationScope
11-
@Component(modules = {UtilModule.class})
14+
@Component(modules = {UtilModule.class, RepositoryModule.class})
1215
public interface AppComponent {
1316

1417
UiHelper uiHelper();
1518

1619
AppRxSchedulers appRxSchedulers();
1720

1821
GoogleMapHelper googleMapHelper();
22+
23+
DriverRepo driverRepo();
24+
25+
MarkerRepo markerRepo();
1926
}

0 commit comments

Comments
 (0)