Browse Source

save, load and display favourites

tags/v1.0.0
Robin Thoni 7 years ago
parent
commit
8f3f16dbcb

+ 38
- 0
app/src/main/java/com/rthoni/stssaguenay/business/STSBusiness.java View File

@@ -1,6 +1,17 @@
1 1
 package com.rthoni.stssaguenay.business;
2 2
 
3
+import android.content.Context;
4
+
3 5
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
6
+import com.rthoni.stssaguenay.dataaccess.STSDataAccess;
7
+import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
8
+
9
+import org.json.JSONArray;
10
+import org.json.JSONException;
11
+import org.json.JSONObject;
12
+
13
+import java.util.List;
14
+import java.util.Vector;
4 15
 
5 16
 /**
6 17
  * Created by robin on 9/29/16.
@@ -17,4 +28,31 @@ public class STSBusiness {
17 28
         }
18 29
         return _config;
19 30
     }
31
+
32
+    public static List<FavouriteStopDbo> getFavouriteStops(Context ctx)
33
+    {
34
+        String str = STSDataAccess.getFavouriteStopsJson(ctx);
35
+        List<FavouriteStopDbo> dbos = new Vector<>();
36
+        JSONArray json;
37
+        try {
38
+            json = new JSONArray(str);
39
+            for (int i = 0; i < json.length(); ++i) {
40
+                FavouriteStopDbo dbo = new FavouriteStopDbo();
41
+                dbo.fromJson(json.getJSONObject(i));
42
+                dbos.add(dbo);
43
+            }
44
+        } catch (JSONException e) {
45
+            e.printStackTrace();
46
+        }
47
+        return dbos;
48
+    }
49
+
50
+    public static void setFavouriteStops(Context ctx, List<FavouriteStopDbo> favourites)
51
+    {
52
+        JSONArray json = new JSONArray();
53
+        for (FavouriteStopDbo favouriteStopDbo : favourites) {
54
+            json.put(new JSONObject(favouriteStopDbo.toArray()));
55
+        }
56
+        STSDataAccess.setFavouriteStopsJson(ctx, json.toString());
57
+    }
20 58
 }

+ 30
- 0
app/src/main/java/com/rthoni/stssaguenay/dataaccess/STSDataAccess.java View File

@@ -0,0 +1,30 @@
1
+package com.rthoni.stssaguenay.dataaccess;
2
+
3
+import android.content.Context;
4
+import android.content.SharedPreferences;
5
+
6
+/**
7
+ * Created by robin on 10/1/16.
8
+ */
9
+
10
+public class STSDataAccess {
11
+
12
+    public static String SHARED_PREF_NAME = "sts-saguenay";
13
+
14
+    public static String SHARED_PREF_FAVOURITE_STOPS = "favourites-stops";
15
+
16
+    public static SharedPreferences getSharedPref(Context ctx)
17
+    {
18
+        return ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
19
+    }
20
+
21
+    public static String getFavouriteStopsJson(Context ctx)
22
+    {
23
+        return getSharedPref(ctx).getString(SHARED_PREF_FAVOURITE_STOPS, "[]");
24
+    }
25
+
26
+    public static void setFavouriteStopsJson(Context ctx, String str)
27
+    {
28
+        getSharedPref(ctx).edit().putString(SHARED_PREF_FAVOURITE_STOPS, str).apply();
29
+    }
30
+}

+ 63
- 0
app/src/main/java/com/rthoni/stssaguenay/dbo/FavouriteStopDbo.java View File

