Browse Source

settings backup/restore

tags/v1.0.0
Robin Thoni 7 years ago
parent
commit
55712cb490

+ 1
- 0
app/build.gradle View File

@@ -33,6 +33,7 @@ dependencies {
33 33
     compile 'net.danlew:android.joda:2.9.4.2'
34 34
     compile 'com.google.firebase:firebase-ads:9.6.1'
35 35
     compile 'com.facebook.android:facebook-android-sdk:4.5.0'
36
+    compile 'com.github.simbiose:Encryption:1.4.0'
36 37
 }
37 38
 
38 39
 apply plugin: 'com.google.gms.google-services'

+ 19
- 6
app/src/main/java/com/rthoni/stssaguenay/business/STSBusiness.java View File

@@ -4,8 +4,9 @@ import android.content.Context;
4 4
 
5 5
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
6 6
 import com.rthoni.stssaguenay.dataaccess.STSDataAccess;
7
-import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
7
+import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
8 8
 import com.rthoni.stssaguenay.dbo.UserDbo;
9
+import com.rthoni.stssaguenay.dbo.UsersSettingsDbo;
9 10
 
10 11
 import org.json.JSONArray;
11 12
 import org.json.JSONException;
@@ -30,15 +31,15 @@ public class STSBusiness {
30 31
         return _config;
31 32
     }
32 33
 
