Browse Source

show next schedules; pull to refresh

tags/v1.0.0
Robin Thoni 7 years ago
parent
commit
4a9b9082fb

+ 8
- 4
app/src/main/java/com/rthoni/stssaguenay/business/SchedulesBusiness.java View File

2
 
2
 
3
 import com.luticate.utils.business.LuPromise;
3
 import com.luticate.utils.business.LuPromise;
4
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
4
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
5
+import com.rthoni.stssaguenay.dataaccess.SchedulesDataAccess;
5
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
6
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
7
+import com.rthoni.stssaguenay.dbo.SchedulesDbo;
8
+
9
+import org.joda.time.LocalDateTime;
6
 
10
 
7
 import java.util.List;
11
 import java.util.List;
8
 
12
 
12
 
16
 
13
 public class SchedulesBusiness {
17
 public class SchedulesBusiness {
14
 
18
 
15
-//    public static LuPromise<List> getMultiple(LuDataAccessConfigDbo config, List<FavouriteStopDbo> favouriteStopDbos)
16
-//    {
17
-//
18
-//    }
19
+    public static LuPromise<List<SchedulesDbo>> getMultiple(LuDataAccessConfigDbo config, List<FavouriteStopDbo> favouriteStopDbos, LocalDateTime date, int count)
20
+    {
21
+        return SchedulesDataAccess.getMultiple(config, favouriteStopDbos, date, count);
22
+    }
19
 }
23
 }

+ 36
- 4
app/src/main/java/com/rthoni/stssaguenay/dataaccess/SchedulesDataAccess.java View File

4
 import com.luticate.utils.business.LuRequest;
4
 import com.luticate.utils.business.LuRequest;
5
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
5
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
6
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
6
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
7
+import com.rthoni.stssaguenay.dbo.RoutesDbo;
8
+import com.rthoni.stssaguenay.dbo.SchedulesDbo;
7
 
9
 
10
+import org.joda.time.LocalDateTime;
11
+import org.json.JSONArray;
12
+import org.json.JSONException;
13
+import org.json.JSONObject;
14
+
15
+import java.util.HashMap;
8
 import java.util.List;
16
 import java.util.List;
9
 
17
 
