From fac41e2adec6c580d1f81f69774f1865e867b80e Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 10:55:39 +0100 Subject: [PATCH 01/11] [ADD] route class fields and getters / setters --- .../java/com/a1/nextlocation/data/Route.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/src/main/java/com/a1/nextlocation/data/Route.java b/app/src/main/java/com/a1/nextlocation/data/Route.java index 213f3ba..2714dab 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Route.java +++ b/app/src/main/java/com/a1/nextlocation/data/Route.java @@ -1,4 +1,42 @@ package com.a1.nextlocation.data; +import java.util.List; + public class Route { + private String name; + private List locations; + private float totalDistance; + private int totalTime; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getLocations() { + return locations; + } + + public void setLocations(List locations) { + this.locations = locations; + } + + public float getTotalDistance() { + return totalDistance; + } + + public void setTotalDistance(float totalDistance) { + this.totalDistance = totalDistance; + } + + public int getTotalTime() { + return totalTime; + } + + public void setTotalTime(int totalTime) { + this.totalTime = totalTime; + } } From dec62e8b9ad0c1a18462b42ce0e66e9aebee19d2 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 10:56:49 +0100 Subject: [PATCH 02/11] [ADD] coupon class fields and getters / setters --- .../java/com/a1/nextlocation/data/Coupon.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/java/com/a1/nextlocation/data/Coupon.java b/app/src/main/java/com/a1/nextlocation/data/Coupon.java index b980ab3..5cfcece 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Coupon.java +++ b/app/src/main/java/com/a1/nextlocation/data/Coupon.java @@ -1,4 +1,23 @@ package com.a1.nextlocation.data; public class Coupon { + + private String code; + private String reward; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getReward() { + return reward; + } + + public void setReward(String reward) { + this.reward = reward; + } } From a2ffef10999cbd40cab4b882e418bb9fa356ce54 Mon Sep 17 00:00:00 2001 From: Bart Date: Mon, 14 Dec 2020 11:04:31 +0100 Subject: [PATCH 03/11] [ADD] data & location class fields and getters / setters --- .../java/com/a1/nextlocation/data/Data.java | 67 +++++++++++++++++++ .../com/a1/nextlocation/data/Location.java | 27 ++++++++ 2 files changed, 94 insertions(+) diff --git a/app/src/main/java/com/a1/nextlocation/data/Data.java b/app/src/main/java/com/a1/nextlocation/data/Data.java index 8e09c97..a16b52e 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Data.java +++ b/app/src/main/java/com/a1/nextlocation/data/Data.java @@ -1,4 +1,71 @@ package com.a1.nextlocation.data; +import java.util.List; + public class Data { + private float distanceTraveled; + private int locationsVisited; + private int totalTime; + private List couponList; + private Location nextLocation; + private Location lastLocation; + private Route currentRoute; + + + + public float getDistanceTraveled() { + return distanceTraveled; + } + + public void setDistanceTraveled(float distanceTraveled) { + this.distanceTraveled = distanceTraveled; + } + + public int getLocationsVisited() { + return locationsVisited; + } + + public void setLocationsVisited(int locationsVisited) { + this.locationsVisited = locationsVisited; + } + + public int getTotalTime() { + return totalTime; + } + + public void setTotalTime(int totalTime) { + this.totalTime = totalTime; + } + + public List getCouponList() { + return couponList; + } + + public void setCouponList(List couponList) { + this.couponList = couponList; + } + + public Location getNextLocation() { + return nextLocation; + } + + public void setNextLocation(Location nextLocation) { + this.nextLocation = nextLocation; + } + + public Location getLastLocation() { + return lastLocation; + } + + public void setLastLocation(Location lastLocation) { + this.lastLocation = lastLocation; + } + + public Route getCurrentRoute() { + return currentRoute; + } + + public void setCurrentRoute(Route currentRoute) { + this.currentRoute = currentRoute; + } } diff --git a/app/src/main/java/com/a1/nextlocation/data/Location.java b/app/src/main/java/com/a1/nextlocation/data/Location.java index 2375e04..c1a822f 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Location.java +++ b/app/src/main/java/com/a1/nextlocation/data/Location.java @@ -1,4 +1,31 @@ package com.a1.nextlocation.data; public class Location { + private String name; + private String coordinates; + private String description; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCoordinates() { + return coordinates; + } + + public void setCoordinates(String coordinates) { + this.coordinates = coordinates; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } } From 64c8b0591a56bac6b27bd30e302ffcd5c85ee607 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 11:16:40 +0100 Subject: [PATCH 04/11] [ADD] constructors --- .../java/com/a1/nextlocation/data/Coupon.java | 5 +++++ .../java/com/a1/nextlocation/data/FileIO.java | 8 ++++++++ .../java/com/a1/nextlocation/data/Route.java | 20 +++++++++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/a1/nextlocation/data/Coupon.java b/app/src/main/java/com/a1/nextlocation/data/Coupon.java index 5cfcece..6e50deb 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Coupon.java +++ b/app/src/main/java/com/a1/nextlocation/data/Coupon.java @@ -5,6 +5,11 @@ public class Coupon { private String code; private String reward; + public Coupon(String code, String reward) { + this.code = code; + this.reward = reward; + } + public String getCode() { return code; } diff --git a/app/src/main/java/com/a1/nextlocation/data/FileIO.java b/app/src/main/java/com/a1/nextlocation/data/FileIO.java index 71c08f6..6d6d8f9 100644 --- a/app/src/main/java/com/a1/nextlocation/data/FileIO.java +++ b/app/src/main/java/com/a1/nextlocation/data/FileIO.java @@ -1,4 +1,12 @@ package com.a1.nextlocation.data; public class FileIO { + + public static void readFileData() { + + } + + public static void writeFileData() { + + } } diff --git a/app/src/main/java/com/a1/nextlocation/data/Route.java b/app/src/main/java/com/a1/nextlocation/data/Route.java index 2714dab..ed5445a 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Route.java +++ b/app/src/main/java/com/a1/nextlocation/data/Route.java @@ -1,5 +1,6 @@ package com.a1.nextlocation.data; +import java.util.ArrayList; import java.util.List; public class Route { @@ -8,6 +9,17 @@ public class Route { private float totalDistance; private int totalTime; + public Route(String name) { + + this.name = name; + this.locations = new ArrayList<>(); + + } + + public void addLocation(Location location) { + this.locations.add(location); + } + public String getName() { return name; } @@ -25,18 +37,14 @@ public class Route { } public float getTotalDistance() { + //TODO calculate total distance according to all locations in list return totalDistance; } - public void setTotalDistance(float totalDistance) { - this.totalDistance = totalDistance; - } public int getTotalTime() { + //TODO calculate total time according to all locations in list return totalTime; } - public void setTotalTime(int totalTime) { - this.totalTime = totalTime; - } } From c4fd44ad7607bb5fd003107a13a765aea40a5593 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 11:19:11 +0100 Subject: [PATCH 05/11] added room dependency --- app/build.gradle | 6 ++++++ app/src/main/java/com/a1/nextlocation/data/Coupon.java | 1 + 2 files changed, 7 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index a452ddc..be97688 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,12 @@ android { dependencies { + def room_version = "2.2.5" + + implementation "androidx.room:room-runtime:$room_version" + annotationProcessor "androidx.room:room-compiler:$room_version" + + implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' diff --git a/app/src/main/java/com/a1/nextlocation/data/Coupon.java b/app/src/main/java/com/a1/nextlocation/data/Coupon.java index 6e50deb..06a9e23 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Coupon.java +++ b/app/src/main/java/com/a1/nextlocation/data/Coupon.java @@ -5,6 +5,7 @@ public class Coupon { private String code; private String reward; + public Coupon(String code, String reward) { this.code = code; this.reward = reward; From 08215e18c58a46ea0ac2b90eafacca2d4c8f1141 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 12:00:01 +0100 Subject: [PATCH 06/11] added database and coupon and route daos --- .../java/com/a1/nextlocation/data/Coupon.java | 31 ++++++++--- .../java/com/a1/nextlocation/data/Route.java | 29 +++++++++- .../a1/nextlocation/data/db/CouponDao.java | 31 +++++++++++ .../data/db/CouponRepository.java | 29 ++++++++++ .../com/a1/nextlocation/data/db/Database.java | 53 +++++++++++++++++++ .../com/a1/nextlocation/data/db/RouteDao.java | 30 +++++++++++ 6 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/Database.java create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java diff --git a/app/src/main/java/com/a1/nextlocation/data/Coupon.java b/app/src/main/java/com/a1/nextlocation/data/Coupon.java index 06a9e23..14456a5 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Coupon.java +++ b/app/src/main/java/com/a1/nextlocation/data/Coupon.java @@ -1,29 +1,48 @@ package com.a1.nextlocation.data; +import androidx.annotation.NonNull; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import org.jetbrains.annotations.NotNull; + +@Entity(tableName = "coupon") public class Coupon { + /** + * fields need to be public for the database to be able to use them + */ + @PrimaryKey + @NonNull + @ColumnInfo(name = "code") private String code; + + @ColumnInfo(name = "reward") + @NonNull private String reward; - public Coupon(String code, String reward) { + public Coupon(@NonNull String code, @NotNull String reward) { this.code = code; this.reward = reward; } + @NonNull public String getCode() { return code; } - public void setCode(String code) { - this.code = code; - } - + @NonNull public String getReward() { return reward; } - public void setReward(String reward) { + public void setCode(@NonNull String code) { + this.code = code; + } + + public void setReward(@NonNull String reward) { this.reward = reward; } } diff --git a/app/src/main/java/com/a1/nextlocation/data/Route.java b/app/src/main/java/com/a1/nextlocation/data/Route.java index ed5445a..5223e66 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Route.java +++ b/app/src/main/java/com/a1/nextlocation/data/Route.java @@ -1,15 +1,31 @@ package com.a1.nextlocation.data; +import androidx.annotation.NonNull; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.List; +@Entity public class Route { + + @PrimaryKey + @NonNull private String name; + private List locations; + + @ColumnInfo(name = "total_distance") private float totalDistance; + + @ColumnInfo(name = "total_time") private int totalTime; - public Route(String name) { + public Route(@NotNull String name) { this.name = name; this.locations = new ArrayList<>(); @@ -20,11 +36,12 @@ public class Route { this.locations.add(location); } + @NotNull public String getName() { return name; } - public void setName(String name) { + public void setName(@NotNull String name) { this.name = name; } @@ -47,4 +64,12 @@ public class Route { return totalTime; } + public void setTotalDistance(float totalDistance) { + this.totalDistance = totalDistance; + } + + public void setTotalTime(int totalTime) { + this.totalTime = totalTime; + } + } diff --git a/app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java b/app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java new file mode 100644 index 0000000..c528c54 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java @@ -0,0 +1,31 @@ +package com.a1.nextlocation.data.db; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; +import androidx.room.Update; + +import com.a1.nextlocation.data.Coupon; + +import java.util.List; + +@Dao +public interface CouponDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insertAll(Coupon... coupons); + + @Query("DELETE FROM coupon") + void deleteAll(); + + @Query("SELECT * FROM coupon") + LiveData> selectAll(); + + /* + to add an observer to the livedata, you can use the example from https://medium.com/mindorks/using-room-database-with-livedata-android-jetpack-cbf89b677b47 + */ + + @Query("SELECT * FROM coupon WHERE code = :code LIMIT 1") + Coupon selectCouponByCode(String code); +} diff --git a/app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java b/app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java new file mode 100644 index 0000000..b34549a --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java @@ -0,0 +1,29 @@ +package com.a1.nextlocation.data.db; + +import android.app.Application; +import android.content.Context; + +import androidx.lifecycle.LiveData; + +import com.a1.nextlocation.data.Coupon; + +import java.util.List; + +public class CouponRepository { + private CouponDao mCouponDao; + private LiveData> mAllCoupons; + + public CouponRepository(Context context) { + Database db = Database.getDatabase(context); + mCouponDao = db.couponDao(); + mAllCoupons = mCouponDao.selectAll(); + } + + public LiveData> getAllCoupons() { + return mAllCoupons; + } + + public Coupon getCoupon(String code) { + return mCouponDao.selectCouponByCode(code); + } +} diff --git a/app/src/main/java/com/a1/nextlocation/data/db/Database.java b/app/src/main/java/com/a1/nextlocation/data/db/Database.java new file mode 100644 index 0000000..7e1ca38 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/Database.java @@ -0,0 +1,53 @@ +package com.a1.nextlocation.data.db; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.room.DatabaseConfiguration; +import androidx.room.InvalidationTracker; +import androidx.room.Room; +import androidx.room.RoomDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteOpenHelper; + +import com.a1.nextlocation.data.Coupon; +import com.a1.nextlocation.data.Route; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@androidx.room.Database(entities = {Coupon.class,Route.class},version = 1,exportSchema = false) +public abstract class Database extends RoomDatabase { + + public abstract RouteDao routeDao(); + public abstract CouponDao couponDao(); + + private static volatile Database INSTANCE; + private static final int NUMBER_OF_THREADS = 4; + static final ExecutorService databaseWriterExecutor = Executors.newFixedThreadPool(NUMBER_OF_THREADS); + + static Database getDatabase(final Context context) { + if (INSTANCE == null){ + synchronized (Database.class) { + if (INSTANCE == null) { + + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + Database.class,"next_location_db").addCallback(callback).build(); + } + } + } + return INSTANCE; + } + + private static RoomDatabase.Callback callback = new RoomDatabase.Callback() { + @Override + public void onCreate(@NonNull SupportSQLiteDatabase db) { + super.onCreate(db); + + databaseWriterExecutor.execute(() -> { + // TODO populate our database here + }); + + } + }; +} diff --git a/app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java b/app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java new file mode 100644 index 0000000..03e9bfe --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java @@ -0,0 +1,30 @@ +package com.a1.nextlocation.data.db; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.Query; +import androidx.room.Update; + +import com.a1.nextlocation.data.Route; + +import java.util.List; + +@Dao +public interface RouteDao { + + @Insert + void insertAll(Route... routes); + + @Query("DELETE FROM route") + void deleteAll(); + + @Query("SELECT * FROM route") + LiveData> getAll(); + + @Update + void update(Route route); + + @Query("SELECT * FROM route where name = :name LIMIT 1") + Route getRouteByName(String name); +} From 204d45ceceb561ca49fcf147840e96bae00571df Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 12:03:47 +0100 Subject: [PATCH 07/11] added packages for dao and repository --- .../com/a1/nextlocation/data/db/Database.java | 7 ++--- .../data/db/{ => dao}/CouponDao.java | 2 +- .../data/db/{ => dao}/RouteDao.java | 5 +--- .../{ => repositories}/CouponRepository.java | 5 ++-- .../data/db/repositories/RouteRepository.java | 30 +++++++++++++++++++ 5 files changed, 38 insertions(+), 11 deletions(-) rename app/src/main/java/com/a1/nextlocation/data/db/{ => dao}/CouponDao.java (95%) rename app/src/main/java/com/a1/nextlocation/data/db/{ => dao}/RouteDao.java (86%) rename app/src/main/java/com/a1/nextlocation/data/db/{ => repositories}/CouponRepository.java (81%) create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/repositories/RouteRepository.java diff --git a/app/src/main/java/com/a1/nextlocation/data/db/Database.java b/app/src/main/java/com/a1/nextlocation/data/db/Database.java index 7e1ca38..e7c97a7 100644 --- a/app/src/main/java/com/a1/nextlocation/data/db/Database.java +++ b/app/src/main/java/com/a1/nextlocation/data/db/Database.java @@ -3,15 +3,14 @@ package com.a1.nextlocation.data.db; import android.content.Context; import androidx.annotation.NonNull; -import androidx.room.DatabaseConfiguration; -import androidx.room.InvalidationTracker; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; -import androidx.sqlite.db.SupportSQLiteOpenHelper; import com.a1.nextlocation.data.Coupon; import com.a1.nextlocation.data.Route; +import com.a1.nextlocation.data.db.dao.CouponDao; +import com.a1.nextlocation.data.db.dao.RouteDao; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -26,7 +25,7 @@ public abstract class Database extends RoomDatabase { private static final int NUMBER_OF_THREADS = 4; static final ExecutorService databaseWriterExecutor = Executors.newFixedThreadPool(NUMBER_OF_THREADS); - static Database getDatabase(final Context context) { + public static Database getDatabase(final Context context) { if (INSTANCE == null){ synchronized (Database.class) { if (INSTANCE == null) { diff --git a/app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java b/app/src/main/java/com/a1/nextlocation/data/db/dao/CouponDao.java similarity index 95% rename from app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java rename to app/src/main/java/com/a1/nextlocation/data/db/dao/CouponDao.java index c528c54..ca68438 100644 --- a/app/src/main/java/com/a1/nextlocation/data/db/CouponDao.java +++ b/app/src/main/java/com/a1/nextlocation/data/db/dao/CouponDao.java @@ -1,4 +1,4 @@ -package com.a1.nextlocation.data.db; +package com.a1.nextlocation.data.db.dao; import androidx.lifecycle.LiveData; import androidx.room.Dao; diff --git a/app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java b/app/src/main/java/com/a1/nextlocation/data/db/dao/RouteDao.java similarity index 86% rename from app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java rename to app/src/main/java/com/a1/nextlocation/data/db/dao/RouteDao.java index 03e9bfe..4d30dc6 100644 --- a/app/src/main/java/com/a1/nextlocation/data/db/RouteDao.java +++ b/app/src/main/java/com/a1/nextlocation/data/db/dao/RouteDao.java @@ -1,4 +1,4 @@ -package com.a1.nextlocation.data.db; +package com.a1.nextlocation.data.db.dao; import androidx.lifecycle.LiveData; import androidx.room.Dao; @@ -22,9 +22,6 @@ public interface RouteDao { @Query("SELECT * FROM route") LiveData> getAll(); - @Update - void update(Route route); - @Query("SELECT * FROM route where name = :name LIMIT 1") Route getRouteByName(String name); } diff --git a/app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java b/app/src/main/java/com/a1/nextlocation/data/db/repositories/CouponRepository.java similarity index 81% rename from app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java rename to app/src/main/java/com/a1/nextlocation/data/db/repositories/CouponRepository.java index b34549a..8219799 100644 --- a/app/src/main/java/com/a1/nextlocation/data/db/CouponRepository.java +++ b/app/src/main/java/com/a1/nextlocation/data/db/repositories/CouponRepository.java @@ -1,11 +1,12 @@ -package com.a1.nextlocation.data.db; +package com.a1.nextlocation.data.db.repositories; -import android.app.Application; import android.content.Context; import androidx.lifecycle.LiveData; import com.a1.nextlocation.data.Coupon; +import com.a1.nextlocation.data.db.dao.CouponDao; +import com.a1.nextlocation.data.db.Database; import java.util.List; diff --git a/app/src/main/java/com/a1/nextlocation/data/db/repositories/RouteRepository.java b/app/src/main/java/com/a1/nextlocation/data/db/repositories/RouteRepository.java new file mode 100644 index 0000000..0247951 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/repositories/RouteRepository.java @@ -0,0 +1,30 @@ +package com.a1.nextlocation.data.db.repositories; + +import android.content.Context; + +import androidx.lifecycle.LiveData; + +import com.a1.nextlocation.data.Route; +import com.a1.nextlocation.data.db.Database; +import com.a1.nextlocation.data.db.dao.RouteDao; + +import java.util.List; + +public class RouteRepository { + private RouteDao mRouteDao; + private LiveData> mAllRoutes; + + public RouteRepository(Context context) { + Database db = Database.getDatabase(context); + mRouteDao = db.routeDao(); + mAllRoutes = mRouteDao.getAll(); + } + + public LiveData> getAllRoutes() { + return mAllRoutes; + } + + public Route getRouteByName(String name) { + return mRouteDao.getRouteByName(name); + } +} From 23d23bead4ef5b8194d32a1bf259c92782eec7a3 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 12:13:15 +0100 Subject: [PATCH 08/11] added location dao and repository --- .../com/a1/nextlocation/data/Location.java | 20 ++++++++++++- .../java/com/a1/nextlocation/data/Route.java | 2 +- .../com/a1/nextlocation/data/db/Database.java | 8 ++++- .../nextlocation/data/db/dao/LocationDao.java | 27 +++++++++++++++++ .../db/repositories/LocationRepository.java | 30 +++++++++++++++++++ 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/dao/LocationDao.java create mode 100644 app/src/main/java/com/a1/nextlocation/data/db/repositories/LocationRepository.java diff --git a/app/src/main/java/com/a1/nextlocation/data/Location.java b/app/src/main/java/com/a1/nextlocation/data/Location.java index c1a822f..5f839ad 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Location.java +++ b/app/src/main/java/com/a1/nextlocation/data/Location.java @@ -1,15 +1,33 @@ package com.a1.nextlocation.data; +import androidx.annotation.NonNull; +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import org.jetbrains.annotations.NotNull; + +@Entity(tableName = "location") public class Location { + + @PrimaryKey + @NonNull private String name; + private String coordinates; private String description; + public Location(@NotNull String name, String coordinates, String description) { + this.name = name; + this.coordinates = coordinates; + this.description = description; + } + + @NotNull public String getName() { return name; } - public void setName(String name) { + public void setName(@NotNull String name) { this.name = name; } diff --git a/app/src/main/java/com/a1/nextlocation/data/Route.java b/app/src/main/java/com/a1/nextlocation/data/Route.java index 5223e66..c1d1bf0 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Route.java +++ b/app/src/main/java/com/a1/nextlocation/data/Route.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -@Entity +@Entity(tableName = "route") public class Route { @PrimaryKey diff --git a/app/src/main/java/com/a1/nextlocation/data/db/Database.java b/app/src/main/java/com/a1/nextlocation/data/db/Database.java index e7c97a7..7ab918c 100644 --- a/app/src/main/java/com/a1/nextlocation/data/db/Database.java +++ b/app/src/main/java/com/a1/nextlocation/data/db/Database.java @@ -8,18 +8,24 @@ import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; import com.a1.nextlocation.data.Coupon; +import com.a1.nextlocation.data.Location; import com.a1.nextlocation.data.Route; import com.a1.nextlocation.data.db.dao.CouponDao; +import com.a1.nextlocation.data.db.dao.LocationDao; import com.a1.nextlocation.data.db.dao.RouteDao; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -@androidx.room.Database(entities = {Coupon.class,Route.class},version = 1,exportSchema = false) +/** + * @author Sem + */ +@androidx.room.Database(entities = {Coupon.class,Route.class, Location.class},version = 1,exportSchema = false) public abstract class Database extends RoomDatabase { public abstract RouteDao routeDao(); public abstract CouponDao couponDao(); + public abstract LocationDao locationDao(); private static volatile Database INSTANCE; private static final int NUMBER_OF_THREADS = 4; diff --git a/app/src/main/java/com/a1/nextlocation/data/db/dao/LocationDao.java b/app/src/main/java/com/a1/nextlocation/data/db/dao/LocationDao.java new file mode 100644 index 0000000..c0da25c --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/dao/LocationDao.java @@ -0,0 +1,27 @@ +package com.a1.nextlocation.data.db.dao; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import com.a1.nextlocation.data.Location; + +import java.util.List; + +@Dao +public interface LocationDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insertAll(Location... locations); + + @Query("DELETE FROM location") + void deleteAll(); + + @Query("SELECT * FROM location") + LiveData> selectAll(); + + @Query("SELECT * FROM location WHERE name = :name LIMIT 1") + Location getLocationByName(String name); + +} diff --git a/app/src/main/java/com/a1/nextlocation/data/db/repositories/LocationRepository.java b/app/src/main/java/com/a1/nextlocation/data/db/repositories/LocationRepository.java new file mode 100644 index 0000000..7cdb548 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/db/repositories/LocationRepository.java @@ -0,0 +1,30 @@ +package com.a1.nextlocation.data.db.repositories; + +import android.content.Context; + +import androidx.lifecycle.LiveData; + +import com.a1.nextlocation.data.Location; +import com.a1.nextlocation.data.db.Database; +import com.a1.nextlocation.data.db.dao.LocationDao; + +import java.util.List; + +public class LocationRepository { + private LocationDao mLocationDao; + private LiveData> mAllLocations; + + public LocationRepository(Context context) { + Database db = Database.getDatabase(context); + mLocationDao = db.locationDao(); + mAllLocations = mLocationDao.selectAll(); + } + + public LiveData> getAllLocations() { + return mAllLocations; + } + + public Location getLocationByName(String name) { + return mLocationDao.getLocationByName(name); + } +} From 6b97c21a8b266a5d35f1d5f4a1153e5a8e53241d Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 12:16:39 +0100 Subject: [PATCH 09/11] added ignores to fields that dont need to be in the database --- app/src/main/java/com/a1/nextlocation/data/Data.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/a1/nextlocation/data/Data.java b/app/src/main/java/com/a1/nextlocation/data/Data.java index a16b52e..fa53418 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Data.java +++ b/app/src/main/java/com/a1/nextlocation/data/Data.java @@ -1,5 +1,7 @@ package com.a1.nextlocation.data; +import androidx.room.Ignore; + import java.util.List; public class Data { @@ -7,8 +9,14 @@ public class Data { private int locationsVisited; private int totalTime; private List couponList; + + @Ignore private Location nextLocation; + + @Ignore private Location lastLocation; + + @Ignore private Route currentRoute; From 8fdb88f71a3451a752e0f1f70d08461a3d1e1540 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 13:16:03 +0100 Subject: [PATCH 10/11] data dao --- .../main/java/com/a1/nextlocation/data/Data.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/src/main/java/com/a1/nextlocation/data/Data.java b/app/src/main/java/com/a1/nextlocation/data/Data.java index fa53418..7f4b5eb 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Data.java +++ b/app/src/main/java/com/a1/nextlocation/data/Data.java @@ -1,11 +1,21 @@ package com.a1.nextlocation.data; +import androidx.annotation.NonNull; +import androidx.room.Entity; import androidx.room.Ignore; +import androidx.room.PrimaryKey; import java.util.List; +@Entity public class Data { + + + + @PrimaryKey + @NonNull private float distanceTraveled; + private int locationsVisited; private int totalTime; private List couponList; @@ -19,6 +29,12 @@ public class Data { @Ignore private Route currentRoute; + + public Data() { + this.distanceTraveled = 0; + this.locationsVisited = 0; + this.totalTime = 0; + } public float getDistanceTraveled() { From b3be07836104e97dc5f6753b931e43ace0c7e3d3 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 14 Dec 2020 14:35:53 +0100 Subject: [PATCH 11/11] added mapview and osm map --- app/src/main/AndroidManifest.xml | 2 + .../nextlocation/fragments/HomeFragment.java | 97 +++++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 9 +- 3 files changed, 104 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 465afef..f5def4b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + diff --git a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java index 7610b2a..4314101 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -1,20 +1,49 @@ package com.a1.nextlocation.fragments; +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.location.Location; +import android.location.LocationManager; import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.a1.nextlocation.R; +import org.osmdroid.api.IMapController; +import org.osmdroid.config.Configuration; +import org.osmdroid.util.GeoPoint; +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.compass.CompassOverlay; +import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider; +import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; +import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; + +import java.util.ArrayList; + public class HomeFragment extends Fragment { + private final String userAgent = "com.ai.nextlocation.fragments"; + private MapView mapView; + private final int REQUEST_PERMISSIONS_REQUEST_CODE = 1; + private final String TAG = HomeFragment.class.getCanonicalName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + requestPermissionsIfNecessary( + // if you need to show the current location request FINE_LOCATION permission + Manifest.permission.ACCESS_FINE_LOCATION, + // WRITE_EXTERNAL_STORAGE is required in order to show the map + Manifest.permission.WRITE_EXTERNAL_STORAGE); } @@ -23,5 +52,73 @@ public class HomeFragment extends Fragment { Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_home, container, false); + + + } + + private void initMap(@NonNull View view) { + // set the user agent + Configuration.getInstance().setUserAgentValue(userAgent); + + // create the map view + mapView = (MapView) view.findViewById(R.id.mapView); + mapView.setDestroyMode(false); + mapView.setTag("mapView"); + mapView.setMultiTouchControls(true); + + // get the location provider + GpsMyLocationProvider gpsMyLocationProvider = new GpsMyLocationProvider(this.requireContext()); + + // add the compass overlay + CompassOverlay compassOverlay = new CompassOverlay(requireContext(),new InternalCompassOrientationProvider(requireContext()),mapView); + compassOverlay.enableCompass(); + mapView.getOverlays().add(compassOverlay); + + // add the location overlay + MyLocationNewOverlay mLocationOverlay = new MyLocationNewOverlay(gpsMyLocationProvider, mapView); + mLocationOverlay.enableFollowLocation(); + mLocationOverlay.enableMyLocation(); + mapView.getOverlays().add(mLocationOverlay); + + // add the zoom controller + IMapController mapController = mapView.getController(); + mapController.setZoom(15.0); + + // add location manager and set the start point + LocationManager locationManager = (LocationManager) requireActivity().getSystemService(Context.LOCATION_SERVICE); + + try { + Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + GeoPoint startPoint = new GeoPoint(location.getLatitude(), location.getLongitude()); + mapController.setCenter(startPoint); + + } catch (SecurityException e) { + Log.d(TAG, "onViewCreated: exception while getting location: " + e.getLocalizedMessage()); + + requestPermissionsIfNecessary( + // if you need to show the current location request FINE_LOCATION permission + Manifest.permission.ACCESS_FINE_LOCATION, + // WRITE_EXTERNAL_STORAGE is required in order to show the map + Manifest.permission.WRITE_EXTERNAL_STORAGE); + + } + + } + private void requestPermissionsIfNecessary(String... permissions) { + ArrayList permissionsToRequest = new ArrayList<>(); + if (this.getContext() != null) + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(this.getContext(), permission) + != PackageManager.PERMISSION_GRANTED) { + // Permission is not granted + permissionsToRequest.add(permission); + } + } + if (permissionsToRequest.size() > 0 && this.getActivity() != null) { + ActivityCompat.requestPermissions( + this.getActivity(), + permissionsToRequest.toArray(new String[0]), + REQUEST_PERMISSIONS_REQUEST_CODE); + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 5194fda..c90fc63 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -5,10 +5,11 @@ android:layout_height="match_parent" tools:context=".fragments.HomeFragment"> - - + android:layout_height="match_parent"> + + \ No newline at end of file