@@ -0,0 +1,63 @@
1
+package com.rthoni.stssaguenay.dbo;
2
+
3
+import com.luticate.utils.dbo.LuDbo;
4
+
5
+import org.json.JSONArray;
6
+import org.json.JSONException;
7
+import org.json.JSONObject;
8
+
9
+import java.util.HashMap;
10
+import java.util.List;
11
+import java.util.Vector;
12
+
13
+/**
14
+ * Created by robin on 10/1/16.
15
+ */
16
+
17
+public class FavouriteStopDbo extends LuDbo {
18
+
19
+    protected StopsDbo _stop;
20
+
21
+    protected List<RoutesDbo> _routes;
22
+
23
+    @Override
24
+    public void fromJson(JSONObject json) throws JSONException {
25
+        _stop = new StopsDbo();
26
+        _stop.fromJson(json.getJSONObject("stop"));
27
+        _routes = new Vector<>();
28
+        JSONArray routes = json.getJSONArray("routes");
29
+        for (int i = 0; i < routes.length(); ++i) {
30
+            RoutesDbo route = new RoutesDbo();
31
+            route.fromJson(routes.getJSONObject(i));
32
+            _routes.add(route);
33
+        }
34
+    }
35
+
36
+    @Override
37
+    public HashMap<String, Object> toArray() {
38
+        HashMap<String, Object> map = new HashMap<>();
39
+        map.put("stop", _stop.toArray());
40
+        List<Object> routes = new Vector<>();
41
+        for (RoutesDbo route : _routes) {
42
+            routes.add(route.toArray());
43
+        }
44
+        map.put("routes", routes);
45
+        return map;
46
+    }
47
+
48
+    public StopsDbo getStop() {
49
+        return _stop;
50
+    }
51
+
52
+    public void setStop(StopsDbo stop) {
53
+        _stop = stop;
54
+    }
55
+
56
+    public List<RoutesDbo> getRoutes() {
57
+        return _routes;
58
+    }
59
+
60
+    public void setRoutes(List<RoutesDbo> routes) {
61
+        _routes = routes;
62
+    }
63
+}

+ 6
- 1
app/src/main/java/com/rthoni/stssaguenay/dbo/RoutesDbo.java View File

