diff --git a/app/build.gradle b/app/build.gradle index 02dc48e7..d8b00642 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,7 +117,6 @@ dependencies { androidTestImplementation "com.android.support.test:rules:${depVersionAndroidTest}" androidTestImplementation "com.android.support.test:runner:${depVersionAndroidTest}" androidTestImplementation "org.mockito:mockito-android:${depVersionMockito}" - annotationProcessor "android.arch.persistence.room:compiler:${depVersionRoom}" annotationProcessor "com.github.stephanenicolas.toothpick:toothpick-compiler:${depVersionToothpick}" annotationProcessor "com.jakewharton:butterknife-compiler:${depVersionButterknife}" annotationProcessor "org.projectlombok:lombok:${depVersionLombok}" @@ -151,6 +150,8 @@ dependencies { exclude group: 'org.hamcrest' } testImplementation "org.powermock:powermock-module-junit4:${depVersionPowermock}" + + annotationProcessor "android.arch.persistence.room:compiler:${depVersionRoom}" } tasks.withType(Test) { diff --git a/app/src/main/java/ch/epfl/sweng/erpa/database/ERPADatabase.java b/app/src/main/java/ch/epfl/sweng/erpa/database/ERPADatabase.java new file mode 100644 index 00000000..1d5370c0 --- /dev/null +++ b/app/src/main/java/ch/epfl/sweng/erpa/database/ERPADatabase.java @@ -0,0 +1,14 @@ +package ch.epfl.sweng.erpa.database; + +import android.arch.persistence.room.Database; +import android.arch.persistence.room.RoomDatabase; +import android.arch.persistence.room.TypeConverters; + +import ch.epfl.sweng.erpa.database.converter.*; +import ch.epfl.sweng.erpa.model.*; + +@Database(entities = {Game.class, PlayerJoinGameRequest.class, UserAuth.class, Username.class, UserProfile.class, UserSessionToken.class}, version = 1) +@TypeConverters({Converters.class}) +public abstract class ERPADatabase extends RoomDatabase { + public abstract GameDao gameDao(); +} diff --git a/app/src/main/java/ch/epfl/sweng/erpa/database/GameDao.java b/app/src/main/java/ch/epfl/sweng/erpa/database/GameDao.java new file mode 100644 index 00000000..fb772d43 --- /dev/null +++ b/app/src/main/java/ch/epfl/sweng/erpa/database/GameDao.java @@ -0,0 +1,15 @@ +package ch.epfl.sweng.erpa.database; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.Query; + +import java.util.List; + +import ch.epfl.sweng.erpa.model.*; + +@Dao +public interface GameDao { + @Query("SELECT * FROM game") List getAll(); + @Insert void insertAll(Game... games); +} diff --git a/app/src/main/java/ch/epfl/sweng/erpa/database/converter/Converters.java b/app/src/main/java/ch/epfl/sweng/erpa/database/converter/Converters.java new file mode 100644 index 00000000..811f2a69 --- /dev/null +++ b/app/src/main/java/ch/epfl/sweng/erpa/database/converter/Converters.java @@ -0,0 +1,106 @@ +package ch.epfl.sweng.erpa.database.converter; + +import android.arch.persistence.room.TypeConverter; + +import com.annimon.stream.Optional; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +import ch.epfl.sweng.erpa.model.Game; +import ch.epfl.sweng.erpa.model.PlayerJoinGameRequest; + +public class Converters { + + @TypeConverter + public static Integer toInteger(Optional optional) { + return optional.orElse(null); + } + + @TypeConverter + public static Optional fromInteger(Integer value) { + return Optional.ofNullable(value); + } + + + @TypeConverter + public static PlayerJoinGameRequest.RequestStatus toRequestStatus(Integer value) { + return requestStatusConversionMap.get(value); + } + + @TypeConverter + public static Integer fromRequestStatus(PlayerJoinGameRequest.RequestStatus requestStatus) { + return requestStatusConversionMap.inverse().get(requestStatus); + } + + + @TypeConverter + public static Game.GameStatus toGameStatus(Integer value) { + return gameStatusConversionMap.get(value); + } + @TypeConverter + public static Integer fromGameStatus(Game.GameStatus gameStatus) { + return gameStatusConversionMap.inverse().get(gameStatus); + } + + @TypeConverter + public static Integer fromDifficulty(Game.Difficulty difficulty) { + return difficultyConversionMap.inverse().get(difficulty); + } + + @TypeConverter + public static Game.Difficulty toDifficulty(Integer value) { + return difficultyConversionMap.get(value); + } + + + private static final BiMap requestStatusConversionMap = genRequestStatusConversionMap(); + private static final BiMap gameStatusConversionMap = genGameStatusConversionMap(); + private static final BiMap difficultyConversionMap = genDifficultyConversionMap(); + + private static BiMap genDifficultyConversionMap() { + BiMap result = HashBiMap.create(); + result.put(10, Game.Difficulty.NOOB); + result.put(20, Game.Difficulty.CHILL); + result.put(30, Game.Difficulty.HARD); + assert conversionMapHasAll(result, Game.Difficulty.values()); + return result; + } + + /** + * Builds a conversion map for the GameStatus enum + */ + private static BiMap genGameStatusConversionMap() { + BiMap result = HashBiMap.create(); + result.put(10, Game.GameStatus.CANCELED); + result.put(20, Game.GameStatus.CONFIRMED); + result.put(30, Game.GameStatus.CREATED); + result.put(40, Game.GameStatus.FINISHED); + result.put(50, Game.GameStatus.IN_PROGRESS); + assert conversionMapHasAll(result, Game.GameStatus.values()); + return result; + } + + /** + * Builds a conversion map for the RequestStatus enum + */ + private static BiMap genRequestStatusConversionMap() { + BiMap result = HashBiMap.create(); + result.put(10, PlayerJoinGameRequest.RequestStatus.CONFIRMED); + result.put(20, PlayerJoinGameRequest.RequestStatus.HAS_QUIT); + result.put(30, PlayerJoinGameRequest.RequestStatus.REJECTED); + result.put(40, PlayerJoinGameRequest.RequestStatus.REMOVED); + result.put(50, PlayerJoinGameRequest.RequestStatus.REQUEST_TO_JOIN); + assert conversionMapHasAll(result, PlayerJoinGameRequest.RequestStatus.values()); + return result; + } + + private static boolean conversionMapHasAll(BiMap result, T[] values) { + for (T t : values) { + if (!result.inverse().containsKey(t)) { + return false; + } + } + + return false; + } +} diff --git a/app/src/main/java/ch/epfl/sweng/erpa/model/Game.java b/app/src/main/java/ch/epfl/sweng/erpa/model/Game.java index 593d58c7..6398a4f6 100644 --- a/app/src/main/java/ch/epfl/sweng/erpa/model/Game.java +++ b/app/src/main/java/ch/epfl/sweng/erpa/model/Game.java @@ -22,7 +22,7 @@ @NoArgsConstructor @AllArgsConstructor public class Game implements UuidObject { - @PrimaryKey @NonNull private String uuid; + @android.support.annotation.NonNull @PrimaryKey @NonNull private String uuid = ""; @ForeignKey(entity = UserProfile.class, parentColumns = "uuid", childColumns = "gm_user_uuid") @NonNull private String gmUserUuid; diff --git a/app/src/main/java/ch/epfl/sweng/erpa/model/PlayerJoinGameRequest.java b/app/src/main/java/ch/epfl/sweng/erpa/model/PlayerJoinGameRequest.java index 86cc3b2b..fa32e0a6 100644 --- a/app/src/main/java/ch/epfl/sweng/erpa/model/PlayerJoinGameRequest.java +++ b/app/src/main/java/ch/epfl/sweng/erpa/model/PlayerJoinGameRequest.java @@ -1,6 +1,7 @@ package ch.epfl.sweng.erpa.model; import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; import android.arch.persistence.room.ForeignKey; import android.arch.persistence.room.PrimaryKey; @@ -14,9 +15,13 @@ @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor +@Entity public class PlayerJoinGameRequest { - @PrimaryKey @NonNull private String joinRequestId; - @ColumnInfo(name = "request_status") @NonNull private RequestStatus requestStatus; + @android.support.annotation.NonNull @PrimaryKey @NonNull private String joinRequestId = ""; + + @ColumnInfo(name = "request_status") + @NonNull private RequestStatus requestStatus; + @ForeignKey(entity = Game.class, parentColumns = "uuid", childColumns = "game_uuid") @NonNull private String gameUuid; diff --git a/app/src/main/java/ch/epfl/sweng/erpa/model/UserAuth.java b/app/src/main/java/ch/epfl/sweng/erpa/model/UserAuth.java index 26c43f8f..7c8f4cc5 100644 --- a/app/src/main/java/ch/epfl/sweng/erpa/model/UserAuth.java +++ b/app/src/main/java/ch/epfl/sweng/erpa/model/UserAuth.java @@ -1,7 +1,9 @@ package ch.epfl.sweng.erpa.model; import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; import android.arch.persistence.room.ForeignKey; +import android.arch.persistence.room.PrimaryKey; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,12 +13,13 @@ @Data @AllArgsConstructor @NoArgsConstructor +@Entity public class UserAuth { @ForeignKey(entity = UserProfile.class, parentColumns = "uuid", childColumns = "user_uuid") @NonNull private String userUuid; - @ColumnInfo(name = "public_key") - @NonNull private String publicKey; + @PrimaryKey @ColumnInfo(name = "public_key") + @android.support.annotation.NonNull @NonNull private String publicKey = ""; @ColumnInfo(name = "authentication_strategy") @NonNull private String authenticationStrategy = "Grenouille"; } diff --git a/app/src/main/java/ch/epfl/sweng/erpa/model/UserProfile.java b/app/src/main/java/ch/epfl/sweng/erpa/model/UserProfile.java index 504937fe..a781f6bc 100644 --- a/app/src/main/java/ch/epfl/sweng/erpa/model/UserProfile.java +++ b/app/src/main/java/ch/epfl/sweng/erpa/model/UserProfile.java @@ -1,9 +1,9 @@ package ch.epfl.sweng.erpa.model; import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; import android.arch.persistence.room.PrimaryKey; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -14,8 +14,10 @@ @Builder @NoArgsConstructor @RequiredArgsConstructor +@Entity public class UserProfile implements UuidObject { - @PrimaryKey @NonNull String uuid; + @PrimaryKey @android.support.annotation.NonNull @NonNull String uuid; @ColumnInfo(name = "is_gm") @NonNull private Boolean isGm; @ColumnInfo(name = "is_player") @NonNull private Boolean isPlayer; public enum Experience {Noob, Casual, Expert} +} diff --git a/app/src/main/java/ch/epfl/sweng/erpa/model/UserSessionToken.java b/app/src/main/java/ch/epfl/sweng/erpa/model/UserSessionToken.java index 948cf483..49e56476 100644 --- a/app/src/main/java/ch/epfl/sweng/erpa/model/UserSessionToken.java +++ b/app/src/main/java/ch/epfl/sweng/erpa/model/UserSessionToken.java @@ -1,5 +1,9 @@ package ch.epfl.sweng.erpa.model; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.ForeignKey; +import android.arch.persistence.room.PrimaryKey; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,8 +13,10 @@ @Data @AllArgsConstructor @NoArgsConstructor +@Entity @ToString(exclude = "sessionToken") public class UserSessionToken { + @ForeignKey(entity = UserProfile.class, parentColumns = "uuid", childColumns = "user_uuid") @NonNull private String userUuid; - @NonNull private String sessionToken; + @PrimaryKey @android.support.annotation.NonNull @NonNull private String sessionToken = ""; } diff --git a/app/src/main/java/ch/epfl/sweng/erpa/model/Username.java b/app/src/main/java/ch/epfl/sweng/erpa/model/Username.java index 6f059e67..2d6554d1 100644 --- a/app/src/main/java/ch/epfl/sweng/erpa/model/Username.java +++ b/app/src/main/java/ch/epfl/sweng/erpa/model/Username.java @@ -1,7 +1,9 @@ package ch.epfl.sweng.erpa.model; import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; import android.arch.persistence.room.ForeignKey; +import android.arch.persistence.room.PrimaryKey; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,9 +13,10 @@ @Data @AllArgsConstructor @NoArgsConstructor +@Entity public class Username { @ForeignKey(entity = UserProfile.class, parentColumns = "uuid", childColumns = "user_uuid") @NonNull private String userUuid; @ColumnInfo - @NonNull private String username; + @android.support.annotation.NonNull @PrimaryKey @NonNull private String username = ""; }