Browse Source

stop map picker

tags/v1.0.0
Robin Thoni 7 years ago
parent
commit
2ace14637e

+ 6
- 0
app/build.gradle View File

@@ -11,6 +11,7 @@ android {
11 11
         targetSdkVersion 23
12 12
         versionCode 1
13 13
         versionName "1.0"
14
+        multiDexEnabled true
14 15
     }
15 16
     buildTypes {
16 17
         release {
@@ -25,10 +26,12 @@ android {
25 26
         dev {
26 27
             applicationId "com.rthoni.stssaguenay.dev"
27 28
             versionName "1.0-dev"
29
+            minSdkVersion 21
28 30
         }
29 31
         devlocal {
30 32
             applicationId "com.rthoni.stssaguenay.devlocal"
31 33
             versionName "1.0-devlocal"
34
+            minSdkVersion 21
32 35
         }
33 36
     }
34 37
 }
@@ -47,6 +50,9 @@ dependencies {
47 50
     compile 'com.google.firebase:firebase-ads:9.6.1'
48 51
     compile 'com.facebook.android:facebook-android-sdk:4.5.0'
49 52
     compile 'com.github.simbiose:Encryption:1.4.0'
53
+    compile 'com.google.android.gms:play-services:9.6.1'
54
+    compile 'com.android.support:multidex:1.0.1'
55
+    compile 'com.google.maps.android:android-maps-utils:0.4+'
50 56
 }
51 57
 
52 58
 apply plugin: 'com.google.gms.google-services'

+ 5
- 1
app/src/main/AndroidManifest.xml View File

@@ -2,6 +2,8 @@
2 2
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 3
           package="com.rthoni.stssaguenay">
4 4
 
5
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
6
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
5 7
     <uses-permission android:name="android.permission.INTERNET"/>
6 8
 
7 9
     <application
@@ -9,7 +11,8 @@
9 11
         android:icon="@mipmap/ic_launcher"
10 12
         android:label="@string/app_name"
11 13
         android:supportsRtl="true"
12
-        android:theme="@style/AppTheme">
14
+        android:theme="@style/AppTheme"
15
+        android:name="android.support.multidex.MultiDexApplication">
13 16
 
14 17
         <activity
15 18
             android:name=".ui.activities.MainActivity"
@@ -30,6 +33,7 @@
30 33
                 android:name="android.support.PARENT_ACTIVITY"
31 34
                 android:value="com.rthoni.stssaguenay.ui.activities.MainActivity"/>
32 35
         </activity>
36
+        <meta-data android:name="com.google.android.geo.API_KEY" android:value="@string/map_api_key"/>
33 37
 
34 38
         <activity android:name="com.facebook.FacebookActivity"
35 39
                   android:configChanges=

+ 8
- 0
app/src/main/java/com/rthoni/stssaguenay/ui/activities/MainActivity.java View File

@@ -1,11 +1,13 @@
1 1
 package com.rthoni.stssaguenay.ui.activities;
2 2
 
3 3
 import android.app.ProgressDialog;
4
+import android.content.Context;
4 5
 import android.content.DialogInterface;
5 6
 import android.content.Intent;
6 7
 import android.os.Bundle;
7 8
 import android.support.design.widget.FloatingActionButton;
8 9
 import android.support.design.widget.NavigationView;
10
+import android.support.multidex.MultiDex;
9 11
 import android.support.v4.app.FragmentManager;
10 12
 import android.support.v4.widget.DrawerLayout;
11 13
 import android.support.v7.app.ActionBar;
@@ -174,6 +176,12 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
174 176
         goToHome();
175 177
     }
176 178
 
179
+    @Override
180
+    protected void attachBaseContext(Context newBase) {
181
+        super.attachBaseContext(newBase);
182
+        MultiDex.install(this);
183
+    }
184
+
177 185
     @Override
