com.squalala.tariki.ui.map.MapsActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.squalala.tariki.ui.map.MapsActivity.java

Source

package com.squalala.tariki.ui.map;

import android.annotation.TargetApi;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.res.ResourcesCompat;
import android.widget.Toast;

import org.osmdroid.api.IMapController;
import org.osmdroid.tileprovider.MapTileProviderBasic;
import org.osmdroid.tileprovider.tilesource.ITileSource;
import org.osmdroid.tileprovider.tilesource.XYTileSource;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Marker;

import android.Manifest;

import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.squalala.tariki.AppComponent;
import com.squalala.tariki.BaseActivity;
import com.squalala.tariki.Constants;
import com.squalala.tariki.Permission;
import com.squalala.tariki.R;
import com.squalala.tariki.custom.RadiusMarkerClusterer;
import com.squalala.tariki.models.Event;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.ButterKnife;
import hugo.weaving.DebugLog;
import pl.charmas.android.reactivelocation.ReactiveLocationProvider;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.functions.Action1;
import rx.functions.Func1;

/*
 * Copyright 2016 Fayal KADDOURI
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
public class MapsActivity extends BaseActivity implements MapsView {

    @BindView(R.id.map)
    MapView map;

    private IMapController mapController;

    private RadiusMarkerClusterer poiMarkers;

    private Subscription updatableLocationSubscription;
    private Observable<Location> locationUpdatesObservable;

    private ReactiveLocationProvider locationProvider;

    private Marker myMarker;

    private Snackbar snackbar;

    @Inject
    MapPresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        ButterKnife.bind(this);

        if (Build.VERSION.SDK_INT >= 23) {
            new Permission(this);
        }

        final MapTileProviderBasic tileProvider = new MapTileProviderBasic(getApplicationContext());
        final ITileSource tileSource = new XYTileSource("Mapnik", 3, 19, 256, ".png",
                new String[] { Constants.TILE_SOURCE });
        //mapView.setTileSource((new XYTileSource("localMapnik", Resource, 0, 18, 256, ".png",
        //  "http://tile.openstreetmap.org/")));
        tileProvider.setTileSource(tileSource);
        map.setTileProvider(tileProvider);

        map.setBuiltInZoomControls(true);
        map.setMultiTouchControls(true);

        mapController = map.getController();
        mapController.setZoom(15);

        poiMarkers = new RadiusMarkerClusterer(this);
        map.getOverlays().add(poiMarkers);

        Drawable poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.marker_male, null);
        myMarker = new Marker(map);
        poiMarkers.add(myMarker);

        snackbar = Snackbar.make(findViewById(android.R.id.content), getString(R.string.chargement_en_cours),
                Snackbar.LENGTH_INDEFINITE);

        presenter.onCreate();

        setupLocationManager();
    }

    @Override
    public void showProgress() {
        snackbar.show();
    }

    @Override
    public void hideProgress() {
        snackbar.dismiss();
    }

    private void setupLocationManager() {

        locationProvider = new ReactiveLocationProvider(getApplicationContext());

        final LocationRequest locationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setNumUpdates(5).setInterval(100);

        locationUpdatesObservable = locationProvider.checkLocationSettings(
                new LocationSettingsRequest.Builder().addLocationRequest(locationRequest).setAlwaysShow(true) //Refrence: http://stackoverflow.com/questions/29824408/google-play-services-locationservices-api-new-option-never
                        .build())
                .doOnNext(new Action1<LocationSettingsResult>() {
                    @Override
                    public void call(LocationSettingsResult locationSettingsResult) {
                        Status status = locationSettingsResult.getStatus();
                        if (status.getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIRED) {
                        }
                    }
                }).flatMap(new Func1<LocationSettingsResult, Observable<Location>>() {
                    @Override
                    public Observable<Location> call(LocationSettingsResult locationSettingsResult) {
                        return locationProvider.getUpdatedLocation(locationRequest);
                    }
                });
    }

    @Override
    protected void onStart() {
        super.onStart();
        updatableLocationSubscription = locationUpdatesObservable

                .subscribe(new Subscriber<Location>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                    }

                    @DebugLog
                    @Override
                    public void onNext(Location location) {
                        if (location != null) {
                            GeoPoint geoPoint = new GeoPoint(location.getLatitude(), location.getLongitude());
                            Drawable poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.marker_male,
                                    null);
                            myMarker.setPosition(geoPoint);
                            myMarker.setIcon(poiIcon);
                            myMarker.setTitle("Moi");
                            mapController.setZoom(18);
                            mapController.setCenter(geoPoint);
                        }
                    }
                });

    }

    @DebugLog
    @Override
    public void showMarkers(List<Event> events) {

        for (Event event : events) {
            Marker poiMarker = new Marker(map);
            poiMarker.setPosition(event.getPosition());
            poiMarker.setTitle(event.getCategory());
            poiMarker.setSnippet(event.getDescription());
            poiMarkers.add(poiMarker);

            Drawable poiIcon;

            switch (event.getCategory()) {

            case "Travaux":
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.travaux, null);
                break;

            case "Pluie":
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.pluie, null);
                break;

            case "Accident":
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.accident, null);
                break;

            case "Chausse Glissante":
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.glissant, null);
                break;

            case "Chute de Neige":
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.neige, null);
                break;

            case "Faible visibilit":
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.eclairage, null);
                break;

            default:
                poiIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.marker_kml_point, null);
            }

            poiMarker.setIcon(poiIcon);
        }

    }

    @Override
    protected void setupComponent(AppComponent appComponent) {
        DaggerMapComponent.builder().appComponent(appComponent).mapModule(new MapModule(this)).build().inject(this);
    }

}