From 4a530ea99da3e6cbec1961b3b09e756c2ff2610d Mon Sep 17 00:00:00 2001 From: AndrewQuijano Date: Sun, 27 Jul 2025 20:04:43 -0400 Subject: [PATCH] Delete duplicate code, using Jar file from server JAR package in Maven --- .github/workflows/deploy_jar.yml | 2 +- README.md | 3 +- REU2017/app/build.gradle | 25 +++- .../main/java/Localization/ClientThread.java | 10 +- .../Localization/LOCALIZATION_SCHEME.java | 52 ------- .../main/java/Localization/background.java | 11 +- .../structs/LocalizationResult.java | 132 ------------------ .../structs/SendLocalizationData.java | 111 --------------- .../structs/SendTrainingData.java | 50 ------- .../app/src/main/java/ui/AddMapActivity.java | 2 +- .../src/main/java/ui/LocalizeActivity.java | 2 +- .../app/src/main/java/ui/TrainActivity.java | 2 +- .../app/src/main/java/ui/test_connection.java | 2 +- REU2017/build.gradle | 4 +- REU2017/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- REUServer/README.md | 1 + 17 files changed, 42 insertions(+), 372 deletions(-) delete mode 100644 REU2017/app/src/main/java/Localization/LOCALIZATION_SCHEME.java delete mode 100644 REU2017/app/src/main/java/Localization/structs/LocalizationResult.java delete mode 100644 REU2017/app/src/main/java/Localization/structs/SendLocalizationData.java delete mode 100644 REU2017/app/src/main/java/Localization/structs/SendTrainingData.java diff --git a/.github/workflows/deploy_jar.yml b/.github/workflows/deploy_jar.yml index 17b187e..0b6d891 100644 --- a/.github/workflows/deploy_jar.yml +++ b/.github/workflows/deploy_jar.yml @@ -76,5 +76,5 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ needs.create_release.outputs.v-version }} - files: build/libs/fingerprint_localization*.jar + files: REUServer/build/libs/fingerprint_localization*.jar token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 3305e77..2c610f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Security of Smart Things REU 2017 -[![Build Status](https://travis-ci.com/AndrewQuijano/SSTREU2017.svg?branch=master)](https://travis-ci.com/AndrewQuijano/SSTREU2017) +[![Test Android and Fingerprint Server](https://github.com/adwise-fiu/Secure_Indoor_Localization/actions/workflows/parallel_tests.yml/badge.svg?branch=main)](https://github.com/adwise-fiu/Secure_Indoor_Localization/actions/workflows/parallel_tests.yml) + [![codecov](https://codecov.io/gh/AndrewQuijano/SSTREU2017/branch/master/graph/badge.svg?token=E7ZKFWTE3D)](https://codecov.io/gh/AndrewQuijano/SSTREU2017) This repository contains all the code used to complete the Security of Smart Things REU project of privacy preserving indoor localization. diff --git a/REU2017/app/build.gradle b/REU2017/app/build.gradle index 26cd423..b9d01b8 100644 --- a/REU2017/app/build.gradle +++ b/REU2017/app/build.gradle @@ -1,15 +1,26 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 35 + compileSdkVersion 36 defaultConfig { applicationId "edu.fiu.reu2017" - minSdkVersion 25 - targetSdkVersion 35 + minSdkVersion 26 + targetSdkVersion 36 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + + packagingOptions { + resources { + excludes += '**/log4j2.xml' // Excludes any file named log4j2.xml in any directory + excludes += '**/log4j.properties' // Example: Also exclude log4j.properties if present + excludes += '**/log4j2.component.properties' // Example: Another common Log4j file + // Add the new exclusion for META-INF/DEPENDENCIES + excludes += 'META-INF/DEPENDENCIES' + // Add more patterns if you identify other Log4j specific files causing issues + } + } buildTypes { release @@ -19,10 +30,10 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } - namespace 'edu.fiu.reu2017' + namespace = 'edu.fiu.reu2017' } dependencies @@ -37,6 +48,8 @@ dependencies testImplementation 'junit:junit:4.13.2' // https://mvnrepository.com/artifact/io.github.andrewquijano/ciphercraft implementation 'io.github.andrewquijano:ciphercraft:1.0.6' + // https://mvnrepository.com/artifact/io.github.andrewquijano/fingerprint_localization + implementation 'io.github.andrewquijano:fingerprint_localization:1.0.0' } java { toolchain { diff --git a/REU2017/app/src/main/java/Localization/ClientThread.java b/REU2017/app/src/main/java/Localization/ClientThread.java index 53cb509..02db5b0 100644 --- a/REU2017/app/src/main/java/Localization/ClientThread.java +++ b/REU2017/app/src/main/java/Localization/ClientThread.java @@ -10,9 +10,9 @@ import java.security.KeyPair; import java.util.ArrayList; -import Localization.structs.SendLocalizationData; -import Localization.structs.LocalizationResult; -import Localization.structs.SendTrainingData; +import edu.fiu.adwise.fingerprint_localization.structs.SendLocalizationData; +import edu.fiu.adwise.fingerprint_localization.structs.LocalizationResult; +import edu.fiu.adwise.fingerprint_localization.structs.SendTrainingData; import edu.fiu.adwise.homomorphic_encryption.misc.HomomorphicException; import ui.MainActivity; import ui.TrainActivity; @@ -20,6 +20,7 @@ import static ui.MainActivity.SQLDatabase; import static ui.MainActivity.portNumber; +import edu.fiu.adwise.fingerprint_localization.distance_computation.LOCALIZATION_SCHEME; import edu.fiu.adwise.homomorphic_encryption.dgk.DGKOperations; import edu.fiu.adwise.homomorphic_encryption.dgk.DGKPrivateKey; @@ -188,9 +189,6 @@ public void run () { case DGK_MIN: case DGK_MCA: case DGK_DMA: - case EL_GAMAL_DMA: - case EL_GAMAL_MIN: - case EL_GAMAL_MCA: localize(); break; default: diff --git a/REU2017/app/src/main/java/Localization/LOCALIZATION_SCHEME.java b/REU2017/app/src/main/java/Localization/LOCALIZATION_SCHEME.java deleted file mode 100644 index c416e66..0000000 --- a/REU2017/app/src/main/java/Localization/LOCALIZATION_SCHEME.java +++ /dev/null @@ -1,52 +0,0 @@ -package Localization; -public enum LOCALIZATION_SCHEME { - UNDO(-5), - RESET(-4), - GETXY(-3), - PROCESS(-2), - GET_COLUMN(-1), - TRAIN(0), - PLAIN_MIN(1), - DGK_MIN(2), - PAILLIER_MIN(3), - PLAIN_MCA(4), - DGK_MCA(5), - PAILLIER_MCA(6), - PLAIN_DMA(7), - DGK_DMA(8), - PAILLIER_DMA(9), - EL_GAMAL_MIN(10), - EL_GAMAL_MCA(11), - EL_GAMAL_DMA(12); - - public final int value; - - LOCALIZATION_SCHEME(int value) - { - this.value = value; - } - - public static LOCALIZATION_SCHEME from_int(Integer x) { - return switch (x) { - case -5 -> UNDO; - case -4 -> RESET; - case -3 -> GETXY; - case -2 -> PROCESS; - case -1 -> GET_COLUMN; - case 0 -> TRAIN; - case 1 -> PLAIN_MIN; - case 2 -> DGK_MIN; - case 3 -> PAILLIER_MIN; - case 4 -> PLAIN_MCA; - case 5 -> DGK_MCA; - case 6 -> PAILLIER_MCA; - case 7 -> PLAIN_DMA; - case 8 -> DGK_DMA; - case 9 -> PAILLIER_DMA; - case 10 -> EL_GAMAL_MIN; - case 11 -> EL_GAMAL_MCA; - case 12 -> EL_GAMAL_DMA; - default -> null; - }; - } -} \ No newline at end of file diff --git a/REU2017/app/src/main/java/Localization/background.java b/REU2017/app/src/main/java/Localization/background.java index 9614063..682f958 100644 --- a/REU2017/app/src/main/java/Localization/background.java +++ b/REU2017/app/src/main/java/Localization/background.java @@ -21,8 +21,9 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import Localization.structs.SendLocalizationData; -import Localization.structs.LocalizationResult; +import edu.fiu.adwise.fingerprint_localization.distance_computation.LOCALIZATION_SCHEME; +import edu.fiu.adwise.fingerprint_localization.structs.SendLocalizationData; +import edu.fiu.adwise.fingerprint_localization.structs.LocalizationResult; import edu.fiu.adwise.homomorphic_encryption.misc.HomomorphicException; import ui.MainActivity; @@ -34,7 +35,7 @@ import edu.fiu.adwise.homomorphic_encryption.paillier.PaillierPublicKey; import static android.graphics.Color.RED; -import static Localization.LOCALIZATION_SCHEME.*; +import static edu.fiu.adwise.fingerprint_localization.distance_computation.LOCALIZATION_SCHEME.*; import static ui.LocalizeActivity.off_map; public final class background { @@ -366,12 +367,12 @@ private Float[] doInBackground() { float y = 0; for (int i = 0; i < MainActivity.k; i++) { - distanceSUM += fromServer.get(i).plainDistance; + distanceSUM += fromServer.get(i).getPlainDistance(); } // Find value of all w_i for (int i = 0 ; i < MainActivity.k; i++) { - w_i[i] = ((double) fromServer.get(i).plainDistance/distanceSUM); + w_i[i] = ((double) fromServer.get(i).getPlainDistance()/distanceSUM); w_i[i] = 1.0 - w_i[i]; w_i[i] = w_i[i]/(MainActivity.k - 1); x += (float) (w_i[i] * fromServer.get(i).getX()); diff --git a/REU2017/app/src/main/java/Localization/structs/LocalizationResult.java b/REU2017/app/src/main/java/Localization/structs/LocalizationResult.java deleted file mode 100644 index c33d958..0000000 --- a/REU2017/app/src/main/java/Localization/structs/LocalizationResult.java +++ /dev/null @@ -1,132 +0,0 @@ -package Localization.structs; - -import androidx.annotation.NonNull; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigInteger; - -import edu.fiu.adwise.homomorphic_encryption.dgk.DGKOperations; -import edu.fiu.adwise.homomorphic_encryption.dgk.DGKPrivateKey; -import edu.fiu.adwise.homomorphic_encryption.dgk.DGKPublicKey; -import edu.fiu.adwise.homomorphic_encryption.misc.HomomorphicException; -import edu.fiu.adwise.homomorphic_encryption.paillier.PaillierCipher; -import edu.fiu.adwise.homomorphic_encryption.paillier.PaillierPrivateKey; -import edu.fiu.adwise.homomorphic_encryption.paillier.PaillierPublicKey; - -public class LocalizationResult implements Serializable, Comparable { - @Serial - private static final long serialVersionUID = -1884589588377067950L; - - public final Double [] coordinates = new Double[2]; - public final Long matches; - public Long plainDistance; - public final BigInteger encryptedDistance; - public final BigInteger [] encryptedCoordinates = new BigInteger[2]; - - // PlainText Distances - public LocalizationResult(Double x, Double y, Long distance, Long matches) { - this.coordinates[0] = x; - this.coordinates[1] = y; - this.plainDistance = distance; - this.matches = matches; - this.encryptedDistance = null; - } - - // Paillier/DGK Distances - public LocalizationResult(Double x, Double y, BigInteger distance, Long matches) { - this.coordinates[0] = x; - this.coordinates[1] = y; - this.encryptedDistance = distance; - this.matches = matches; - this.plainDistance = null; - } - - public void add_secret_coordinates(PaillierPublicKey pk) throws HomomorphicException { - // Encrypt Coordinates - encryptedCoordinates[0] = PaillierCipher.encrypt(coordinates[0].longValue(), pk); - encryptedCoordinates[1] = PaillierCipher.encrypt(coordinates[1].longValue(), pk); - - // The coordinate stored in plain text get nullified - coordinates[0] = null; - coordinates[1] = null; - } - - public void add_secret_coordinates(DGKPublicKey pk) throws HomomorphicException { - // Encrypt Coordinates - encryptedCoordinates[0] = DGKOperations.encrypt(coordinates[0].longValue(), pk); - encryptedCoordinates[1] = DGKOperations.encrypt(coordinates[1].longValue(), pk); - - // The coordinate stored in plain text get nullified - coordinates[0] = null; - coordinates[1] = null; - } - - public Double getX() - { - return coordinates[0]; - } - - public Double getY() - { - return coordinates[1]; - } - - public int compareTo(LocalizationResult o) - { - return plainDistance.compareTo(o.plainDistance); - } - - // Used to decrypt, if DMA, just divide by distance as well! - public void decrypt_all(PaillierPrivateKey sk) throws HomomorphicException { - assert encryptedDistance != null; - this.plainDistance = PaillierCipher.decrypt(encryptedDistance, sk).longValue(); - if(matches != null) { - if(matches == 0) { - this.plainDistance = Long.MAX_VALUE; - } else { - this.plainDistance = plainDistance/matches; - } - } - } - - // Used to decrypt, if DMA, just divide by distance as well! - public void decrypt_all(DGKPrivateKey sk) throws HomomorphicException { - assert this.encryptedDistance != null; - this.plainDistance = DGKOperations.decrypt(this.encryptedDistance, sk); - if(this.matches != null) { - if(matches == 0) { - this.plainDistance = Long.MAX_VALUE; - } else { - this.plainDistance = plainDistance/matches; - } - } - } - - // Used only for Plain-DMA, divide by matches! - public void plain_decrypt() - { - if(matches == 0) - { - this.plainDistance = Long.MAX_VALUE; - } - else - { - this.plainDistance = plainDistance/matches; - } - } - - @NonNull - public String toString() { - String answer = ""; - answer += "(x=" + coordinates[0] + ", y=" + coordinates[1] + " "; - if(plainDistance != null) { - answer += "d=" + plainDistance; - } - else { - answer += "[[d]]"; - } - answer += "m=" + matches; - return answer; - } -} \ No newline at end of file diff --git a/REU2017/app/src/main/java/Localization/structs/SendLocalizationData.java b/REU2017/app/src/main/java/Localization/structs/SendLocalizationData.java deleted file mode 100644 index 7ec677d..0000000 --- a/REU2017/app/src/main/java/Localization/structs/SendLocalizationData.java +++ /dev/null @@ -1,111 +0,0 @@ -package Localization.structs; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigInteger; -import java.util.List; - -import Localization.LOCALIZATION_SCHEME; -import edu.fiu.adwise.homomorphic_encryption.dgk.DGKPublicKey; -import edu.fiu.adwise.homomorphic_encryption.elgamal.ElGamalPublicKey; -import edu.fiu.adwise.homomorphic_encryption.elgamal.ElGamal_Ciphertext; -import edu.fiu.adwise.homomorphic_encryption.paillier.PaillierPublicKey; - -public class SendLocalizationData implements Serializable { - //Localization Parameters - public final LOCALIZATION_SCHEME LOCALIZATION_SCHEME; - // PlainText Data - public final Integer [] RSS; - public final String [] APs; - // Secure Triple Data Paillier and DGK - public final BigInteger [] S2; - public final BigInteger [] S3_comp; - public final BigInteger S3; - // Secure Triple Data ElGamal - public final List e_S2; - public final List e_S3_comp; - public final ElGamal_Ciphertext e_S3; - @Serial - private static final long serialVersionUID = 201194517759072124L; - // Public Keys - public final ElGamalPublicKey e_pk; - public final DGKPublicKey pubKey; - public final PaillierPublicKey pk; - // Mode - public final boolean isREU2017; - // Phone data just in case it filtering by phone data - public final String [] phone_data; - // Also, now the tables are by map - public final String map; - // PlainText - - public SendLocalizationData(String [] APs, Integer [] RSS, DGKPublicKey pubKey, - LOCALIZATION_SCHEME local, boolean isREU2017, - String [] phone_data, String map) { - this.RSS = RSS; - this.APs = APs; - this.LOCALIZATION_SCHEME = local; - - this.S2 = null; - this.S3 = null; - this.S3_comp = null; - this.e_S2 = null; - this.e_S3 = null; - this.e_S3_comp = null; - - this.pubKey = pubKey; - this.pk = null; - this.e_pk = null; - this.isREU2017 = isREU2017; - this.phone_data = phone_data; - this.map = map; - } - - // Paillier, yes you need the DGK Key just in case you run comparison protocol! - public SendLocalizationData(String [] APs, BigInteger[] S2, BigInteger S3, - BigInteger [] S3_comp, PaillierPublicKey pk, - DGKPublicKey _pubKey, LOCALIZATION_SCHEME local, - boolean isREU2017, String [] phone_data, String map) { - this.RSS = null; - this.APs = APs; - this.S2 = S2; - this.S3 = S3; - this.S3_comp = S3_comp; - this.e_S2 = null; - this.e_S3 = null; - this.e_S3_comp = null; - - this.LOCALIZATION_SCHEME = local; - this.pubKey = _pubKey; - this.pk = pk; - this.e_pk = null; - this.isREU2017 = isREU2017; - this.phone_data = phone_data; - this.map = map; - } - - // DGK - public SendLocalizationData(String [] APs, BigInteger [] S2, - BigInteger S3, - BigInteger [] S3_comp, - DGKPublicKey pubKey, LOCALIZATION_SCHEME local, - boolean isREU2017, - String [] phone_data, String map) { - this.RSS = null; - this.APs = APs; - this.S2 = S2; - this.S3 = S3; - this.S3_comp = S3_comp; - this.e_S2 = null; - this.e_S3 = null; - this.e_S3_comp = null; - - this.LOCALIZATION_SCHEME = local; - this.pubKey = pubKey; - this.pk = null; - this.e_pk = null; - this.isREU2017 = isREU2017; - this.phone_data = phone_data; - this.map = map; - } -} \ No newline at end of file diff --git a/REU2017/app/src/main/java/Localization/structs/SendTrainingData.java b/REU2017/app/src/main/java/Localization/structs/SendTrainingData.java deleted file mode 100644 index 64b6b56..0000000 --- a/REU2017/app/src/main/java/Localization/structs/SendTrainingData.java +++ /dev/null @@ -1,50 +0,0 @@ -package Localization.structs; - -import androidx.annotation.NonNull; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Arrays; - -public class SendTrainingData implements Serializable { - private final String Map; - private final Double X_coordinate; - private final Double Y_coordinate; - private final String[] MACAddress; - private final Integer[] RSS; - private final String OS; - private final String Device; - private final String Model; - private final String Product; - @Serial - private static final long serialVersionUID = 3907495506938576258L; - - public SendTrainingData(String Map, Double x, Double y, String[] m, Integer[] in, - String OS, String Device, String Model, String Product) { - this.Map = Map; - // Coordinates - X_coordinate = x; - Y_coordinate = y; - - // (AP, RSS) - MACAddress = m; - RSS = in; - - // Phone Data - this.OS = OS; - this.Device = Device; - this.Model = Model; - this.Product = Product; - } - - @NonNull - public String toString() { - String train = ""; - train += Map + "\n"; - train += "(" + X_coordinate + ", " + Y_coordinate + ")\n"; - train += "OS=" + OS + ", DEVICE=" + Device + ", MODEL=" + Model + ", PRODUCT=" + Product + "\n"; - train += Arrays.toString(MACAddress) + '\n'; - train += Arrays.toString(RSS); - return train; - } -} diff --git a/REU2017/app/src/main/java/ui/AddMapActivity.java b/REU2017/app/src/main/java/ui/AddMapActivity.java index 1d44083..9302b1d 100644 --- a/REU2017/app/src/main/java/ui/AddMapActivity.java +++ b/REU2017/app/src/main/java/ui/AddMapActivity.java @@ -72,7 +72,7 @@ public void run() { byte [] encoded_image; try { - try (Socket ClientSocket = new Socket();) { + try (Socket ClientSocket = new Socket()) { ClientSocket.connect(new InetSocketAddress(SQLDatabase, portNumber), TIMEOUT); // Prepare I/O Stream diff --git a/REU2017/app/src/main/java/ui/LocalizeActivity.java b/REU2017/app/src/main/java/ui/LocalizeActivity.java index dbb1d0e..ac7f7b6 100644 --- a/REU2017/app/src/main/java/ui/LocalizeActivity.java +++ b/REU2017/app/src/main/java/ui/LocalizeActivity.java @@ -20,7 +20,7 @@ import com.github.chrisbanes.photoview.PhotoViewAttacher; import Localization.KeyMaster; -import Localization.LOCALIZATION_SCHEME; +import edu.fiu.adwise.fingerprint_localization.distance_computation.LOCALIZATION_SCHEME; import edu.fiu.reu2017.R; import Localization.background; import sensors.WifiReceiver; diff --git a/REU2017/app/src/main/java/ui/TrainActivity.java b/REU2017/app/src/main/java/ui/TrainActivity.java index 8ccbb9f..6b1ee65 100644 --- a/REU2017/app/src/main/java/ui/TrainActivity.java +++ b/REU2017/app/src/main/java/ui/TrainActivity.java @@ -23,7 +23,7 @@ import Localization.KeyMaster; import edu.fiu.reu2017.R; import sensors.WifiReceiver; -import Localization.structs.SendTrainingData; +import edu.fiu.adwise.fingerprint_localization.structs.SendTrainingData; import static android.graphics.Color.BLUE; import static ui.MainActivity.getDeviceName; diff --git a/REU2017/app/src/main/java/ui/test_connection.java b/REU2017/app/src/main/java/ui/test_connection.java index 1ab5955..4dfd56e 100644 --- a/REU2017/app/src/main/java/ui/test_connection.java +++ b/REU2017/app/src/main/java/ui/test_connection.java @@ -12,7 +12,7 @@ public class test_connection implements Runnable { boolean connected = false; public void run() { - try (Socket ClientSocket = new Socket()){ + try (Socket ClientSocket = new Socket()) { ClientSocket.connect(new InetSocketAddress(SQLDatabase, portNumber), TIMEOUT); ObjectOutputStream toServer = new ObjectOutputStream(ClientSocket.getOutputStream()); toServer.writeObject("Hello"); diff --git a/REU2017/build.gradle b/REU2017/build.gradle index 96efa21..1d5334a 100644 --- a/REU2017/build.gradle +++ b/REU2017/build.gradle @@ -7,7 +7,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.10.1' + classpath 'com.android.tools.build:gradle:8.11.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -19,7 +19,7 @@ allprojects { repositories { google() mavenCentral() - maven { url "https://jitpack.io" } + maven { url = "https://jitpack.io" } } configurations.configureEach { resolutionStrategy.eachDependency { details -> diff --git a/REU2017/gradle.properties b/REU2017/gradle.properties index 336247a..b40a1a0 100644 --- a/REU2017/gradle.properties +++ b/REU2017/gradle.properties @@ -14,4 +14,5 @@ org.gradle.jvmargs=-Xmx1536m android.useAndroidX=true android.enableJetifier=true android.nonTransitiveRClass=false -android.nonFinalResIds=false \ No newline at end of file +android.nonFinalResIds=false +org.gradle.configuration-cache=true \ No newline at end of file diff --git a/REU2017/gradle/wrapper/gradle-wrapper.properties b/REU2017/gradle/wrapper/gradle-wrapper.properties index cea7a79..37f853b 100644 --- a/REU2017/gradle/wrapper/gradle-wrapper.properties +++ b/REU2017/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/REUServer/README.md b/REUServer/README.md index cf2bc9d..8d09267 100644 --- a/REUServer/README.md +++ b/REUServer/README.md @@ -1,4 +1,5 @@ # Fingerprint-Based Indoor Localization Server +[![Test Android and Fingerprint Server](https://github.com/adwise-fiu/Secure_Indoor_Localization/actions/workflows/parallel_tests.yml/badge.svg?branch=main)](https://github.com/adwise-fiu/Secure_Indoor_Localization/actions/workflows/parallel_tests.yml) Please refer to this [document for MySql set-up](https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-22-04).