178 186
     public boolean onSupportNavigateUp() {
179 187
         if (_fragmentManager.getBackStackEntryCount() == 0) {

+ 3
- 1
app/src/main/java/com/rthoni/stssaguenay/ui/activities/StopPickerActivity.java View File

@@ -13,6 +13,7 @@ import com.rthoni.stssaguenay.R;
13 13
 import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
14 14
 import com.rthoni.stssaguenay.dbo.StopsDbo;
15 15
 import com.rthoni.stssaguenay.ui.fragments.StopListPickerFragment;
16
+import com.rthoni.stssaguenay.ui.fragments.StopMapPickerFragment;
16 17
 import com.rthoni.stssaguenay.ui.fragments.StopRoutesPickerFragment;
17 18
 
18 19
 public class StopPickerActivity extends AppCompatActivity {
@@ -46,7 +47,8 @@ public class StopPickerActivity extends AppCompatActivity {
46 47
 
47 48
     public void goToStops()
48 49
     {
49
-        StopListPickerFragment f = new StopListPickerFragment();
50
+//        StopListPickerFragment f = new StopListPickerFragment();
51
+        StopMapPickerFragment f = new StopMapPickerFragment();
50 52
         f.setOnStopSelectedConsumer(new LuPromise.LuConsumer<StopsDbo>() {
51 53
             @Override
52 54
             public void execute(StopsDbo data) {

+ 1
- 1
app/src/main/java/com/rthoni/stssaguenay/ui/fragments/StopListPickerFragment.java View File

@@ -129,7 +129,7 @@ public class StopListPickerFragment extends Fragment {
129 129
     @Nullable
130 130
     @Override
131 131
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
132
-        View v = inflater.inflate(R.layout.fragment_stop_picker, container, false);
132
+        View v = inflater.inflate(R.layout.fragment_stop_picker_list, container, false);
133 133
         ButterKnife.bind(this, v);
134 134
 
135 135
         _stopsAdapter = new StopsAdapter();

+ 245
- 0
app/src/main/java/com/rthoni/stssaguenay/ui/fragments/StopMapPickerFragment.java View File

@@ -0,0 +1,245 @@
1
+package com.rthoni.stssaguenay.ui.fragments;
2
+
3
+import android.Manifest;
4
+import android.app.ProgressDialog;
5
+import android.content.Context;
6
+import android.content.pm.PackageManager;
7
+import android.os.Bundle;
8
+import android.support.annotation.NonNull;
9
+import android.support.annotation.Nullable;
10
+import android.support.v4.app.ActivityCompat;
11
+import android.support.v4.app.Fragment;
12
+import android.view.LayoutInflater;
13
+import android.view.View;
14
+import android.view.ViewGroup;
15
+import android.widget.Toast;
16
+
17
+import com.google.android.gms.maps.CameraUpdateFactory;
18
+import com.google.android.gms.maps.GoogleMap;
19
+import com.google.android.gms.maps.MapView;
20
+import com.google.android.gms.maps.OnMapReadyCallback;
21
+import com.google.android.gms.maps.model.LatLng;
22
+import com.google.android.gms.maps.model.Marker;
23
+import com.google.android.gms.maps.model.MarkerOptions;
24
+import com.google.maps.android.clustering.ClusterItem;
25
+import com.google.maps.android.clustering.ClusterManager;
26
+import com.google.maps.android.clustering.view.DefaultClusterRenderer;
27
+import com.luticate.utils.business.LuPromise;
28
+import com.rthoni.stssaguenay.R;
29
+import com.rthoni.stssaguenay.business.STSBusiness;
30
+import com.rthoni.stssaguenay.business.StopsBusiness;
31
+import com.rthoni.stssaguenay.dbo.StopsDbo;
32
+
33
+import java.util.HashMap;
34
+import java.util.List;
35
+
36
+import butterknife.BindView;
37
+import butterknife.ButterKnife;
38
+
39
+/**
40
+ * Created by robin on 9/29/16.
41
+ */
42
+public class StopMapPickerFragment extends Fragment {
43
+
44
+    public static class StopDboMapItem implements ClusterItem {
45
+        private LatLng _latLng;
46
+
47
+        private StopsDbo _stopsDbo;
48
+
49
+        StopDboMapItem(StopsDbo stopsDbo) {
50
+            _stopsDbo = stopsDbo;
51
+            _latLng = new LatLng(_stopsDbo.getPosY(), _stopsDbo.getPosX());
52
+        }
53
+
54
+        @Override
55
+        public LatLng getPosition() {
56
+            return _latLng;
57
+        }
58
+
59
+        public StopsDbo getStopsDbo() {
60
+            return _stopsDbo;
61
+        }
62
+    }
63
+
64
+    public static class StopDboMapRenderer extends DefaultClusterRenderer<StopDboMapItem> {
65
+
66
+        private HashMap<String, StopDboMapItem> _items = new HashMap<>();
67
+
68
+        public StopDboMapRenderer(Context context, GoogleMap map, ClusterManager<StopDboMapItem> clusterManager) {
69
+            super(context, map, clusterManager);
70
+        }
71
+
72
+        @Override
73
+        protected void onBeforeClusterItemRendered(StopDboMapItem item, MarkerOptions markerOptions) {
74
+            markerOptions.title(item.getStopsDbo().getFullName());
75
+            super.onBeforeClusterItemRendered(item, markerOptions);
76
+        }
77
+
78
+        @Override
79
+        protected void onClusterItemRendered(StopDboMapItem clusterItem, Marker marker) {
80
+            _items.put(marker.getId(), clusterItem);
81
+            super.onClusterItemRendered(clusterItem, marker);
82
+        }
83
+
84
+        public StopDboMapItem getStopItem(String id)
85
+        {
86
+            return _items.get(id);
87
+        }
88
+    }
89
+
90
+    @BindView(R.id.mapView)
91
+    MapView _mapView;
92
+
93
+    private LuPromise.LuConsumer<StopsDbo> _onStopSelectedConsumer;
94
+
95
+    private GoogleMap _map;
96
+
97
+    private List<StopsDbo> _stopsDbos;
98
+
99
+    private StopDboMapRenderer _renderer;
100
+
101
+    @Override
102
+    public void onStart() {
103
+        _mapView.onStart();
104
+        super.onStart();
105
+    }
106
+
107
+    @Override
108
+    public void onResume() {
109
+        _mapView.onResume();
110
+        super.onResume();
111
+    }
112
+
113
+    @Override
114
+    public void onPause() {
115
+        _mapView.onPause();
116
+        super.onPause();
117
+    }
118
+
119
+    @Override
120
+    public void onStop() {
121
+        _mapView.onStop();
122
+        super.onStop();
123
+    }
124
+
125
+    @Override
126
+    public void onDestroy() {
127
+        _mapView.onDestroy();
128
+        super.onDestroy();
129
+    }
130
+
131
+    @Override
132
+    public void onSaveInstanceState(Bundle outState) {
133
+        _mapView.onSaveInstanceState(outState);
134
+        super.onSaveInstanceState(outState);
135
+    }
136
+
137
+    @Override
138
+    public void onLowMemory() {
139
+        _mapView.onLowMemory();
140
+        super.onLowMemory();
141
+    }
142
+
143
+    @Nullable
144
+    @Override
145
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
146
+        View v = inflater.inflate(R.layout.fragment_stop_picker_map, container, false);
147
+        ButterKnife.bind(this, v);
148
+
149
+        _mapView.onCreate(savedInstanceState);
150
+        _mapView.getMapAsync(new OnMapReadyCallback() {
151
+            @Override
152
+            public void onMapReady(GoogleMap googleMap) {
153
+                _map = googleMap;
154
+                setupMap();
155
+            }
156
+        });
157
+
158
+        loadStops();
159
+
160
+        return v;
161
+    }
162
+
163
+    @Override
164
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
165
+        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ||
166
+                ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
167
+            _map.setMyLocationEnabled(true);
168
+        }
169
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
170
+    }
171
+
172
+    public void setupMap()
173
+    {
174
+        _map.getUiSettings().setMyLocationButtonEnabled(true);
175
+        _map.getUiSettings().setCompassEnabled(true);
176
+        _map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(48.3786565, -71.3354953), 9));
177
+        _map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
178
+            @Override
179
+            public void onInfoWindowClick(Marker marker) {
180
+                onStopSelected(_renderer.getStopItem(marker.getId()).getStopsDbo());
181
+            }
182
+        });
183
+        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ||
184
+                ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
185
+            _map.setMyLocationEnabled(true);
186
+        }
187
+        else {
188
+            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
189
+        }
190
+        if (_stopsDbos != null) {
191
+            addStops();
192
+        }
193
+    }
194
+
195
+    public void loadStops()
196
+    {
197
+        final ProgressDialog progressDialog = new ProgressDialog(getContext());
198
+        progressDialog.setIndeterminate(true);
199
+        progressDialog.setCancelable(false);
200
+        progressDialog.show();
201
+        progressDialog.setTitle(R.string.loading);
202
+        progressDialog.setMessage(getString(R.string.loading_stops));
203
+
204
+        StopsBusiness.getAll(STSBusiness.getConfig(getContext()))
205
+                .then(new LuPromise.LuConsumer<List<StopsDbo>>() {
206
+                    @Override
207
+                    public void execute(List<StopsDbo> data) {
208
+                        progressDialog.dismiss();
209
+                        _stopsDbos = data;
210
+                        if (_map != null) {
211
+                            addStops();
212
+                        }
213
+                    }
214
+                }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
215
+                    @Override
216
+                    public void execute(LuPromise.LuPromiseError data) {
217
+                        progressDialog.dismiss();
218
+                        _stopsDbos = null;
219
+                        Toast.makeText(getContext(), data.getError(), Toast.LENGTH_LONG).show();
220
+                    }
221
+                });
222
+    }
223
+
224
+    public void addStops()
225
+    {
226
+        ClusterManager<StopDboMapItem> clusterManager = new ClusterManager<>(getContext(), _map);
227
+        _renderer = new StopDboMapRenderer(getContext(), _map, clusterManager);
228
+        clusterManager.setRenderer(_renderer);
229
+        for (StopsDbo stopsDbo : _stopsDbos) {
230
+            clusterManager.addItem(new StopDboMapItem(stopsDbo));
231
+        }
232
+        _map.setOnCameraIdleListener(clusterManager);
233
+    }
234
+
235
+    public void onStopSelected(StopsDbo stopsDbo)
236
+    {
237
+        if (_onStopSelectedConsumer != null) {
238
+            _onStopSelectedConsumer.execute(stopsDbo);
239
+        }
240
+    }
241
+
242
+    public void setOnStopSelectedConsumer(LuPromise.LuConsumer<StopsDbo> onStopSelectedConsumer) {
243
+        _onStopSelectedConsumer = onStopSelectedConsumer;
244
+    }
245
+}

