diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3c27361ca9b3d702c739e4f2075bcc23433b4ab8..e22f538de2625bc0a27fa34a10ee0024931cb444 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,4 +1,4 @@ -plugins { + plugins { id("com.android.application") } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 796e2d35fe9e842290dc3efd3c9bab66dc445d78..300ec68ebf27822bf61a15addb9f473f6d7ca437 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,11 +21,13 @@ android:supportsRtl="true" android:theme="@style/Theme.BuildingVisitor" tools:targetApi="33"> + <activity + android:name=".chooseDestination" + android:exported="false"/> <activity android:name=".VisitorActivity" android:exported="false" - android:screenOrientation="landscape" - /> + android:screenOrientation="landscape"/> <activity android:name=".chooseStart" android:exported="false"/> diff --git a/app/src/main/java/com/example/buildingvisitor/Data/AccessDijkstra.java b/app/src/main/java/com/example/buildingvisitor/Data/AccessDijkstra.java new file mode 100644 index 0000000000000000000000000000000000000000..1ccaf9fb3999dbef99969ef32329fccc061cac0c --- /dev/null +++ b/app/src/main/java/com/example/buildingvisitor/Data/AccessDijkstra.java @@ -0,0 +1,16 @@ +package com.example.buildingvisitor.Data; + +public class AccessDijkstra { + private Access access; + private int wall; + public AccessDijkstra(Access a,int w){ + this.access = a; + this.wall = w; + } + public Access getAccess(){ + return access; + } + public int getWall(){ + return wall; + } +} diff --git a/app/src/main/java/com/example/buildingvisitor/Data/Building.java b/app/src/main/java/com/example/buildingvisitor/Data/Building.java index 871f44c77283c4ced75be3e3efe60c959fce7f3f..9e925cc50ab5c3b4cb259071cd9d56ab26ea9287 100644 --- a/app/src/main/java/com/example/buildingvisitor/Data/Building.java +++ b/app/src/main/java/com/example/buildingvisitor/Data/Building.java @@ -1,7 +1,9 @@ package com.example.buildingvisitor.Data; +import android.content.Context; import android.util.Log; +import android.widget.Toast; import androidx.annotation.NonNull; import org.jetbrains.annotations.NotNull; import org.json.JSONArray; @@ -25,7 +27,10 @@ public class Building implements Iterable<Room> { private String uuid; private ArrayList<Room> workingRoom=new ArrayList<>(); private String location; - private ArrayList<Double> distance = new ArrayList<>(); + private ArrayList<Double> distance = new ArrayList<Double>(); + private ArrayList<Room> predecesseur = new ArrayList<>(); + private ArrayList<AccessDijkstra> accessList = new ArrayList<>(); + private int numeroEtape; public Building(String Name){ @@ -206,4 +211,119 @@ public class Building implements Iterable<Room> { } return null; } -} + + private void initialisation(Room s1){ + + distance.clear(); + predecesseur.clear(); + accessList.clear(); + numeroEtape =0; + int i = 0; + for(Room r:rooms){ + if(r!=s1) { + r.setNumDjisktra(i); + distance.add(Double.POSITIVE_INFINITY); + predecesseur.add(null); + i++; + } + } + distance.add((double) 0); + predecesseur.add(null); + s1.setNumDjisktra(i); + Log.i("building",distance.size()+""); + } + private Room findMin(ArrayList<Room> q){ + double mini = Double.POSITIVE_INFINITY; + Room s=null; + for (Room r:q){ + double distanceVal=distance.get(r.getNumDjisktra()); + if(distanceVal<mini){ + mini = distanceVal; + s=r; + } + } + return s; + } + private void levelUpdate(Room s1,Room s2){ + Double distanceS2 = distance.get(s2.getNumDjisktra()); + Double distanceS1 = distance.get(s1.getNumDjisktra()); + if(distanceS2>distanceS1+1){ + distance.set(s2.getNumDjisktra(),distanceS1+1); + predecesseur.set(s2.getNumDjisktra(),s1); + } + } + public boolean dijkstra(Room deb, Room fin) { + if(deb==fin){ + return false; + } + initialisation(deb); + ArrayList<Room> q = new ArrayList<>(rooms); + Room s1; + while (!q.isEmpty()) { + s1 = findMin(q); + q.remove(s1); + for (Room r : rooms) { + if (r != s1) { + for (Wall w : r) { + for (Access a : w) { + if (a.getRoom() == s1) { + levelUpdate(s1, r); + } + } + } + } + } + } + + if (distance.get(fin.getNumDjisktra()).isInfinite()) { + return false; + } + Room s = fin; + Room sallePredecesseur; + while (s != deb) { + sallePredecesseur = predecesseur.get(s.getNumDjisktra()); + boolean exist = false; + int i = 0; + for (Wall w : sallePredecesseur) { + + for (Access access : w) { + if (access.getRoom() == s) { + if(!exist) { + exist=true; + AccessDijkstra accessDijkstra = new AccessDijkstra(access,i); + accessList.add(0, accessDijkstra); + } + + } + + + } + i++; + Log.i("test",i+" au moment de l'ajout"); + } + s = sallePredecesseur; + } + return true; + } + public int check(Access a,Room deb,Room fin){ + if(deb==fin){ + return 2; + } + if(accessList.get(numeroEtape).getAccess()==a){ + if(++numeroEtape==accessList.size()){ + return 2; + } + return 1; + } + else{ + Log.i("FAIL","je recalcul"); + dijkstra(deb,fin); + } + return 0; + } + public Access getAccesStep(){ + return accessList.get(numeroEtape).getAccess(); + } + public int getWallStep(){return accessList.get(numeroEtape).getWall();} + } + diff --git a/app/src/main/java/com/example/buildingvisitor/VisitorActivity.java b/app/src/main/java/com/example/buildingvisitor/VisitorActivity.java index 0f520fe9863230837475520e2b9e292edd2d5f2b..4b963529f87b2bd67abb4a0b9e4e67db36042e64 100644 --- a/app/src/main/java/com/example/buildingvisitor/VisitorActivity.java +++ b/app/src/main/java/com/example/buildingvisitor/VisitorActivity.java @@ -1,6 +1,7 @@ package com.example.buildingvisitor; import android.annotation.SuppressLint; +import android.content.Intent; import android.graphics.*; import android.util.Log; import android.view.MotionEvent; @@ -9,13 +10,14 @@ import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; -import com.example.buildingvisitor.Data.Access; -import com.example.buildingvisitor.Data.BuildingManager; -import com.example.buildingvisitor.Data.Coordonéees; -import com.example.buildingvisitor.Data.Room; +import com.example.buildingvisitor.Data.*; import java.io.File; import java.io.FileInputStream; @@ -33,36 +35,75 @@ public class VisitorActivity extends AppCompatActivity { private Button murSud; private Button murOuest; private boolean debounce = true; + private boolean gps = false; + private Room destination; + private ActivityResultLauncher<Intent> destinationLauncher; + private Button gpsButton; + private TextView orientation; @SuppressLint("ClickableViewAccessibility") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_visitor); + orientation = findViewById(R.id.orientation); + orientation.setTextColor(Color.WHITE); + orientation.setText(getResources().getString(R.string.boutonNord)); surfaceVisit = findViewById(R.id.surfaceVisit); imageVisit = findViewById(R.id.ImageVisit); surfaceVisit.setZOrderOnTop(true); murNord = findViewById(R.id.murNord); murEst = findViewById(R.id.murEst); murSud = findViewById(R.id.murSud); + gpsButton = findViewById(R.id.gpsButton); murOuest = findViewById(R.id.murOuest); paint = new Paint(); paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(2); + paint.setStrokeWidth(4); paint.setColor(Color.RED); holder = surfaceVisit.getHolder(); holder.setFormat(PixelFormat.TRANSPARENT); + destinationLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result->{ + Building building = BuildingManager.getInstance().getCurrentBuilding(); + if(result.getResultCode()==RESULT_OK){ + destination = building.getLastWorkingRoom(); + building.cancelRoom(); + if(building.dijkstra(room,destination)){ + gps = true; + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 0){ + murNord.setBackgroundColor(Color.RED); + + } + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 1){ + murEst.setBackgroundColor(Color.RED); + } + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 2){ + murSud.setBackgroundColor(Color.RED); + } + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 3){ + murOuest.setBackgroundColor(Color.RED); + } + } + else{ + gps = false; + Toast.makeText(this,"pas de chemin entre ces deux pièces",Toast.LENGTH_LONG).show(); + } + + } + else{ + building.cancelRoom(); + gps=false; + } + }); + gpsButton.setOnClickListener((view)->{ + Intent intent = new Intent(this, chooseDestination.class); + BuildingManager.getInstance().getCurrentBuilding().addWorkingRoom(room); + destinationLauncher.launch(intent); + }); holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { - Canvas canvas = holder.lockCanvas(); - canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR); - for(Access a:BuildingManager.getInstance().getCurrentBuilding().getLastWorkingRoom().getWall(actualWall)){ - Coordonéees coordonéees = a.getCoordonéees(); - Rect rect = new Rect(coordonéees.getX(),coordonéees.getY(),coordonéees.getWidth(),coordonéees.getHeigth()); - canvas.drawRect(rect,paint); - } - holder.unlockCanvasAndPost(canvas); + drawAccess(); } @Override @@ -76,21 +117,25 @@ public class VisitorActivity extends AppCompatActivity { } }); murNord.setOnClickListener((view)->{ + orientation.setText(getResources().getString(R.string.boutonNord)); actualWall = 0; setupImageRoom(); drawAccess(); }); murEst.setOnClickListener((view)->{ + orientation.setText(getResources().getString(R.string.boutonEst)); actualWall = 1; setupImageRoom(); drawAccess(); }); murSud.setOnClickListener((view)->{ + orientation.setText(getResources().getString(R.string.boutonSud)); actualWall = 2; setupImageRoom(); drawAccess(); }); murOuest.setOnClickListener((view)->{ + orientation.setText(getResources().getString(R.string.boutonOuest)); actualWall = 3; setupImageRoom(); drawAccess(); @@ -110,9 +155,42 @@ public class VisitorActivity extends AppCompatActivity { Rect rect = new Rect(c.getX(),c.getY(),c.getWidth(),c.getHeigth()); if(rect.contains(x,y)){ room = a.getRoom(); + if(gps) { + //le parcours est fini + if(BuildingManager.getInstance().getCurrentBuilding().check(a,room,destination)==2){ + gps=false; + Toast.makeText(this,"vous etes arrivez",Toast.LENGTH_LONG).show(); + }else{ + + + } + + + } + Log.i("Visitor","je change de pièce"); } setupImageRoom(); + if(gps){ + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 0){ + murNord.setBackgroundColor(Color.RED); + } + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 1){ + murEst.setBackgroundColor(Color.RED); + } + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 2){ + murSud.setBackgroundColor(Color.RED); + } + if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 3){ + murOuest.setBackgroundColor(Color.RED); + } + } + else{ + murNord.setBackgroundColor(Color.argb(255,104,87,140)); + murSud.setBackgroundColor(Color.argb(255,104,87,140)); + murOuest.setBackgroundColor(Color.argb(255,104,87,140)); + murEst.setBackgroundColor(Color.argb(255,104,87,140)); + } drawAccess(); break; } @@ -140,8 +218,47 @@ public class VisitorActivity extends AppCompatActivity { for(Access a:room.getWall(actualWall)){ Coordonéees coordonéees = a.getCoordonéees(); Rect rect = new Rect(coordonéees.getX(),coordonéees.getY(),coordonéees.getWidth(),coordonéees.getHeigth()); + paint.setColor(Color.RED); + if(gps) { + + if (a == BuildingManager.getInstance().getCurrentBuilding().getAccesStep()) { + paint.setColor(Color.BLUE); + } else { + paint.setColor(Color.RED); + } + } + else{ + paint.setColor(Color.RED); + } canvas.drawRect(rect,paint); } holder.unlockCanvasAndPost(canvas); } + + @Override + protected void onResume() { + super.onResume(); + surfaceVisit = findViewById(R.id.surfaceVisit); + holder = surfaceVisit.getHolder(); + Canvas canvas = holder.lockCanvas(); + if (canvas != null) { + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + for (Access a : room.getWall(actualWall)) { + Coordonéees coordonéees = a.getCoordonéees(); + Rect rect = new Rect(coordonéees.getX(), coordonéees.getY(), coordonéees.getWidth(), coordonéees.getHeigth()); + paint.setColor(Color.RED); + if (gps) { + if (a == BuildingManager.getInstance().getCurrentBuilding().getAccesStep()) { + paint.setColor(Color.BLUE); + } else { + paint.setColor(Color.RED); + } + } else { + paint.setColor(Color.RED); + } + canvas.drawRect(rect, paint); + } + holder.unlockCanvasAndPost(canvas); + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/buildingvisitor/chooseDestination.java b/app/src/main/java/com/example/buildingvisitor/chooseDestination.java new file mode 100644 index 0000000000000000000000000000000000000000..df363bdd31269c3782ce9cbcb4d1a5aca7142038 --- /dev/null +++ b/app/src/main/java/com/example/buildingvisitor/chooseDestination.java @@ -0,0 +1,71 @@ +package com.example.buildingvisitor; + +import android.content.Intent; +import android.graphics.Color; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import android.os.Bundle; +import com.example.buildingvisitor.Data.BuildingManager; +import com.example.buildingvisitor.Data.Room; + +import java.util.ArrayList; + +public class chooseDestination extends AppCompatActivity { + + private ListView listRoom; + private ArrayAdapter<Room> adapter; + private ArrayList<Room> rooms; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choose_start); + rooms = new ArrayList<>(); + setupList(); + adapter = new ArrayAdapter<Room>(this, android.R.layout.simple_list_item_2, android.R.id.text2, rooms) { + public View getView(int position, View convertView, ViewGroup parent) { + View view = super.getView(position, convertView, parent); + TextView text = view.findViewById(android.R.id.text2); + text.setTextColor(Color.WHITE); + text.setText(rooms.get(position).getName()); + return view; + } + + }; + listRoom = findViewById(R.id.listRoom); + + listRoom.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + Log.i("choose",rooms.get(position).getName()); + Log.i("position", String.valueOf(position)); + BuildingManager.getInstance().getCurrentBuilding().addWorkingRoom(rooms.get(position)); + + setResult(RESULT_OK); + finish(); + + } + }); + listRoom.setAdapter(adapter); + } + + /* private void launchVisit() { + Intent intent = new Intent(this,VisitorActivity.class); + startActivity(intent); + }*/ + + private void setupList() { + rooms.clear();; + for(Room r: BuildingManager.getInstance().getCurrentBuilding()){ + if(r!=BuildingManager.getInstance().getCurrentBuilding().getLastWorkingRoom()) { + rooms.add(r); + Log.i("roomName",r.getName()); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/buildingvisitor/chooseStart.java b/app/src/main/java/com/example/buildingvisitor/chooseStart.java index 406649b55e6094498a5047fd536f91a6df65ec7b..63728b4d98ac68ce5994d50c8a0d80c3b53d1a9a 100644 --- a/app/src/main/java/com/example/buildingvisitor/chooseStart.java +++ b/app/src/main/java/com/example/buildingvisitor/chooseStart.java @@ -1,6 +1,7 @@ package com.example.buildingvisitor; import android.content.Intent; +import android.graphics.Color; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -30,6 +31,7 @@ public class chooseStart extends AppCompatActivity { public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView text = view.findViewById(android.R.id.text2); + text.setTextColor(Color.WHITE); text.setText(rooms.get(position).getName()); return view; } diff --git a/app/src/main/res/layout/activity_choose_destination.xml b/app/src/main/res/layout/activity_choose_destination.xml new file mode 100644 index 0000000000000000000000000000000000000000..b93a95cf36f4c6ac9a6d53af45caad8c1f9d9892 --- /dev/null +++ b/app/src/main/res/layout/activity_choose_destination.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".chooseDestination"> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_find_file.xml b/app/src/main/res/layout/activity_find_file.xml index e711a77640da7ffc7ac068ab7e9dc6bee9a6b20b..401d1fcb927e4b9cbc6e630fd90856f5fc8fd6cb 100644 --- a/app/src/main/res/layout/activity_find_file.xml +++ b/app/src/main/res/layout/activity_find_file.xml @@ -13,8 +13,9 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="250dp" android:id="@+id/ListFile"/> <TextView - android:text="TextView" + android:text="Choissisez votre batiment" android:layout_width="163dp" - android:layout_height="39dp" android:id="@+id/textView3" tools:layout_editor_absoluteY="55dp" - tools:layout_editor_absoluteX="140dp"/> + android:layout_height="39dp" android:id="@+id/textView3" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="100dp"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8d294d3881df1dffd3f2d6bca79e25609d083c95..e983d7f6002aa2bf2bb0daf9ea11e2c100248d61 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,7 +16,7 @@ android:text="BuildingVisitor" android:layout_width="324dp" android:layout_height="69dp" android:id="@+id/textView" - android:textSize="50dp" app:layout_constraintTop_toTopOf="parent" + android:textSize="40dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="60dp" android:textColor="#FFFFFF"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_visitor.xml b/app/src/main/res/layout/activity_visitor.xml index e63cb1e35c2c3d8d60b6977999bf959cb00b423b..30ef83f8ad8f375cc0ab678ad579d7b392fbad8e 100644 --- a/app/src/main/res/layout/activity_visitor.xml +++ b/app/src/main/res/layout/activity_visitor.xml @@ -12,8 +12,8 @@ android:layout_width="37dp" android:layout_height="48dp" android:id="@+id/murNord" app:layout_constraintTop_toTopOf="parent" - android:layout_marginTop="150dp" app:layout_constraintStart_toStartOf="parent" - android:layout_marginStart="60dp" app:layout_constraintEnd_toStartOf="@+id/frameLayout" + android:layout_marginTop="160dp" app:layout_constraintStart_toStartOf="parent" + android:layout_marginStart="65dp" app:layout_constraintEnd_toStartOf="@+id/frameLayout" android:layout_marginEnd="40dp"/> <Button android:text="@string/boutonEst" @@ -87,4 +87,18 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/surfaceVisit"/> </FrameLayout> + <Button + android:text="GPS" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:id="@+id/gpsButton" + app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="20dp" + app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="50dp"/> + <TextView + android:text="TextView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:id="@+id/orientation" + app:layout_constraintTop_toTopOf="parent" + android:layout_marginTop="45dp" android:layout_marginStart="70dp" + android:textSize="32dp" + app:layout_constraintStart_toEndOf="@+id/gpsButton"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file