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,7 +2,11 @@ package com.rthoni.stssaguenay.business;
2 2
 
3 3
 import com.luticate.utils.business.LuPromise;
4 4
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
5
+import com.rthoni.stssaguenay.dataaccess.SchedulesDataAccess;
5 6
 import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
7
+import com.rthoni.stssaguenay.dbo.SchedulesDbo;
8
+
9
+import org.joda.time.LocalDateTime;
6 10
 
7 11
 import java.util.List;
8 12
 
@@ -12,8 +16,8 @@ import java.util.List;
12 16
 
13 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,7 +4,15 @@ import com.luticate.utils.business.LuPromise;
4 4
 import com.luticate.utils.business.LuRequest;
5 5
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
6 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 16
 import java.util.List;
9 17
 
10 18
 /**
@@ -13,8 +21,32 @@ import java.util.List;
13 21
 
14 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,13 +1,19 @@
1 1
 package com.rthoni.stssaguenay.dbo;
2 2
 
3 3
 import com.luticate.utils.dbo.LuDbo;
4
+import com.luticate.utils.dbo.LuPaginatedDbo;
4 5
 
6
+import org.joda.time.LocalDateTime;
5 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 11
 import org.json.JSONException;
7 12
 import org.json.JSONObject;
8 13
 
9 14
 import java.util.HashMap;
10 15
 import java.util.List;
16
+import java.util.Vector;
11 17
 
12 18
 /**
13 19
  * Created by robin on 10/1/16.
@@ -15,19 +21,53 @@ import java.util.List;
15 21
 
16 22
 public class SchedulesDbo extends LuDbo {
17 23
 
24
+    public static class SchedulesDboArray extends LuPaginatedDbo<SchedulesDbo>
25
+    {
26
+    }
27
+
18 28
     protected String _stopId;
19 29
 
20 30
     protected String _routeId;
21 31
 
22
-    protected List<LocalTime> _schedules;
32
+    protected List<LocalDateTime> _schedules;
23 33
 
24 34
     @Override
25 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 45
     @Override
30 46
     public HashMap<String, Object> toArray() {
31 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,6 +4,7 @@ import android.content.DialogInterface;
4 4
 import android.os.Bundle;
5 5
 import android.support.annotation.Nullable;
6 6
 import android.support.v4.app.Fragment;
7
+import android.support.v4.widget.SwipeRefreshLayout;
7 8
 import android.support.v7.app.AlertDialog;
8 9
 import android.support.v7.widget.LinearLayoutManager;
9 10
 import android.support.v7.widget.RecyclerView;
@@ -13,11 +14,25 @@ import android.view.ViewGroup;
13 14
 import android.widget.TextView;
14 15
 import android.widget.Toast;
15 16
 
17
+import com.luticate.utils.business.LuPromise;
16 18
 import com.rthoni.stssaguenay.R;
17 19
 import com.rthoni.stssaguenay.business.STSBusiness;
20
+import com.rthoni.stssaguenay.business.SchedulesBusiness;
18 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 34
 import java.util.List;
35
+import java.util.TimeZone;
21 36
 import java.util.Vector;
22 37
 
23 38
 import butterknife.BindView;
@@ -31,11 +46,15 @@ public class HomeFragment extends Fragment {
31 46
     @BindView(R.id.listFavouritesStops)
32 47
     RecyclerView _favouritesStopsList;
33 48
 
49
+    @BindView(R.id.swipeContainer)
50
+    SwipeRefreshLayout _swipeRefreshLayout;
51
+
34 52
     FavouriteStopsAdapter _adapter;
35 53
 
36 54
     public static class ViewHolder extends RecyclerView.ViewHolder {
37 55
         public View _parentView;
38 56
         public TextView _textView;
57
+        public TextView _textView2;
39 58
         public ViewHolder(View v) {
40 59
             super(v);
41 60
             _parentView = v;
@@ -46,12 +65,15 @@ public class HomeFragment extends Fragment {
46 65
 
47 66
         private List<FavouriteStopDbo> _favourites;
48 67
 
68
+        private List<SchedulesDbo> _schedules;
69
+
49 70
         @Override
50 71
         public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
51 72
             View v = LayoutInflater.from(parent.getContext())
52 73
                     .inflate(R.layout.favourite_stop_recycler_view_item, parent, false);
53 74
             ViewHolder vh = new ViewHolder(v);
54 75
             vh._textView = (TextView) v.findViewById(R.id.textView);
76
+            vh._textView2 = (TextView) v.findViewById(R.id.textView2);
55 77
             return vh;
56 78
         }
57 79
 
@@ -72,6 +94,32 @@ public class HomeFragment extends Fragment {
72 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 125
         @Override
@@ -81,6 +129,20 @@ public class HomeFragment extends Fragment {
81 129
 
82 130
         public void setFavourites(List<FavouriteStopDbo> favourites) {
83 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 146
             notifyDataSetChanged();
85 147
         }
86 148
     }
@@ -95,6 +157,13 @@ public class HomeFragment extends Fragment {
95 157
         _favouritesStopsList.setAdapter(_adapter);
96 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 167
         loadFavourites();
99 168
 
100 169
         return v;
@@ -104,6 +173,7 @@ public class HomeFragment extends Fragment {
104 173
     {
105 174
         List<FavouriteStopDbo> favourites = STSBusiness.getFavouriteStops(getContext());
106 175
         _adapter.setFavourites(favourites);
176
+        loadSchedules();
107 177
     }
108 178
 
109 179
     public void onFavouriteClicked(FavouriteStopDbo favouriteStopDbo)
@@ -121,12 +191,8 @@ public class HomeFragment extends Fragment {
121 191
                     @Override
122 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 196
                         STSBusiness.setFavouriteStops(getContext(), favouriteStopDbos);
131 197
 
132 198
                         Toast.makeText(getContext(), getString(R.string.favourite_removed, favouriteStopDbo.getStop().getFullName()), Toast.LENGTH_LONG).show();
@@ -137,4 +203,27 @@ public class HomeFragment extends Fragment {
137 203
                 .setNegativeButton(android.R.string.no, null)
138 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,6 +172,7 @@ public class StopPickerFragment extends Fragment {
172 172
     {
173 173
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
174 174
         progressDialog.setIndeterminate(true);
175
+        progressDialog.setCancelable(false);
175 176
         progressDialog.show();
176 177
         progressDialog.setTitle(R.string.loading);
177 178
         progressDialog.setMessage(getString(R.string.loading_stops));

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

@@ -151,6 +151,7 @@ public class StopRoutesPickerFragment extends Fragment {
151 151
     {
152 152
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
153 153
         progressDialog.setIndeterminate(true);
154
+        progressDialog.setCancelable(false);
154 155
         progressDialog.show();
155 156
         progressDialog.setTitle(R.string.loading);
156 157
         progressDialog.setMessage(getString(R.string.loading_routes));

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

@@ -15,14 +15,22 @@
15 15
         android:layout_alignParentRight="true"
16 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 23
         android:layout_below="@+id/textView"
23 24
         android:layout_alignParentLeft="true"
24 25
         android:layout_alignParentStart="true"
25 26
         android:layout_alignParentRight="true"
26 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 36
 </RelativeLayout>

Loading…
Cancel
Save