@@ -36,7 +36,12 @@ public class RoutesDbo extends LuDbo {
36 36
 
37 37
     @Override
38 38
     public HashMap<String, Object> toArray() {
39
-        return null;
39
+        HashMap<String, Object> map = new HashMap<>();
40
+        map.put("id", _id);
41
+        map.put("name", _name);
42
+        map.put("bgColor", _bgColor);
43
+        map.put("fgColor", _fgColor);
44
+        return map;
40 45
     }
41 46
 
42 47
     public String getId() {

+ 7
- 1
app/src/main/java/com/rthoni/stssaguenay/dbo/StopsDbo.java View File

@@ -37,7 +37,13 @@ public class StopsDbo extends LuDbo {
37 37
 
38 38
     @Override
39 39
     public HashMap<String, Object> toArray() {
40
-        return null;
40
+        HashMap<String, Object> map = new HashMap<>();
41
+        map.put("name", _name);
42
+        map.put("routes", _routes);
43
+        map.put("id", _id);
44
+        map.put("posX", _posX);
45
+        map.put("posY", _posY);
46
+        return map;
41 47
     }
42 48
 
43 49
     protected String _name;

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

@@ -9,13 +9,24 @@ import android.view.View;
9 9
 
10 10
 import com.luticate.utils.business.LuRequest;
11 11
 import com.rthoni.stssaguenay.R;
12
+import com.rthoni.stssaguenay.business.STSBusiness;
13
+import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
12 14
 import com.rthoni.stssaguenay.ui.fragments.HomeFragment;
13 15
 
16
+import org.json.JSONException;
17
+import org.json.JSONObject;
18
+
19
+import java.util.List;
20
+
14 21
 import butterknife.BindView;
15 22
 import butterknife.ButterKnife;
16 23
 
17 24
 public class MainActivity extends AppCompatActivity {
18 25
 
26
+    public static int ADD_FAVOURITE_STOP_REQUEST_CODE = 1;
27
+
28
+    private boolean _goToHome = false;
29
+
19 30
     @BindView(R.id.fab)
20 31
     FloatingActionButton _fab;
21 32
 
@@ -36,10 +47,19 @@ public class MainActivity extends AppCompatActivity {
36 47
                 goToAddStop();
37 48
             }
38 49
         });
39
-//        _fab.hide();
50
+
40 51
         goToHome();
41 52
     }
42 53
 
54
+    @Override
55
+    protected void onResume() {
56
+        if (_goToHome) {
57
+            _goToHome = false;
58
+            goToHome();
59
+        }
60
+        super.onResume();
61
+    }
62
+
43 63
     public void goToHome()
44 64
     {
45 65
         _fab.show();
@@ -56,10 +76,29 @@ public class MainActivity extends AppCompatActivity {
56 76
     public void goToAddStop()
57 77
     {
58 78
         Intent intent = new Intent(this, StopPickerActivity.class);
59
-        startActivity(intent);
79
+        startActivityForResult(intent, ADD_FAVOURITE_STOP_REQUEST_CODE);
60 80
     }
61 81
 
62
-//    @Override
82
+    @Override
83
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
84
+        if (requestCode == ADD_FAVOURITE_STOP_REQUEST_CODE && resultCode == RESULT_OK) {
85
+            FavouriteStopDbo favouriteStopDbo = new FavouriteStopDbo();
86
+            try {
87
+                JSONObject obj = new JSONObject(data.getStringExtra(StopPickerActivity.STOP_EXTRA_NAME));
88
+                favouriteStopDbo.fromJson(obj);
89
+            } catch (JSONException e) {
90
+                e.printStackTrace();
91
+                return;
92
+            }
93
+            List<FavouriteStopDbo> favouriteStopDbos = STSBusiness.getFavouriteStops(this);
94
+            favouriteStopDbos.add(favouriteStopDbo);
95
+            STSBusiness.setFavouriteStops(this, favouriteStopDbos);
96
+            _goToHome = true;
97
+        }
98
+        super.onActivityResult(requestCode, resultCode, data);
99
+    }
100
+
101
+    //    @Override
63 102
 //    public boolean onCreateOptionsMenu(Menu menu) {
64 103
 //        // Inflate the menu; this adds items to the action bar if it is present.
65 104
 //        getMenuInflater().inflate(R.menu.menu_main, menu);

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

@@ -1,16 +1,24 @@
1 1
 package com.rthoni.stssaguenay.ui.activities;
2 2
 
3
+import android.app.Activity;
4
+import android.content.Intent;
3 5
 import android.os.Bundle;
4 6
 import android.support.v7.app.AppCompatActivity;
5 7
 
6 8
 import com.luticate.utils.business.LuPromise;
7 9
 import com.rthoni.stssaguenay.R;
10
+import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
11
+import com.rthoni.stssaguenay.dbo.RoutesDbo;
8 12
 import com.rthoni.stssaguenay.dbo.StopsDbo;
9 13
 import com.rthoni.stssaguenay.ui.fragments.StopPickerFragment;
10 14
 import com.rthoni.stssaguenay.ui.fragments.StopRoutesPickerFragment;
11 15
 
16
+import java.util.List;
17
+
12 18
 public class StopPickerActivity extends AppCompatActivity {
13 19
 
20
+    public static String STOP_EXTRA_NAME = "STOP_EXTRA";
21
+
14 22
     private StopPickerFragment _stopPickerFragment;
15 23
 
16 24
     @Override
@@ -47,14 +55,28 @@ public class StopPickerActivity extends AppCompatActivity {
47 55
                 .commit();
48 56
     }
49 57
 
50
-    public void goToRoutes(StopsDbo stopDbo)
58
+    public void goToRoutes(final StopsDbo stopDbo)
51 59
     {
52 60
         StopRoutesPickerFragment f = new StopRoutesPickerFragment();
53 61
         f.setStopsDbo(stopDbo);
62
+        f.setOnRoutesSelected(new LuPromise.LuConsumer<FavouriteStopDbo>() {
63
+            @Override
64
+            public void execute(FavouriteStopDbo data) {
65
+                saveStop(data);
66
+            }
67
+        });
54 68
         getSupportFragmentManager()
55 69
                 .beginTransaction()
56 70
                 .replace(R.id.container, f)
57 71
                 .addToBackStack("StopRoutesPickerFragment")
58 72
                 .commit();
59 73
     }
74
+
75
+    public void saveStop(FavouriteStopDbo favouriteStopDbo)
76
+    {
77
+        Intent result = new Intent();
78
+        result.putExtra(STOP_EXTRA_NAME, favouriteStopDbo.toString());
79
+        setResult(Activity.RESULT_OK, result);
80
+        finish();
81
+    }
60 82
 }

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

@@ -3,12 +3,18 @@ package com.rthoni.stssaguenay.ui.fragments;
3 3
 import android.os.Bundle;
4 4
 import android.support.annotation.Nullable;
5 5
 import android.support.v4.app.Fragment;
6
+import android.support.v7.widget.LinearLayoutManager;
6 7
 import android.support.v7.widget.RecyclerView;
7 8
 import android.view.LayoutInflater;
8 9
 import android.view.View;
9 10
 import android.view.ViewGroup;
11
+import android.widget.TextView;
10 12
 
11 13
 import com.rthoni.stssaguenay.R;
14
+import com.rthoni.stssaguenay.business.STSBusiness;
15
+import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
16
+
17
+import java.util.List;
12 18
 
13 19
 import butterknife.BindView;
14 20
 import butterknife.ButterKnife;
@@ -19,13 +25,78 @@ import butterknife.ButterKnife;
19 25
 public class HomeFragment extends Fragment {
20 26
 
21 27
     @BindView(R.id.listFavouritesStops)
22
-    RecyclerView _favouritesStops;
28
+    RecyclerView _favouritesStopsList;
29
+
30
+    FavouriteStopsAdapter _adapter;
31
+
32
+    public static class ViewHolder extends RecyclerView.ViewHolder {
33
+        public View _parentView;
34
+        public TextView _textView;
35
+        public ViewHolder(View v) {
36
+            super(v);
37
+            _parentView = v;
38
+        }
39
+    }
40
+
41
+    public class FavouriteStopsAdapter extends RecyclerView.Adapter<ViewHolder> {
42
+
43
+        private List<FavouriteStopDbo> _favourites;
44
+
45
+        @Override
46
+        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
47
+            View v = LayoutInflater.from(parent.getContext())
48
+                    .inflate(R.layout.favourite_stop_recycler_view_item, parent, false);
49
+            ViewHolder vh = new ViewHolder(v);
50
+            vh._textView = (TextView) v.findViewById(R.id.textView);
51
+            return vh;
52
+        }
53
+
54
+        @Override
55
+        public void onBindViewHolder(ViewHolder holder, int position) {
56
+            final FavouriteStopDbo favouriteStopDbo = _favourites.get(position);
57
+            holder._textView.setText(favouriteStopDbo.getStop().getFullName());
58
+            holder._parentView.setOnClickListener(new View.OnClickListener() {
59
+                @Override
60
+                public void onClick(View v) {
61
+                    onFavouriteClicked(favouriteStopDbo);
62
+                }
63
+            });
64
+        }
65
+
66
+        @Override
67
+        public int getItemCount() {
68
+            return _favourites == null ? 0 : _favourites.size();
69
+        }
70
+
71
+        public void setFavourites(List<FavouriteStopDbo> favourites) {
72
+            _favourites = favourites;
73
+            notifyDataSetChanged();
74
+        }
75
+    }
23 76
 
24 77
     @Nullable
25 78
     @Override
26 79
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
27 80
         View v = inflater.inflate(R.layout.fragment_home, container, false);
28 81
         ButterKnife.bind(this, v);
82
+
83
+        _adapter = new FavouriteStopsAdapter();
84
+        _favouritesStopsList.setAdapter(_adapter);
85
+        _favouritesStopsList.setLayoutManager(new LinearLayoutManager(getContext()));
86
+
87
+        loadFavourites();
88
+
29 89
         return v;
30 90
     }
91
+
92
+    public void loadFavourites()
93
+    {
94
+        List<FavouriteStopDbo> favourites = STSBusiness.getFavouriteStops(getContext());
95
+        _adapter.setFavourites(favourites);
96
+    }
97
+
98
+    public void onFavouriteClicked(FavouriteStopDbo favouriteStopDbo)
99
+    {
100
+
101
+    }
31 102
 }

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