+ 0
- 4
app/src/main/res/layout/activity_stop_picker.xml View File

@@ -5,10 +5,6 @@
5 5
     xmlns:ads="http://schemas.android.com/apk/res-auto"
6 6
     android:layout_width="match_parent"
7 7
     android:layout_height="match_parent"
8
-    android:paddingBottom="@dimen/activity_vertical_margin"
9
-    android:paddingLeft="@dimen/activity_horizontal_margin"
10
-    android:paddingRight="@dimen/activity_horizontal_margin"
11
-    android:paddingTop="@dimen/activity_vertical_margin"
12 8
     app:layout_behavior="@string/appbar_scrolling_view_behavior"
13 9
     tools:context=".ui.activities.StopPickerActivity">
14 10
 

app/src/main/res/layout/fragment_stop_picker.xml → app/src/main/res/layout/fragment_stop_picker_list.xml View File

@@ -1,7 +1,11 @@
1 1
 <?xml version="1.0" encoding="utf-8"?>
2 2
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 3
                 android:layout_width="match_parent"
4
-                android:layout_height="match_parent">
4
+                android:layout_height="match_parent"
5
+                android:paddingBottom="@dimen/activity_vertical_margin"
6
+                android:paddingLeft="@dimen/activity_horizontal_margin"
7
+                android:paddingRight="@dimen/activity_horizontal_margin"
8
+                android:paddingTop="@dimen/activity_vertical_margin">
5 9
 