10
 /**
18
 /**
13
 
21
 
14
 public class SchedulesDataAccess {
22
 public class SchedulesDataAccess {
15
 
23
 
16
-//    public static LuPromise<List> getMultiple(LuDataAccessConfigDbo config, List<FavouriteStopDbo> favouriteStopDbos)
17
-//    {
18
-//        return LuRequest.post(config, )
19
-//    }
24
+    public static LuPromise<List<SchedulesDbo>> getMultiple(LuDataAccessConfigDbo config, List<FavouriteStopDbo> favouriteStopDbos, LocalDateTime date, int count)
25
+    {
26
+        HashMap<String, String> map = new HashMap<>();
27
+        map.put("count", Integer.toString(count));
28
+        map.put("date", JSONObject.quote(date.toString("y-M-d HH:mm:ss")));
29
+
30
+        JSONArray stops = new JSONArray();
31
+        for (FavouriteStopDbo dbo : favouriteStopDbos) {
32
+            for (RoutesDbo routesDbo : dbo.getRoutes()) {
33
+                JSONObject obj = new JSONObject();
34
+                try {
35
+                    obj.put("stopId", dbo.getStop().getId());
36
+                    obj.put("routeId", routesDbo.getId());
37
+                } catch (JSONException e) {
38
+                    e.printStackTrace();
39
+                }
40
+                stops.put(obj);
41
+            }
42
+        }
43
+        map.put("stops", stops.toString());
44
+
45
+        return LuRequest.post(config, SchedulesDbo.SchedulesDboArray.class, "schedules/multiple", map).map(new LuPromise.LuConverter<SchedulesDbo.SchedulesDboArray, List<SchedulesDbo>>() {
46
+            @Override
47
+            public List<SchedulesDbo> convert(SchedulesDbo.SchedulesDboArray data) {
48
+                return data.getData();
49
+            }
50
+        });
51
+    }
20
 }
52
 }

+ 42
- 2
app/src/main/java/com/rthoni/stssaguenay/dbo/SchedulesDbo.java View File

1
 package com.rthoni.stssaguenay.dbo;
1
 package com.rthoni.stssaguenay.dbo;
2
 
2
 
3
 import com.luticate.utils.dbo.LuDbo;
3
 import com.luticate.utils.dbo.LuDbo;
4
+import com.luticate.utils.dbo.LuPaginatedDbo;
4
 
5
 
6
+import org.joda.time.LocalDateTime;
5
 import org.joda.time.LocalTime;
7
 import org.joda.time.LocalTime;
8
+import org.joda.time.format.DateTimeFormat;
9
+import org.joda.time.format.DateTimeFormatter;
10
+import org.json.JSONArray;
6
 import org.json.JSONException;
11
 import org.json.JSONException;
7
 import org.json.JSONObject;
12
 import org.json.JSONObject;
8
 
13
 
9
 import java.util.HashMap;
14
 import java.util.HashMap;
10
 import java.util.List;
15
 import java.util.List;
16
+import java.util.Vector;
11
 
17
 
12
 /**
18
 /**
13
  * Created by robin on 10/1/16.
19
  * Created by robin on 10/1/16.
15
 
21
 
16
 public class SchedulesDbo extends LuDbo {
22
 public class SchedulesDbo extends LuDbo {
17
 
23
 
24
+    public static class SchedulesDboArray extends LuPaginatedDbo<SchedulesDbo>
25
+    {
26
+    }
27
+
18
     protected String _stopId;
28
     protected String _stopId;
19
 
29
 
20
     protected String _routeId;
30
     protected String _routeId;
21
 
31
 
22
-    protected List<LocalTime> _schedules;
32
+    protected List<LocalDateTime> _schedules;
23
 
33
 
24
     @Override
34
     @Override
25
     public void fromJson(JSONObject json) throws JSONException {
35
     public void fromJson(JSONObject json) throws JSONException {
26
-
36
+        _stopId = json.getString("stopId");
37
+        _routeId = json.getString("routeId");
38
+        _schedules = new Vector<>();
39
+        JSONArray schedules = json.getJSONArray("schedules");
40
+        for (int i = 0; i < schedules.length(); ++i) {
41
+            _schedules.add(LocalDateTime.parse(schedules.getString(i), DateTimeFormat.forPattern("y-M-d H:m:s")));
42
+        }
27
     }
43
     }
28
 
44
 
29
     @Override
45
     @Override
30
     public HashMap<String, Object> toArray() {
46
     public HashMap<String, Object> toArray() {
31
         return null;
47
         return null;
32
     }
48
     }
49
+
50
+    public String getStopId() {
51
+        return _stopId;
52
+    }
53
+
54
+    public void setStopId(String stopId) {
55
+        _stopId = stopId;
56
+    }
57
+
58
+    public String getRouteId() {
59
+        return _routeId;
60
+    }
61
+
62
+    public void setRouteId(String routeId) {
63
+        _routeId = routeId;
64
+    }
65
+
66
+    public List<LocalDateTime> getSchedules() {
67
+        return _schedules;
68
+    }
69
+
70
+    public void setSchedules(List<LocalDateTime> schedules) {
71
+        _schedules = schedules;
72
+    }
33
 }
73
 }

+ 96
- 7
app/src/main/java/com/rthoni/stssaguenay/ui/fragments/HomeFragment.java View File

4
 import android.os.Bundle;
4
 import android.os.Bundle;
5
 import android.support.annotation.Nullable;
5
 import android.support.annotation.Nullable;
6
 import android.support.v4.app.Fragment;
6
 import android.support.v4.app.Fragment;
7
+import android.support.v4.widget.SwipeRefreshLayout;
7
 import android.support.v7.app.AlertDialog;
8
 import android.support.v7.app.AlertDialog;
8
 import android.support.v7.widget.LinearLayoutManager;
9
 import android.support.v7.widget.LinearLayoutManager;
9
 import android.support.v7.widget.RecyclerView;
10
 import android.support.v7.widget.RecyclerView;
13
 import android.widget.TextView;
14
 import android.widget.TextView;
14
 import android.widget.Toast;
15
 import android.widget.Toast;
15
 
16
 
17
+import com.luticate.utils.business.LuPromise;
16
 import com.rthoni.stssaguenay.R;
18
 import com.rthoni.stssaguenay.R;
17
 import com.rthoni.stssaguenay.business.STSBusiness;
19
 import com.rthoni.stssaguenay.business.STSBusiness;
20
+import com.rthoni.stssaguenay.business.SchedulesBusiness;
18
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
21
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
19
-
22
+import com.rthoni.stssaguenay.dbo.SchedulesDbo;
23
+
24
+import org.joda.time.DateTime;
25
+import org.joda.time.DateTimeZone;
26
+import org.joda.time.LocalDateTime;
27
+import org.joda.time.format.DateTimeFormat;
28
+import org.joda.time.format.DateTimeFormatter;
29
+
30
+import java.util.Collection;
31
+import java.util.Collections;
32
+import java.util.Comparator;
33
+import java.util.Date;
20
 import java.util.List;
34
 import java.util.List;
35
+import java.util.TimeZone;
21
 import java.util.Vector;
36
 import java.util.Vector;
22
 
37
 
23
 import butterknife.BindView;
38
 import butterknife.BindView;
31
     @BindView(R.id.listFavouritesStops)
46
     @BindView(R.id.listFavouritesStops)
32
     RecyclerView _favouritesStopsList;
47
     RecyclerView _favouritesStopsList;
33
 
48
 
49
+    @BindView(R.id.swipeContainer)
50
+    SwipeRefreshLayout _swipeRefreshLayout;
51
+
34
     FavouriteStopsAdapter _adapter;
52
     FavouriteStopsAdapter _adapter;
35
 
53
 
36
     public static class ViewHolder extends RecyclerView.ViewHolder {
54
     public static class ViewHolder extends RecyclerView.ViewHolder {
37
         public View _parentView;
55
         public View _parentView;
38
         public TextView _textView;
56
         public TextView _textView;
57
+        public TextView _textView2;
39
         public ViewHolder(View v) {
58
         public ViewHolder(View v) {
40
             super(v);
59
             super(v);
41
             _parentView = v;
60
             _parentView = v;
46
 
65
 
47
         private List<FavouriteStopDbo> _favourites;
66
         private List<FavouriteStopDbo> _favourites;
48
 
67
 
68
+        private List<SchedulesDbo> _schedules;
69
+
49
         @Override
70
         @Override
50
         public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
71
         public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
51
             View v = LayoutInflater.from(parent.getContext())
72
             View v = LayoutInflater.from(parent.getContext())
52
                     .inflate(R.layout.favourite_stop_recycler_view_item, parent, false);
73
                     .inflate(R.layout.favourite_stop_recycler_view_item, parent, false);
53
             ViewHolder vh = new ViewHolder(v);
74
             ViewHolder vh = new ViewHolder(v);
54
             vh._textView = (TextView) v.findViewById(R.id.textView);
75
             vh._textView = (TextView) v.findViewById(R.id.textView);
76
+            vh._textView2 = (TextView) v.findViewById(R.id.textView2);
55
             return vh;
77
             return vh;
56
         }
78
         }
57
 
79
 
72
                     return true;
94
                     return true;
73
                 }
95
                 }
74
             });
96
             });
97
+
98
+            if (_schedules != null) {
99
+                List<LocalDateTime> schedules = new Vector<>();
100
+                for (SchedulesDbo schedule : _schedules) {
101
+                    if (schedule.getStopId().equals(favouriteStopDbo.getStop().getId())) {
102
+                        schedules.addAll(schedule.getSchedules());
103
+                    }
104
+                }
105
+
106
+                Collections.sort(schedules);
107
+                schedules.size();
108
+
109
+                StringBuilder text = new StringBuilder();
110
+
111
+                for (int i = 0; i < Math.min(5, schedules.size()); ++i) {
112
+                    if (i > 0) {
113
+                        text.append(", ");
114
+                    }
115
+                    text.append(schedules.get(i).toString("HH:mm"));
116
+                }
117
+
118
+                holder._textView2.setText(text.toString());
119
+            }
120
+            else {
121
+                holder._textView2.setText(R.string.loading_schedules);
122
+            }
75
         }
123
         }
76
 
124
 
77
         @Override
125
         @Override
81
 
129
 
82
         public void setFavourites(List<FavouriteStopDbo> favourites) {
130
         public void setFavourites(List<FavouriteStopDbo> favourites) {
83
             _favourites = favourites;
131
             _favourites = favourites;
132
+            _schedules = null;
133
+            notifyDataSetChanged();
134
+        }
135
+
136
+        public List<FavouriteStopDbo> getFavourites() {
137
+            return _favourites;
138
+        }
139
+
140
+        public List<SchedulesDbo> getSchedules() {
141
+            return _schedules;
142
+        }
143
+
144
+        public void setSchedules(List<SchedulesDbo> schedules) {
145
+            _schedules = schedules;
84
             notifyDataSetChanged();
146
             notifyDataSetChanged();
85
         }
147
         }
86
     }
148
     }
95
         _favouritesStopsList.setAdapter(_adapter);
157
         _favouritesStopsList.setAdapter(_adapter);
96
         _favouritesStopsList.setLayoutManager(new LinearLayoutManager(getContext()));
158
         _favouritesStopsList.setLayoutManager(new LinearLayoutManager(getContext()));
97
 
159
 
160
+        _swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
161
+            @Override
162
+            public void onRefresh() {
163
+                loadSchedules();
164
+            }
165
+        });
166
+
98
         loadFavourites();
167
         loadFavourites();
99
 
168
 
100
         return v;
169
         return v;
104
     {
173
     {
105
         List<FavouriteStopDbo> favourites = STSBusiness.getFavouriteStops(getContext());
174
         List<FavouriteStopDbo> favourites = STSBusiness.getFavouriteStops(getContext());
106
         _adapter.setFavourites(favourites);
175
         _adapter.setFavourites(favourites);
176
+        loadSchedules();
107
     }
177
     }
108
 
178
 
109
     public void onFavouriteClicked(FavouriteStopDbo favouriteStopDbo)
179
     public void onFavouriteClicked(FavouriteStopDbo favouriteStopDbo)
121
                     @Override
191
                     @Override
122
                     public void onClick(DialogInterface dialog, int which) {
192
                     public void onClick(DialogInterface dialog, int which) {
123
 
193
 
124
-                        List<FavouriteStopDbo> favouriteStopDbos = STSBusiness.getFavouriteStops(getContext());
125
-                        for (int i = 0; i < favouriteStopDbos.size(); ++i) {
126
-                            if (favouriteStopDbos.get(i).getStop().getId().equals(favouriteStopDbo.getStop().getId())) {
127
-                                favouriteStopDbos.remove(i--);
128
-                            }
129
-                        }
194
+                        List<FavouriteStopDbo> favouriteStopDbos = _adapter.getFavourites();
195
+                        favouriteStopDbos.remove(favouriteStopDbo);
130
                         STSBusiness.setFavouriteStops(getContext(), favouriteStopDbos);
196
                         STSBusiness.setFavouriteStops(getContext(), favouriteStopDbos);
131
 
197
 
132
                         Toast.makeText(getContext(), getString(R.string.favourite_removed, favouriteStopDbo.getStop().getFullName()), Toast.LENGTH_LONG).show();
198
                         Toast.makeText(getContext(), getString(R.string.favourite_removed, favouriteStopDbo.getStop().getFullName()), Toast.LENGTH_LONG).show();
137
                 .setNegativeButton(android.R.string.no, null)
203
                 .setNegativeButton(android.R.string.no, null)
138
                 .show();
204
                 .show();
139
     }
205
     }
206
+
207
+    public void loadSchedules()
208
+    {
209
+        _swipeRefreshLayout.setRefreshing(true);
210
+        _adapter.setSchedules(null);
211
+        DateTimeZone dtz = DateTimeZone.forOffsetMillis(TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings());
212
+        LocalDateTime date = LocalDateTime.now(dtz).plusMinutes(-30);
213
+
214
+        SchedulesBusiness.getMultiple(STSBusiness.getConfig(), _adapter.getFavourites(), date, 10)
215
+                .then(new LuPromise.LuConsumer<List<SchedulesDbo>>() {
216
+                    @Override
217
+                    public void execute(List<SchedulesDbo> data) {
218
+                        _adapter.setSchedules(data);
219
+                        _swipeRefreshLayout.setRefreshing(false);
220
+                    }
221
+                }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
222
+                    @Override
223
+                    public void execute(LuPromise.LuPromiseError data) {
224
+                        _swipeRefreshLayout.setRefreshing(false);
225
+                        //TODO
226
+                    }
227
+                });
228
+    }
140
 }
229
 }

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

172
     {
172
     {
173
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
173
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
174
         progressDialog.setIndeterminate(true);
174
         progressDialog.setIndeterminate(true);
175
+        progressDialog.setCancelable(false);
175
         progressDialog.show();
176
         progressDialog.show();
176
         progressDialog.setTitle(R.string.loading);
177
         progressDialog.setTitle(R.string.loading);
177
         progressDialog.setMessage(getString(R.string.loading_stops));
178
         progressDialog.setMessage(getString(R.string.loading_stops));

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

151
     {
151
     {
152
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
152
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
153
         progressDialog.setIndeterminate(true);
153
         progressDialog.setIndeterminate(true);
154
+        progressDialog.setCancelable(false);
154
         progressDialog.show();
155
         progressDialog.show();
155
         progressDialog.setTitle(R.string.loading);
156
         progressDialog.setTitle(R.string.loading);
156
         progressDialog.setMessage(getString(R.string.loading_routes));
157
         progressDialog.setMessage(getString(R.string.loading_routes));

+ 13
- 5
app/src/main/res/layout/fragment_home.xml View File

15
         android:layout_alignParentRight="true"
15
         android:layout_alignParentRight="true"
16
         android:layout_alignParentEnd="true"/>
16
         android:layout_alignParentEnd="true"/>
17
 
17
 
18
-    <android.support.v7.widget.RecyclerView
19
-        android:layout_width="wrap_content"
20
-        android:layout_height="wrap_content"
21
-        android:id="@+id/listFavouritesStops"
18
+    <android.support.v4.widget.SwipeRefreshLayout
19
+        xmlns:android="http://schemas.android.com/apk/res/android"
20
+        android:id="@+id/swipeContainer"
21
+        android:layout_width="match_parent"
22
+        android:layout_height="match_parent"
22
         android:layout_below="@+id/textView"
23
         android:layout_below="@+id/textView"
23
         android:layout_alignParentLeft="true"
24
         android:layout_alignParentLeft="true"
24
         android:layout_alignParentStart="true"
25
         android:layout_alignParentStart="true"
25
         android:layout_alignParentRight="true"
26
         android:layout_alignParentRight="true"
26
         android:layout_alignParentEnd="true"
27
         android:layout_alignParentEnd="true"
27
-        android:layout_alignParentBottom="true"/>
28
+        android:layout_alignParentBottom="true">
29
+
30
+        <android.support.v7.widget.RecyclerView
31
+            android:layout_width="wrap_content"
32
+            android:layout_height="wrap_content"
33
+            android:id="@+id/listFavouritesStops"/>
34
+
35
+    </android.support.v4.widget.SwipeRefreshLayout>
28
 </RelativeLayout>
36
 </RelativeLayout>

Loading…
Cancel
Save