@@ -173,6 +173,8 @@ public class StopPickerFragment extends Fragment {
173 173
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
174 174
         progressDialog.setIndeterminate(true);
175 175
         progressDialog.show();
176
+        progressDialog.setTitle(R.string.loading);
177
+        progressDialog.setMessage(getString(R.string.loading_stops));
176 178
 
177 179
         StopsBusiness.getAll(STSBusiness.getConfig())
178 180
                 .then(new LuPromise.LuConsumer<List<StopsDbo>>() {

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

@@ -10,6 +10,7 @@ import android.support.v7.widget.RecyclerView;
10 10
 import android.view.LayoutInflater;
11 11
 import android.view.View;
12 12
 import android.view.ViewGroup;
13
+import android.widget.Button;
13 14
 import android.widget.ImageView;
14 15
 import android.widget.TextView;
15 16
 import android.widget.Toast;
@@ -19,6 +20,7 @@ import com.luticate.utils.business.LuPromise;
19 20
 import com.rthoni.stssaguenay.R;
20 21
 import com.rthoni.stssaguenay.business.RoutesBusiness;
21 22
 import com.rthoni.stssaguenay.business.STSBusiness;
23
+import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
22 24
 import com.rthoni.stssaguenay.dbo.RoutesDbo;
23 25
 import com.rthoni.stssaguenay.dbo.StopsDbo;
24 26
 
@@ -39,10 +41,15 @@ public class StopRoutesPickerFragment extends Fragment {
39 41
     @BindView(R.id.listRoutes)
40 42
     RecyclerView _listRoutes;
41 43
 
44
+    @BindView(R.id.btnSave)
45
+    Button _btnSave;
46
+
42 47
     private StopsDbo _stopsDbo;
43 48
 
44 49
     private RoutesAdapter _routesAdapter;
45 50
 
51
+    private LuPromise.LuConsumer<FavouriteStopDbo> _onRoutesSelected;
52
+
46 53
     public static class ViewHolder extends RecyclerView.ViewHolder {
47 54
         public ImageView _imageView;
48 55
         public TextView _textView;
@@ -57,6 +64,8 @@ public class StopRoutesPickerFragment extends Fragment {
57 64
 
58 65
         private List<RoutesDbo> _routes;
59 66
 
67
+        private List<RoutesDbo> _selectRoutes;
68
+
60 69
         @Override
61 70
         public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
62 71
             View v = LayoutInflater.from(parent.getContext())
@@ -80,7 +89,15 @@ public class StopRoutesPickerFragment extends Fragment {
80 89
             holder._view.setOnClickListener(new View.OnClickListener() {
81 90
                 @Override
82 91
                 public void onClick(View v) {
83
-                    v.setSelected(!v.isSelected());
92
+                    if (_selectRoutes.contains(routeDbo)) {
93
+                        _selectRoutes.remove(routeDbo);
94
+                        v.setSelected(false);
95
+                    }
96
+                    else {
97
+                        _selectRoutes.add(routeDbo);
98
+                        v.setSelected(true);
99
+                    }
100
+                    _btnSave.setEnabled(_selectRoutes.size() != 0);
84 101
                 }
85 102
             });
86 103
         }
@@ -92,8 +109,13 @@ public class StopRoutesPickerFragment extends Fragment {
92 109
 
93 110
         public void setRoutes(List<RoutesDbo> routes) {
94 111
             _routes = routes;
112
+            _selectRoutes = new Vector<>();
95 113
             notifyDataSetChanged();
96 114
         }
115
+
116
+        public List<RoutesDbo> getSelectRoutes() {
117
+            return _selectRoutes;
118
+        }
97 119
     }
98 120
 
99 121
     @Nullable
@@ -109,15 +131,18 @@ public class StopRoutesPickerFragment extends Fragment {
109 131
         _listRoutes.setLayoutManager(new LinearLayoutManager(getContext()));
110 132
         _listRoutes.setHasFixedSize(true);
111 133
 
134
+        _btnSave.setOnClickListener(new View.OnClickListener() {
135
+            @Override
136
+            public void onClick(View v) {
137
+                save();
138
+            }
139
+        });
140
+
112 141
         loadRoutes();
113 142
 
114 143
         return v;
115 144
     }
116 145
 
117
-    public StopsDbo getStopsDbo() {
118
-        return _stopsDbo;
119
-    }
120
-
121 146
     public void setStopsDbo(StopsDbo stopsDbo) {
122 147
         _stopsDbo = stopsDbo;
123 148
     }
@@ -127,6 +152,8 @@ public class StopRoutesPickerFragment extends Fragment {
127 152
         final ProgressDialog progressDialog = new ProgressDialog(getContext());
128 153
         progressDialog.setIndeterminate(true);
129 154
         progressDialog.show();
155
+        progressDialog.setTitle(R.string.loading);
156
+        progressDialog.setMessage(getString(R.string.loading_routes));
130 157
 
131 158
         RoutesBusiness.getAll(STSBusiness.getConfig())
132 159
                 .then(new LuPromise.LuConsumer<List<RoutesDbo>>() {
@@ -145,4 +172,18 @@ public class StopRoutesPickerFragment extends Fragment {
145 172
                     }
146 173
                 });
147 174
     }
175
+
176
+    public void save()
177
+    {
178
+        if (_onRoutesSelected != null) {
179
+            FavouriteStopDbo favourite = new FavouriteStopDbo();
180
+            favourite.setStop(_stopsDbo);
181
+            favourite.setRoutes(_routesAdapter.getSelectRoutes());
182
+            _onRoutesSelected.execute(favourite);
183
+        }
184
+    }
185
+
186
+    public void setOnRoutesSelected(LuPromise.LuConsumer<FavouriteStopDbo> onRoutesSelected) {
187
+        _onRoutesSelected = onRoutesSelected;
188
+    }
148 189
 }

+ 33
- 0
app/src/main/res/layout/favourite_stop_recycler_view_item.xml View File

@@ -0,0 +1,33 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
+              xmlns:tools="http://schemas.android.com/tools"
4
+              android:orientation="vertical"
5
+              android:layout_width="match_parent"
6
+              android:layout_height="wrap_content"
7
+              android:clickable="true"
8
+              android:foreground="?android:attr/selectableItemBackground"
9
+              android:minHeight="?android:attr/listPreferredItemHeightSmall"
10
+              android:weightSum="1">
11
+
12
+    <TextView
13
+        android:layout_width="match_parent"
14
+        android:layout_height="wrap_content"
15
+        android:textAppearance="?android:attr/textAppearanceListItemSmall"
16
+        android:id="@+id/textView"
17
+        android:clickable="false"
18
+        android:focusable="false"
19
+        tools:text="Stop name"
20
+        android:gravity="center_vertical"
21
+        android:layout_weight="1.0"/>
22
+
23
+    <TextView
24
+        android:layout_width="match_parent"
25
+        android:layout_height="wrap_content"
26
+        android:id="@+id/textView2"
27
+        android:clickable="false"
28
+        android:focusable="false"
29
+        tools:text="09h42 10h12"
30
+        android:gravity="center_vertical"
31
+        android:text="@string/loading_schedules"
32
+        android:layout_weight="1.0"/>
33
+</LinearLayout>

+ 27
- 14
app/src/main/res/layout/fragment_stop_route_picker.xml View File

@@ -3,29 +3,42 @@
3 3
                 android:layout_width="match_parent"
4 4
                 android:layout_height="match_parent">
5 5
 
6
-    <TextView
7
-        android:layout_width="wrap_content"
8
-        android:layout_height="wrap_content"
9
-        android:textAppearance="?android:attr/textAppearanceMedium"
10
-        android:text="@string/pick_routes"
11
-        android:id="@+id/textView"
6
+    <LinearLayout
7
+        android:orientation="vertical"
8
+        android:layout_width="match_parent"
9
+        android:layout_height="match_parent"
12 10
         android:layout_alignParentTop="true"
13 11
         android:layout_alignParentLeft="true"
14 12
         android:layout_alignParentStart="true"
15
-        android:layout_alignParentRight="true"
16
-        android:layout_alignParentEnd="true"/>
13
+        android:layout_above="@+id/btnSave">
14
+
15
+        <TextView
16
+            android:layout_width="match_parent"
17
+            android:layout_height="wrap_content"
18
+            android:textAppearance="?android:attr/textAppearanceMedium"
19
+            android:text="@string/pick_routes"
20
+            android:id="@+id/textView"/>
21
+
22
+        <android.support.v7.widget.RecyclerView
23
+            android:layout_width="match_parent"
24
+            android:layout_height="match_parent"
25
+            android:id="@+id/listRoutes"
26
+            android:scrollbars="vertical"
27
+            android:fadeScrollbars="true"/>
28
+
29
+    </LinearLayout>
30
+
17 31
 
18
-    <android.support.v7.widget.RecyclerView
32
+    <Button
33
+        android:text="@string/save"
19 34
         android:layout_width="wrap_content"
20 35
         android:layout_height="wrap_content"
21
-        android:id="@+id/listRoutes"
22
-        android:scrollbars="vertical"
23
-        android:fadeScrollbars="true"
24
-        android:layout_below="@id/textView"
36
+        android:id="@+id/btnSave"
37
+        android:layout_alignParentBottom="true"
25 38
         android:layout_alignParentLeft="true"
26 39
         android:layout_alignParentStart="true"
27 40
         android:layout_alignParentRight="true"
28 41
         android:layout_alignParentEnd="true"
29
-        android:layout_alignParentBottom="true"/>
42
+        android:enabled="false"/>
30 43
 
31 44
 </RelativeLayout>

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

@@ -4,4 +4,9 @@
4 4
     <string name="favourites_stops">Favourites stops:</string>
5 5
     <string name="search_stop">Search a stop</string>
6 6
     <string name="pick_routes">Pick your routes for stop %1$s:</string>
7
+    <string name="save">Save</string>
8
+    <string name="loading">Loading&#8230;</string>
9
+    <string name="loading_schedules">Loading schedules&#8230;</string>
10
+    <string name="loading_routes">Loading schedules&#8230;</string>
11
+    <string name="loading_stops">Loading stops&#8230;</string>
7 12
 </resources>

Loading…
Cancel
Save