6 10
     <EditText
7 11
         android:layout_width="wrap_content"

+ 16
- 0
app/src/main/res/layout/fragment_stop_picker_map.xml View File

@@ -0,0 +1,16 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
+                android:layout_width="match_parent"
4
+                android:layout_height="match_parent">
5
+
6
+    <com.google.android.gms.maps.MapView
7
+        android:layout_width="wrap_content"
8
+        android:layout_height="wrap_content"
9
+        android:id="@+id/mapView"
10
+        android:layout_alignParentTop="true"
11
+        android:layout_alignParentLeft="true"
12
+        android:layout_alignParentStart="true"
13
+        android:layout_alignParentRight="true"
14
+        android:layout_alignParentEnd="true"
15
+        android:layout_alignParentBottom="true"/>
16
+</RelativeLayout>

+ 5
- 1
app/src/main/res/layout/fragment_stop_route_picker.xml View File

@@ -1,7 +1,11 @@
1 1
 <?xml version="1.0" encoding="utf-8"?>
2 2
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 3
                 android:layout_width="match_parent"
4
-                android:layout_height="match_parent">
4
+                android:layout_height="match_parent"
5
+                android:paddingBottom="@dimen/activity_vertical_margin"
6
+                android:paddingLeft="@dimen/activity_horizontal_margin"
7
+                android:paddingRight="@dimen/activity_horizontal_margin"
8
+                android:paddingTop="@dimen/activity_vertical_margin">
5 9
 
6 10
     <LinearLayout
7 11
         android:orientation="vertical"

+ 1
- 0
app/src/main/res/values/strings.xml View File

@@ -3,6 +3,7 @@
3 3
     <string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string>
4 4
     <string name="ad_init">ca-app-pub-2016581167110949~3084832113</string>
5 5
     <string name="facebook_app_id">1463583156990249</string>
6
+    <string name="map_api_key">AIzaSyD4FmpkQmk2t61Lx9spzpTx2CAy2CmijX0</string>
6 7
     <string name="luticate_config">{\"baseURL\": \"https://sts.rthoni.com/api/v1/\"}</string>
7 8
 
8 9
 

+ 4
- 0
luticateutils/src/main/java/com/luticate/utils/business/LuRequest.java View File

@@ -4,6 +4,7 @@ import android.content.Context;
4 4
 import android.net.Uri;
5 5
 
6 6
 import com.android.volley.AuthFailureError;
7
+import com.android.volley.DefaultRetryPolicy;
7 8
 import com.android.volley.Request;
8 9
 import com.android.volley.RequestQueue;
9 10
 import com.android.volley.Response;
@@ -122,6 +123,9 @@ public class LuRequest {
122 123
                 return config.getHeaders();
123 124
             }
124 125
         };
126
+        request.setRetryPolicy(new DefaultRetryPolicy(10000,
127
+                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
128
+                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
125 129
         _requestQueue.add(request);
126 130
         return promise;
127 131
     }

Loading…
Cancel
Save