33
-    public static List<FavouriteStopDbo> getFavouriteStops(Context ctx)
34
+    public static List<UserFavouriteStopsDbo> getFavouriteStops(Context ctx)
34 35
     {
35 36
         String str = STSDataAccess.getFavouriteStopsJson(ctx);
36
-        List<FavouriteStopDbo> dbos = new Vector<>();
37
+        List<UserFavouriteStopsDbo> dbos = new Vector<>();
37 38
         JSONArray json;
38 39
         try {
39 40
             json = new JSONArray(str);
40 41
             for (int i = 0; i < json.length(); ++i) {
41
-                FavouriteStopDbo dbo = new FavouriteStopDbo();
42
+                UserFavouriteStopsDbo dbo = new UserFavouriteStopsDbo();
42 43
                 dbo.fromJson(json.getJSONObject(i));
43 44
                 dbos.add(dbo);
44 45
             }
@@ -48,10 +49,10 @@ public class STSBusiness {
48 49
         return dbos;
49 50
     }
50 51
 
51
-    public static void setFavouriteStops(Context ctx, List<FavouriteStopDbo> favourites)
52
+    public static void setFavouriteStops(Context ctx, List<UserFavouriteStopsDbo> favourites)
52 53
     {
53 54
         JSONArray json = new JSONArray();
54
-        for (FavouriteStopDbo favouriteStopDbo : favourites) {
55
+        for (UserFavouriteStopsDbo favouriteStopDbo : favourites) {
55 56
             json.put(new JSONObject(favouriteStopDbo.toArray()));
56 57
         }
57 58
         STSDataAccess.setFavouriteStopsJson(ctx, json.toString());
@@ -81,4 +82,16 @@ public class STSBusiness {
81 82
             STSDataAccess.setLoggedUserJson(ctx, user.toString());
82 83
         }
83 84
     }
85
+
86
+    public static UsersSettingsDbo getUserSettings(Context ctx)
87
+    {
88
+        UsersSettingsDbo settingsDbo = new UsersSettingsDbo();
89
+        settingsDbo.setFavouriteStops(getFavouriteStops(ctx));
90
+        return settingsDbo;
91
+    }
92
+
93
+    public static void setUserSettings(Context ctx, UsersSettingsDbo settingsDbo)
94
+    {
95
+        setFavouriteStops(ctx, settingsDbo.getFavouriteStops());
96
+    }
84 97
 }

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

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

+ 49
- 0
app/src/main/java/com/rthoni/stssaguenay/business/UsersSettingsBusiness.java View File

@@ -0,0 +1,49 @@
1
+package com.rthoni.stssaguenay.business;
2
+
3
+import com.luticate.utils.business.LuPromise;
4
+import com.luticate.utils.dbo.LuDataAccessConfigDbo;
5
+import com.luticate.utils.dbo.LuVoidDbo;
6
+import com.rthoni.stssaguenay.dataaccess.UsersSettingsDataAccess;
7
+import com.rthoni.stssaguenay.dbo.UsersSettingsDbo;
8
+
9
+import org.json.JSONException;
10
+import org.json.JSONObject;
11
+
12
+/**
13
+ * Created by robin on 10/3/16.
14
+ */
15
+
16
+public class UsersSettingsBusiness {
17
+
18
+    public static String encryptSettings(UsersSettingsDbo settingsDbo, String password)
19
+    {
20
+        return UsersSettingsDataAccess.encryptSettings(settingsDbo.toString(), password);
21
+    }
22
+
23
+    public static UsersSettingsDbo decryptSettings(String data, String password)
24
+    {
25
+        data = UsersSettingsDataAccess.decryptSettings(data, password);
26
+        if (data == null) {
27
+            return null;
28
+        }
29
+
30
+        UsersSettingsDbo settings = new UsersSettingsDbo();
31
+        try {
32
+            settings.fromJson(new JSONObject(data));
33
+        } catch (JSONException e) {
34
+            e.printStackTrace();
35
+            return null;
36
+        }
37
+        return settings;
38
+    }
39
+
40
+    public static LuPromise<String> get(LuDataAccessConfigDbo config, String id)
41
+    {
42
+        return UsersSettingsDataAccess.get(config, id);
43
+    }
44
+
45
+    public static LuPromise<LuVoidDbo> put(LuDataAccessConfigDbo config, String data, String id)
46
+    {
47
+        return UsersSettingsDataAccess.put(config, data, id);
48
+    }
49
+}

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

@@ -3,7 +3,7 @@ package com.rthoni.stssaguenay.dataaccess;
3 3
 import com.luticate.utils.business.LuPromise;
4 4
 import com.luticate.utils.business.LuRequest;
5 5
 import com.luticate.utils.dbo.LuDataAccessConfigDbo;
6
-import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
6
+import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
7 7
 import com.rthoni.stssaguenay.dbo.RoutesDbo;
8 8
 import com.rthoni.stssaguenay.dbo.SchedulesDbo;
9 9
 
@@ -21,14 +21,14 @@ import java.util.List;
21 21
 
22 22
 public class SchedulesDataAccess {
23 23
 
24
-    public static LuPromise<List<SchedulesDbo>> getMultiple(LuDataAccessConfigDbo config, List<FavouriteStopDbo> favouriteStopDbos, LocalDateTime date, int count)
24
+    public static LuPromise<List<SchedulesDbo>> getMultiple(LuDataAccessConfigDbo config, List<UserFavouriteStopsDbo> favouriteStopDbos, LocalDateTime date, int count)
25 25
     {
26 26
         HashMap<String, String> map = new HashMap<>();
27 27
         map.put("count", Integer.toString(count));
28 28
         map.put("date", JSONObject.quote(date.toString("y-M-d HH:mm:ss")));
29 29
 
30 30
         JSONArray stops = new JSONArray();
31
-        for (FavouriteStopDbo dbo : favouriteStopDbos) {
31
+        for (UserFavouriteStopsDbo dbo : favouriteStopDbos) {
32 32
             for (RoutesDbo routesDbo : dbo.getRoutes()) {
33 33
                 JSONObject obj = new JSONObject();
34 34
                 try {

+ 63
- 0
app/src/main/java/com/rthoni/stssaguenay/dataaccess/UsersSettingsDataAccess.java View File

@@ -0,0 +1,63 @@
1
+package com.rthoni.stssaguenay.dataaccess;
2
+
3
+import com.luticate.utils.business.LuPromise;
4
+import com.luticate.utils.business.LuRequest;
5
+import com.luticate.utils.dbo.LuBoolDbo;
6
+import com.luticate.utils.dbo.LuDataAccessConfigDbo;
7
+import com.luticate.utils.dbo.LuStringDbo;
8
+import com.luticate.utils.dbo.LuVoidDbo;
9
+
10
+import org.json.JSONObject;
11
+
12
+import java.util.HashMap;
13
+
14
+import se.simbio.encryption.Encryption;
15
+
16
+/**
17
+ * Created by robin on 10/3/16.
18
+ */
19
+
20
+public class UsersSettingsDataAccess {
21
+
22
+    public static Encryption getEncryption(String password)
23
+    {
24
+        return Encryption.getLowIteration(password, "9oCpOJ", "mCX36TazPeC70LfN".getBytes());
25
+    }
26
+
27
+    public static String encryptSettings(String settings, String password)
28
+    {
29
+        return getEncryption(password).encryptOrNull(settings);
30
+    }
31
+
32
+    public static String decryptSettings(String data, String password)
33
+    {
34
+        return getEncryption(password).decryptOrNull(data);
35
+    }
36
+
37
+    public static LuPromise<String> get(LuDataAccessConfigDbo config, String id)
38
+    {
39
+        HashMap<String, String> map = new HashMap<>();
40
+        map.put("id", JSONObject.quote(id));
41
+        return LuRequest.get(config, LuStringDbo.class, "users/settings", map)
42
+                .map(new LuPromise.LuConverter<LuStringDbo, String>() {
43
+                    @Override
44
+                    public String convert(LuStringDbo data) {
45
+                        return data.getString();
46
+                    }
47
+                });
48
+    }
49
+
50
+    public static LuPromise<LuVoidDbo> put(LuDataAccessConfigDbo config, String data, String id)
51
+    {
52
+        HashMap<String, String> map = new HashMap<>();
53
+        map.put("id", JSONObject.quote(id));
54
+        map.put("settings", JSONObject.quote(data));
55
+        return LuRequest.post(config, LuBoolDbo.class, "users/settings", map)
56
+                .map(new LuPromise.LuConverter<LuBoolDbo, LuVoidDbo>() {
57
+                    @Override
58
+                    public LuVoidDbo convert(LuBoolDbo data) {
59
+                        return new LuVoidDbo();
60
+                    }
61
+                });
62
+    }
63
+}

app/src/main/java/com/rthoni/stssaguenay/dbo/FavouriteStopDbo.java → app/src/main/java/com/rthoni/stssaguenay/dbo/UserFavouriteStopsDbo.java View File

@@ -14,12 +14,14 @@ import java.util.Vector;
14 14
  * Created by robin on 10/1/16.
15 15
  */
16 16
 
17
-public class FavouriteStopDbo extends LuDbo {
17
+public class UserFavouriteStopsDbo extends LuDbo {
18 18
 
19 19
     protected StopsDbo _stop;
20 20
 
21 21
     protected List<RoutesDbo> _routes;
22 22
 
23
+    protected String _name;
24
+
23 25
     @Override
24 26
     public void fromJson(JSONObject json) throws JSONException {
25 27
         _stop = new StopsDbo();
@@ -31,6 +33,7 @@ public class FavouriteStopDbo extends LuDbo {
31 33
             route.fromJson(routes.getJSONObject(i));
32 34
             _routes.add(route);
33 35
         }
36
+        _name = json.getString("name");
34 37
     }
35 38
 
36 39
     @Override
@@ -42,6 +45,7 @@ public class FavouriteStopDbo extends LuDbo {
42 45
             routes.add(route.toArray());
43 46
         }
44 47
         map.put("routes", routes);
48
+        map.put("name", _name);
45 49
         return map;
46 50
     }
47 51
 
@@ -60,4 +64,20 @@ public class FavouriteStopDbo extends LuDbo {
60 64
     public void setRoutes(List<RoutesDbo> routes) {
61 65
         _routes = routes;
62 66
     }
67
+
68
+    public String getName() {
69
+        return _name;
70
+    }
71
+
72
+    public void setName(String name) {
73
+        _name = name;
74
+    }
75
+
76
+    public String getCustomName()
77
+    {
78
+        if (_name != null && !_name.isEmpty()) {
79
+            return _name;
80
+        }
81
+        return _stop.getName();
82
+    }
63 83
 }

+ 49
- 0
app/src/main/java/com/rthoni/stssaguenay/dbo/UsersSettingsDbo.java View File

@@ -0,0 +1,49 @@
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/3/16.
15
+ */
16
+
17
+public class UsersSettingsDbo extends LuDbo {
18
+    protected List<UserFavouriteStopsDbo> _favouriteStops;
19
+
20
+    @Override
21
+    public void fromJson(JSONObject json) throws JSONException {
22
+        _favouriteStops = new Vector<>();
23
+        JSONArray stops = json.getJSONArray("favouriteStops");
24
+        for (int i = 0; i < stops.length(); ++i) {
25
+            UserFavouriteStopsDbo stop = new UserFavouriteStopsDbo();
26
+            stop.fromJson(stops.getJSONObject(i));
27
+            _favouriteStops.add(stop);
28
+        }
29
+    }
30
+
31
+    @Override
32
+    public HashMap<String, Object> toArray() {
33
+        HashMap<String, Object> map = new HashMap<>();
34
+        List<HashMap<String, Object>> stops = new Vector<>();
35
+        for (UserFavouriteStopsDbo stop : _favouriteStops) {
36
+            stops.add(stop.toArray());
37
+        }
38
+        map.put("favouriteStops", stops);
39
+        return map;
40
+    }
41
+
42
+    public List<UserFavouriteStopsDbo> getFavouriteStops() {
43
+        return _favouriteStops;
44
+    }
45
+
46
+    public void setFavouriteStops(List<UserFavouriteStopsDbo> favouriteStops) {
47
+        _favouriteStops = favouriteStops;
48
+    }
49
+}

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

@@ -1,16 +1,21 @@
1 1
 package com.rthoni.stssaguenay.ui.activities;
2 2
 
3
+import android.app.ProgressDialog;
4
+import android.content.DialogInterface;
3 5
 import android.content.Intent;
4 6
 import android.os.Bundle;
5 7
 import android.support.design.widget.FloatingActionButton;
6 8
 import android.support.design.widget.NavigationView;
7 9
 import android.support.v4.widget.DrawerLayout;
8 10
 import android.support.v7.app.ActionBarDrawerToggle;
11
+import android.support.v7.app.AlertDialog;
9 12
 import android.support.v7.app.AppCompatActivity;
10 13
 import android.support.v7.widget.Toolbar;
14
+import android.text.InputType;
11 15
 import android.view.Menu;
12 16
 import android.view.MenuItem;
13 17
 import android.view.View;
18
+import android.widget.EditText;
14 19
 import android.widget.TextView;
15 20
 import android.widget.Toast;
16 21
 
@@ -26,11 +31,15 @@ import com.facebook.login.widget.LoginButton;
26 31
 import com.google.android.gms.ads.AdRequest;
27 32
 import com.google.android.gms.ads.AdView;
28 33
 import com.google.android.gms.ads.MobileAds;
34
+import com.luticate.utils.business.LuPromise;
29 35
 import com.luticate.utils.business.LuRequest;
36
+import com.luticate.utils.dbo.LuVoidDbo;
30 37
 import com.rthoni.stssaguenay.R;
31 38
 import com.rthoni.stssaguenay.business.STSBusiness;
32
-import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
39
+import com.rthoni.stssaguenay.business.UsersSettingsBusiness;
40
+import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
33 41
 import com.rthoni.stssaguenay.dbo.UserDbo;
42
+import com.rthoni.stssaguenay.dbo.UsersSettingsDbo;
34 43
 import com.rthoni.stssaguenay.ui.fragments.HomeFragment;
35 44
 
36 45
 import org.json.JSONException;
@@ -175,7 +184,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
175 184
     @Override
176 185
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
177 186
         if (requestCode == ADD_FAVOURITE_STOP_REQUEST_CODE && resultCode == RESULT_OK) {
178
-            FavouriteStopDbo favouriteStopDbo = new FavouriteStopDbo();
187
+            UserFavouriteStopsDbo favouriteStopDbo = new UserFavouriteStopsDbo();
179 188
             try {
180 189
                 JSONObject obj = new JSONObject(data.getStringExtra(StopPickerActivity.STOP_EXTRA_NAME));
181 190
                 favouriteStopDbo.fromJson(obj);
@@ -183,7 +192,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
183 192
                 e.printStackTrace();
184 193
                 return;
185 194
             }
186
-            List<FavouriteStopDbo> favouriteStopDbos = STSBusiness.getFavouriteStops(this);
195
+            List<UserFavouriteStopsDbo> favouriteStopDbos = STSBusiness.getFavouriteStops(this);
187 196
             favouriteStopDbos.add(favouriteStopDbo);
188 197
             STSBusiness.setFavouriteStops(this, favouriteStopDbos);
189 198
             _goToHome = true;
@@ -196,12 +205,21 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
196 205
 
197 206
     @Override
198 207
     public boolean onNavigationItemSelected(MenuItem item) {
199
-        if (item.getItemId() == R.id.nav_logout) {
208
+        if (item.getItemId() == R.id.nav_restore) {
209
+            restoreSettings();
210
+        }
211
+        else if (item.getItemId() == R.id.nav_backup) {
212
+            backupSettings();
213
+        }
214
+        else if (item.getItemId() == R.id.nav_logout) {
200 215
             LoginManager.getInstance().logOut();
201 216
             STSBusiness.setLoggedUser(this, null);
202 217
             updateLoginState();
203 218
         }
204
-        return false;
219
+        else {
220
+            return false;
221
+        }
222
+        return true;
205 223
     }
206 224
 
207 225
     public void updateLoginState()
@@ -224,4 +242,108 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
224 242
         STSBusiness.setLoggedUser(this, userDbo);
225 243
         updateLoginState();
226 244
     }
245
+
246
+    public LuPromise<String> askPassword(boolean encrypt)
247
+    {
248
+        final LuPromise<String> promise = new LuPromise<>();
249
+
250
+        AlertDialog.Builder builder = new AlertDialog.Builder(this);
251
+        builder.setTitle(R.string.encryption_password);
252
+        builder.setMessage(encrypt ? R.string.encryption_password_encrypt : R.string.encryption_password_decrypt);
253
+
254
+        final EditText input = new EditText(this);
255
+        input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
256
+        builder.setView(input);
257
+
258
+        builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
259
+            @Override
260
+            public void onClick(DialogInterface dialog, int which) {
261
+                promise.resolve(input.getText().toString());
262
+            }
263
+        });
264
+        builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
265
+            @Override
266
+            public void onClick(DialogInterface dialog, int which) {
267
+                dialog.cancel();
268
+            }
269
+        });
270
+
271
+        builder.show();
272
+        return promise;
273
+    }
274
+
275
+    public void restoreSettings()
276
+    {
277
+        final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
278
+        progressDialog.setIndeterminate(true);
279
+        progressDialog.setCancelable(false);
280
+        progressDialog.show();
281
+        progressDialog.setTitle(R.string.loading);
282
+        progressDialog.setMessage(getString(R.string.settings_restoring));
283
+
284
+        UserDbo user = STSBusiness.getLoggedUser(MainActivity.this);
285
+        UsersSettingsBusiness.get(STSBusiness.getConfig(), user.getId())
286
+                .then(new LuPromise.LuConsumer<String>() {
287
+                    @Override
288
+                    public void execute(final String data) {
289
+                        progressDialog.dismiss();
290
+                        if (data == null) {
291
+                            Toast.makeText(MainActivity.this, R.string.encryption_empty, Toast.LENGTH_LONG).show();
292
+                            return;
293
+                        }
294
+                        askPassword(false).then(new LuPromise.LuConsumer<String>() {
295
+                            @Override
296
+                            public void execute(String password) {
297
+                                UsersSettingsDbo settingsDbo = UsersSettingsBusiness.decryptSettings(data, password);
298
+                                if (settingsDbo == null) {
299
+                                    Toast.makeText(MainActivity.this, R.string.encryption_bad_password, Toast.LENGTH_LONG).show();
300
+                                }
301
+                                else {
302
+                                    Toast.makeText(MainActivity.this, R.string.settings_restored, Toast.LENGTH_LONG).show();
303
+                                    STSBusiness.setUserSettings(MainActivity.this, settingsDbo);
304
+                                    goToHome();
305
+                                }
306
+                            }
307
+                        });
308
+                    }
309
+                }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
310
+                    @Override
311
+                    public void execute(LuPromise.LuPromiseError data) {
312
+                        progressDialog.dismiss();
313
+                        Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
314
+                    }
315
+                });
316
+    }
317
+
318
+    public void backupSettings()
319
+    {
320
+        askPassword(true).then(new LuPromise.LuConsumer<String>() {
321
+            @Override
322
+            public void execute(String password) {
323
+                UserDbo user = STSBusiness.getLoggedUser(MainActivity.this);
324
+                UsersSettingsDbo settingsDbo = STSBusiness.getUserSettings(MainActivity.this);
325
+                String data = UsersSettingsBusiness.encryptSettings(settingsDbo, password);
326
+                final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
327
+                progressDialog.setIndeterminate(true);
328
+                progressDialog.setCancelable(false);
329
+                progressDialog.show();
330
+                progressDialog.setTitle(R.string.loading);
331
+                progressDialog.setMessage(getString(R.string.settings_backing_up));
332
+                UsersSettingsBusiness.put(STSBusiness.getConfig(), data, user.getId())
333
+                        .then(new LuPromise.LuConsumer<LuVoidDbo>() {
334
+                            @Override
335
+                            public void execute(LuVoidDbo data) {
336
+                                progressDialog.dismiss();
337
+                                Toast.makeText(MainActivity.this, R.string.settings_backed_up, Toast.LENGTH_LONG).show();
338
+                            }
339
+                        }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
340
+                            @Override
341
+                            public void execute(LuPromise.LuPromiseError data) {
342
+                                progressDialog.dismiss();
343
+                                Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
344
+                            }
345
+                        });
346
+            }
347
+        });
348
+    }
227 349
 }

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

@@ -10,14 +10,11 @@ import com.google.android.gms.ads.AdView;
10 10
 import com.google.android.gms.ads.MobileAds;
11 11
 import com.luticate.utils.business.LuPromise;
12 12
 import com.rthoni.stssaguenay.R;
13
-import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
14
-import com.rthoni.stssaguenay.dbo.RoutesDbo;
13
+import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
15 14
 import com.rthoni.stssaguenay.dbo.StopsDbo;
16 15
 import com.rthoni.stssaguenay.ui.fragments.StopPickerFragment;
17 16
 import com.rthoni.stssaguenay.ui.fragments.StopRoutesPickerFragment;
18 17
 
19
-import java.util.List;
20
-
21 18
 public class StopPickerActivity extends AppCompatActivity {
22 19
 
23 20
     public static String STOP_EXTRA_NAME = "STOP_EXTRA";
@@ -68,9 +65,9 @@ public class StopPickerActivity extends AppCompatActivity {
68 65
     {
69 66
         StopRoutesPickerFragment f = new StopRoutesPickerFragment();
70 67
         f.setStopsDbo(stopDbo);
71
-        f.setOnRoutesSelected(new LuPromise.LuConsumer<FavouriteStopDbo>() {
68
+        f.setOnRoutesSelected(new LuPromise.LuConsumer<UserFavouriteStopsDbo>() {
72 69
             @Override
73
-            public void execute(FavouriteStopDbo data) {
70
+            public void execute(UserFavouriteStopsDbo data) {
74 71
                 saveStop(data);
75 72
             }
76 73
         });
@@ -81,7 +78,7 @@ public class StopPickerActivity extends AppCompatActivity {
81 78
                 .commit();
82 79
     }
83 80
 
84
-    public void saveStop(FavouriteStopDbo favouriteStopDbo)
81
+    public void saveStop(UserFavouriteStopsDbo favouriteStopDbo)
85 82
     {
86 83
         Intent result = new Intent();
87 84
         result.putExtra(STOP_EXTRA_NAME, favouriteStopDbo.toString());

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

@@ -18,19 +18,13 @@ import com.luticate.utils.business.LuPromise;
18 18
 import com.rthoni.stssaguenay.R;
19 19
 import com.rthoni.stssaguenay.business.STSBusiness;
20 20
 import com.rthoni.stssaguenay.business.SchedulesBusiness;
21
-import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
21
+import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
22 22
 import com.rthoni.stssaguenay.dbo.SchedulesDbo;
23 23
 
24
-import org.joda.time.DateTime;
25 24
 import org.joda.time.DateTimeZone;
26 25
 import org.joda.time.LocalDateTime;
27
-import org.joda.time.format.DateTimeFormat;
28
-import org.joda.time.format.DateTimeFormatter;
29 26
 
30
-import java.util.Collection;
31 27
 import java.util.Collections;
32
-import java.util.Comparator;
33
-import java.util.Date;
34 28
 import java.util.List;
35 29
 import java.util.TimeZone;
36 30
 import java.util.Vector;
@@ -63,7 +57,7 @@ public class HomeFragment extends Fragment {
63 57
 
64 58
     public class FavouriteStopsAdapter extends RecyclerView.Adapter<ViewHolder> {
65 59
 
66
-        private List<FavouriteStopDbo> _favourites;
60
+        private List<UserFavouriteStopsDbo> _favourites;
67 61
 
68 62
         private List<SchedulesDbo> _schedules;
69 63
 
@@ -79,7 +73,7 @@ public class HomeFragment extends Fragment {
79 73
 
80 74
         @Override
81 75
         public void onBindViewHolder(ViewHolder holder, int position) {
82
-            final FavouriteStopDbo favouriteStopDbo = _favourites.get(position);
76
+            final UserFavouriteStopsDbo favouriteStopDbo = _favourites.get(position);
83 77
             holder._textView.setText(favouriteStopDbo.getStop().getFullName());
84 78
             holder._parentView.setOnClickListener(new View.OnClickListener() {
85 79
                 @Override
@@ -127,13 +121,13 @@ public class HomeFragment extends Fragment {
127 121
             return _favourites == null ? 0 : _favourites.size();
128 122
         }
129 123
 
130
-        public void setFavourites(List<FavouriteStopDbo> favourites) {
124
+        public void setFavourites(List<UserFavouriteStopsDbo> favourites) {
131 125
             _favourites = favourites;
132 126
             _schedules = null;
133 127
             notifyDataSetChanged();
134 128
         }
135 129
 
136
-        public List<FavouriteStopDbo> getFavourites() {
130
+        public List<UserFavouriteStopsDbo> getFavourites() {
137 131
             return _favourites;
138 132
         }
139 133
 
@@ -171,16 +165,16 @@ public class HomeFragment extends Fragment {
171 165
 
172 166
     public void loadFavourites()
173 167
     {
174
-        List<FavouriteStopDbo> favourites = STSBusiness.getFavouriteStops(getContext());
168
+        List<UserFavouriteStopsDbo> favourites = STSBusiness.getFavouriteStops(getContext());
175 169
         _adapter.setFavourites(favourites);
176 170
         loadSchedules();
177 171
     }
178 172
 
179
-    public void onFavouriteClicked(FavouriteStopDbo favouriteStopDbo)
173
+    public void onFavouriteClicked(UserFavouriteStopsDbo favouriteStopDbo)
180 174
     {
181 175
     }
182 176
 
183
-    public void onFavouriteLongClicked(final FavouriteStopDbo favouriteStopDbo)
177
+    public void onFavouriteLongClicked(final UserFavouriteStopsDbo favouriteStopDbo)
184 178
     {
185 179
         new AlertDialog.Builder(getContext())
186 180
                 .setIcon(android.R.drawable.ic_dialog_alert)
@@ -191,7 +185,7 @@ public class HomeFragment extends Fragment {
191 185
                     @Override
192 186
                     public void onClick(DialogInterface dialog, int which) {
193 187
 
194
-                        List<FavouriteStopDbo> favouriteStopDbos = _adapter.getFavourites();
188
+                        List<UserFavouriteStopsDbo> favouriteStopDbos = _adapter.getFavourites();
195 189
                         favouriteStopDbos.remove(favouriteStopDbo);
196 190
                         STSBusiness.setFavouriteStops(getContext(), favouriteStopDbos);
197 191
 

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

@@ -20,7 +20,7 @@ import com.luticate.utils.business.LuPromise;
20 20
 import com.rthoni.stssaguenay.R;
21 21
 import com.rthoni.stssaguenay.business.RoutesBusiness;
22 22
 import com.rthoni.stssaguenay.business.STSBusiness;
23
-import com.rthoni.stssaguenay.dbo.FavouriteStopDbo;
23
+import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
24 24
 import com.rthoni.stssaguenay.dbo.RoutesDbo;
25 25
 import com.rthoni.stssaguenay.dbo.StopsDbo;
26 26
 
@@ -48,7 +48,7 @@ public class StopRoutesPickerFragment extends Fragment {
48 48
 
49 49
     private RoutesAdapter _routesAdapter;
50 50
 
51
-    private LuPromise.LuConsumer<FavouriteStopDbo> _onRoutesSelected;
51
+    private LuPromise.LuConsumer<UserFavouriteStopsDbo> _onRoutesSelected;
52 52
 
53 53
     public static class ViewHolder extends RecyclerView.ViewHolder {
54 54
         public ImageView _imageView;
@@ -177,14 +177,14 @@ public class StopRoutesPickerFragment extends Fragment {
177 177
     public void save()
178 178
     {
179 179
         if (_onRoutesSelected != null) {
180
-            FavouriteStopDbo favourite = new FavouriteStopDbo();
180
+            UserFavouriteStopsDbo favourite = new UserFavouriteStopsDbo();
181 181
             favourite.setStop(_stopsDbo);
182 182
             favourite.setRoutes(_routesAdapter.getSelectRoutes());
183 183
             _onRoutesSelected.execute(favourite);
184 184
         }
185 185
     }
186 186
 
187
-    public void setOnRoutesSelected(LuPromise.LuConsumer<FavouriteStopDbo> onRoutesSelected) {
187
+    public void setOnRoutesSelected(LuPromise.LuConsumer<UserFavouriteStopsDbo> onRoutesSelected) {
188 188
         _onRoutesSelected = onRoutesSelected;
189 189
     }
190 190
 }

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

@@ -7,21 +7,39 @@
7 7
 
8 8
     <string name="navigation_drawer_open">Open navigation drawer</string>
9 9
     <string name="navigation_drawer_close">Close navigation drawer</string>
10
+
10 11
     <string name="app_name">STS Saguenay</string>
12
+
11 13
     <string name="title_activity_stop_picker">Pick a stop - STS Saguenay</string>
12 14
     <string name="favourites_stops">Favourites stops:</string>
13 15
     <string name="search_stop">Search a stop</string>
14 16
     <string name="pick_routes">Pick your routes for stop %1$s:</string>
15 17
     <string name="save">Save</string>
18
+    <string name="error_try_again">Error. Please try again.</string>
19
+
16 20
     <string name="loading">Loading&#8230;</string>
17 21
     <string name="loading_schedules">Loading schedules&#8230;</string>
18 22
     <string name="loading_routes">Loading schedules&#8230;</string>
19 23
     <string name="loading_stops">Loading stops&#8230;</string>
24
+
20 25
     <string name="favourite_remove">Remove favourite</string>
21 26
     <string name="favourite_remove_confirm">Do you really want to remove %1$s?</string>
22 27
     <string name="favourite_removed">%1$s has been removed</string>
28
+
23 29
     <string name="drawer_help_message">Log in to access more features</string>
30
+
24 31
     <string name="logout">Logout</string>
25 32
     <string name="restore">Restore settings</string>
26 33
     <string name="backup">Backup settings</string>
34
+
35
+    <string name="encryption_password">Encryption password</string>
36
+    <string name="encryption_password_encrypt">Please enter an encryption password (you do not need to enter the same as a previous backup):</string>
37
+    <string name="encryption_password_decrypt">Please enter the password your entered when you did the backup:</string>
38
+    <string name="encryption_bad_password">Bad encryption password</string>
39
+    <string name="encryption_empty">No data to restore</string>
40
+
41
+    <string name="settings_backed_up">Settings have been backed up</string>
42
+    <string name="settings_backing_up">Backing up settings&#8230;</string>
43
+    <string name="settings_restoring">Restoring settings&#8230;</string>
44
+    <string name="settings_restored">Settings have been restored</string>
27 45
 </resources>

+ 3
- 0
build.gradle View File

@@ -21,6 +21,9 @@ buildscript {
21 21
 allprojects {
22 22
     repositories {
23 23
         jcenter()
24
+        maven {
25
+            url 'https://jitpack.io'
26
+        }
24 27
     }
25 28
 }
26 29
 

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

@@ -42,7 +42,7 @@ public class LuRequest {
42 42
                     try {
43 43
                         JSONObject json = new JSONObject(response);
44 44
                         JSONObject obj = null;
45
-                        if (!json.isNull("data")) {
45
+                        if (json.has("data")) {
46 46
                             obj = json.optJSONObject("data");
47 47
                             if (obj == null) {
48 48
                                 obj = new JSONObject();

+ 38
- 0
luticateutils/src/main/java/com/luticate/utils/dbo/LuStringDbo.java View File

@@ -0,0 +1,38 @@
1
+package com.luticate.utils.dbo;
2
+
3
+import org.json.JSONException;
4
+import org.json.JSONObject;
5
+
6
+import java.util.HashMap;
7
+
8
+/**
9
+ * Created by robin on 11/27/15.
10
+ */
11
+public class LuStringDbo extends LuDbo {
12
+    public String getString() {
13
+        return _value;
14
+    }
15
+
16
+    public void setString(String value) {
17
+        _value = value;
18
+    }
19
+
20
+    private String _value;
21
+
22
+    @Override
23
+    public void fromJson(JSONObject json) throws JSONException {
24
+        if (json.isNull("value")) {
25
+            _value = null;
26
+        }
27
+        else {
28
+            _value = json.getString("value");
29
+        }
30
+    }
31
+
32
+    @Override
33
+    public HashMap<String, Object> toArray() {
34
+        HashMap<String, Object> array = new HashMap<>();
35
+        array.put("value", _value);
36
+        return array;
37
+    }
38
+}

Loading…
Cancel
Save