diff --git a/app/src/main/java/com/example/myhabitat/CreationOuvertureActivity.java b/app/src/main/java/com/example/myhabitat/CreationOuvertureActivity.java index 7f98e2711f12a62ca8eb7098dccb18dcbf50c918..7746846c35a21b81f6edbc2d8b720ea23bbde129 100644 --- a/app/src/main/java/com/example/myhabitat/CreationOuvertureActivity.java +++ b/app/src/main/java/com/example/myhabitat/CreationOuvertureActivity.java @@ -286,8 +286,11 @@ public class CreationOuvertureActivity extends AppCompatActivity{ public void confirmer(View view) { Ouverture ouverture = new Ouverture(pieceDepart.getMurOrientation(orientationPieceDepart), pieceArrivee.getMurOrientation(orientationPieceArrivee), rectDepart, rectArrivee); habitat.addOuverture(ouverture); + //On re-set correctement les murs (pas besoin finalemnt...) + Log.i("testGetMur2", ouverture.getMurDepart().getPiece()+""); + Log.i("testGetMur2", ouverture.getMurArrivee().getPiece()+""); + enregistrement(); - Log.i("testOuverture", String.valueOf(habitat.toJSON())); } public void enregistrement(){ diff --git a/app/src/main/java/com/example/myhabitat/ModeImmersionActivity.java b/app/src/main/java/com/example/myhabitat/ModeImmersionActivity.java index 6c696efbd132bed2115337dc8d6fef44d0d6b0ea..50b8a237433b4a94c8c6b5e0dee49cbb33698de1 100644 --- a/app/src/main/java/com/example/myhabitat/ModeImmersionActivity.java +++ b/app/src/main/java/com/example/myhabitat/ModeImmersionActivity.java @@ -2,39 +2,41 @@ package com.example.myhabitat; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; +import android.graphics.*; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; +import android.view.*; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; +import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; -import habitat.Habitat; -import habitat.Mur; -import habitat.Orientation; -import habitat.Piece; +import habitat.*; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; public class ModeImmersionActivity extends AppCompatActivity implements SensorEventListener { Habitat habitat; Mur murEnCours; Piece pieceEnCours; + TextView textViewPiece; private SensorManager sensorManager; private ImageView imageViewBoussole; private float debut = 0; private ImageView imageViewMur; + private SurfaceView surfaceView; + private Paint myPaint; + private Canvas canvas; + private ArrayList<Rect> rectangles; + private HashMap<Rect, Piece> pieceArriveeRect; @Override protected void onCreate(Bundle savedInstanceState) { @@ -52,6 +54,9 @@ public class ModeImmersionActivity extends AppCompatActivity implements SensorEv setContentView(R.layout.activity_mode_immersion); + rectangles = new ArrayList<Rect>(); + pieceArriveeRect = new HashMap<Rect, Piece>(); + pieceEnCours = habitat.getPieces().get(0); affichePiece(pieceEnCours); imageViewBoussole = findViewById(R.id.imageViewBoussole); @@ -59,7 +64,40 @@ public class ModeImmersionActivity extends AppCompatActivity implements SensorEv sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); + surfaceView = findViewById(R.id.surfaceView); + surfaceView.setZOrderOnTop(true); + surfaceView.getHolder().setFormat(PixelFormat.TRANSPARENT); + + canvas = surfaceView.getHolder().lockCanvas(); + + myPaint = new Paint(); + myPaint.setStrokeWidth(5); + myPaint.setColor(Color.RED); + myPaint.setStyle(Paint.Style.STROKE); + + imageViewMur.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + boolean res = false; + Rect r = null; + int touchX = (int) event.getX(); + int touchY = (int) event.getY(); + for(Rect rect : rectangles){ + if(rect.contains(touchX,touchY)){ + res = true; + r = rect; + } + } + if(res && r!=null){ + Log.i("testTouchRect", "je touche rect="+r.toString()); + Log.i("testHM", pieceArriveeRect+""); + pieceEnCours = pieceArriveeRect.get(r); + afficheMur(); + } + return true; + } + }); } public boolean onCreateOptionsMenu(Menu menu) { @@ -85,9 +123,15 @@ public class ModeImmersionActivity extends AppCompatActivity implements SensorEv public void affichePiece(Piece piece){ pieceEnCours = piece; - ImageView imageViewMur = findViewById(R.id.imageViewMur); + imageViewMur = findViewById(R.id.imageViewMur); murEnCours = piece.getMurs().get(0); + afficheMur(); + } + + public void afficheMur(){ + textViewPiece = findViewById(R.id.textViewPiece); + textViewPiece.setText("piece="+pieceEnCours.getNom()); //On récupère la photo FileInputStream fis = null; try { @@ -99,25 +143,60 @@ public class ModeImmersionActivity extends AppCompatActivity implements SensorEv Bitmap bm = BitmapFactory.decodeStream(fis); imageViewMur.setImageBitmap(bm); }else{ - Log.i("testDrawable", "pas de photo"); + //Log.i("testDrawable", "pas de photo"); imageViewMur.setImageDrawable(getDrawable(R.drawable.imagemur)); } + afficheOuvertures(); } - public void afficheMur(){ - //On récupère la photo - FileInputStream fis = null; - try { - fis = openFileInput(murEnCours.getId()+".data"); - } catch (FileNotFoundException e) { - //throw new RuntimeException(e); - } - if (fis != null) { - Bitmap bm = BitmapFactory.decodeStream(fis); - imageViewMur.setImageBitmap(bm); + public void afficheOuvertures(){ + ArrayList<Ouverture> ouvertures = habitat.getOuvertureDeMur(murEnCours); + Log.i("testOuvertures", ouvertures+""); + rectangles.clear(); + pieceArriveeRect.clear(); + + if(ouvertures.isEmpty()){ + //Il n'y a pas d'ouvertures à afficher + try { + canvas = surfaceView.getHolder().lockCanvas(); + synchronized (surfaceView.getHolder()) { + canvas.drawColor(0, PorterDuff.Mode.CLEAR); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (canvas != null) { + surfaceView.getHolder().unlockCanvasAndPost(canvas); + } + } }else{ - Log.i("testDrawable", "pas de photo"); - imageViewMur.setImageDrawable(getDrawable(R.drawable.imagemur)); + for(Ouverture ouverture : ouvertures) { + //Si mur de depart + if (murEnCours.getId() == ouverture.getMurDepart().getId()) { + rectangles.add(ouverture.getRectDepart()); + Log.i("testGetPiece", ouverture.getMurArrivee()+""); + pieceArriveeRect.put(ouverture.getRectDepart(), ouverture.getMurArrivee().getPiece()); + } else { + //Si mur d'arrivee + rectangles.add(ouverture.getRectArrivee()); + pieceArriveeRect.put(ouverture.getRectArrivee(), ouverture.getMurDepart().getPiece()); + } + } + try { + canvas = surfaceView.getHolder().lockCanvas(); + synchronized (surfaceView.getHolder()) { + for(Rect rect : rectangles){ + canvas.drawRect(rect, myPaint); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (canvas != null) { + surfaceView.getHolder().unlockCanvasAndPost(canvas); + } + } + } } @@ -140,16 +219,20 @@ public class ModeImmersionActivity extends AppCompatActivity implements SensorEv imageViewBoussole.startAnimation(rotateAnimation); + Mur newMur = null; if(angle<(-45) && angle>=(-135)){ - murEnCours = pieceEnCours.getMurOrientation(Orientation.EST); + newMur = pieceEnCours.getMurOrientation(Orientation.EST); } else if (angle<(-135) && angle>=(-225)) { - murEnCours = pieceEnCours.getMurOrientation(Orientation.SUD); + newMur = pieceEnCours.getMurOrientation(Orientation.SUD); } else if (angle<(-225) && angle>=(-315)) { - murEnCours = pieceEnCours.getMurOrientation(Orientation.OUEST); + newMur = pieceEnCours.getMurOrientation(Orientation.OUEST); }else{ - murEnCours = pieceEnCours.getMurOrientation(Orientation.NORD); + newMur = pieceEnCours.getMurOrientation(Orientation.NORD); + } + if(newMur != murEnCours){ + murEnCours = newMur; + afficheMur(); } - afficheMur(); //Maj de l'angle de depart diff --git a/app/src/main/java/habitat/Habitat.java b/app/src/main/java/habitat/Habitat.java index 84512537b39cf5f7d89923f6ea427b09bb4e552b..31574e6564821a6307ed6339ed3623565339b178 100644 --- a/app/src/main/java/habitat/Habitat.java +++ b/app/src/main/java/habitat/Habitat.java @@ -1,5 +1,6 @@ package habitat; +import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; import org.json.JSONArray; @@ -93,6 +94,16 @@ public class Habitat implements Parcelable { public void addOuverture(Ouverture ouverture){ ouvertures.add(ouverture); + for(Piece piece : pieces){ + for(Mur mur : piece.getMurs()){ + if(ouverture.getMurDepart().getId() == mur.getId()){ + ouverture.setMurDepart(mur); + } + if(ouverture.getMurArrivee().getId() == mur.getId()){ + ouverture.setMurArrivee(mur); + } + } + } } public void removeOuverture(Ouverture ouverture){ @@ -101,6 +112,15 @@ public class Habitat implements Parcelable { public void removePiece(Piece piece){ pieces.remove(piece); + //On vérifie qu'il n'existe pas d'ouvertures + for(Mur mur : piece.getMurs()){ + ArrayList<Ouverture> ouvertureArrayList = getOuvertureDeMur(mur); + if(!ouvertureArrayList.isEmpty()){ + for(Ouverture ouverture : ouvertureArrayList){ + removeOuverture(ouverture); + } + } + } } public JSONObject toJSON(){ @@ -137,4 +157,26 @@ public class Habitat implements Parcelable { public int hashCode() { return Objects.hash(pieces, ouvertures); } + + public ArrayList<Ouverture> getOuvertureDeMur(Mur mur){ + ArrayList<Ouverture> ouvertureArrayList = new ArrayList<Ouverture>(); + for(Ouverture ouverture : ouvertures){ + if(ouverture.getMurDepart().getId() == (mur.getId()) || ouverture.getMurArrivee().getId() == (mur.getId())){ + ouvertureArrayList.add(ouverture); + } + } + for(Ouverture ouverture : ouvertureArrayList) { + for (Piece piece : pieces) { + for (Mur mur1 : piece.getMurs()) { + if (ouverture.getMurDepart().getId() == mur1.getId()) { + ouverture.setMurDepart(mur1); + } + if (ouverture.getMurArrivee().getId() == mur1.getId()) { + ouverture.setMurArrivee(mur1); + } + } + } + } + return ouvertureArrayList; + } } diff --git a/app/src/main/java/habitat/Mur.java b/app/src/main/java/habitat/Mur.java index af1909db99d6002c8b40f2f6e0554e35225c3d15..793646545979ffafd2c163bab5c5160a5874850c 100644 --- a/app/src/main/java/habitat/Mur.java +++ b/app/src/main/java/habitat/Mur.java @@ -15,12 +15,6 @@ public class Mur implements Parcelable { private Orientation orientation; private int id; //Utile pour stocker la photo associée au mur - public Mur(Piece piece) { - this.piece = piece; - this.orientation = Orientation.SUD; //Par défaut - id = FabriqueId.getInstance().getId(); - } - public Mur(Piece piece, Orientation orientation) { this.piece = piece; this.orientation = orientation; @@ -56,6 +50,7 @@ public class Mur implements Parcelable { protected Mur(Parcel in) { orientation = (Orientation) in.readSerializable(); id = in.readInt(); + piece = new Piece(""); } public static final Creator<Mur> CREATOR = new Creator<Mur>() { @@ -100,6 +95,7 @@ public class Mur implements Parcelable { sb.append("Mur{id=").append(id).append(";"); sb.append("orientation="); sb.append(orientation); + sb.append(";piece=").append(piece.getNom()); sb.append("}"); return sb.toString(); } @@ -120,6 +116,7 @@ public class Mur implements Parcelable { try { jsonObject.put("Orientation", orientation); jsonObject.put("Id", id); + } catch (JSONException e) { throw new RuntimeException(e); } diff --git a/app/src/main/java/habitat/Piece.java b/app/src/main/java/habitat/Piece.java index ecfd4f9a484c50395c6afba7972a16f8c35acf46..c9a5c8d9a8e5815cf0f071a276c708b7ee21f7dc 100644 --- a/app/src/main/java/habitat/Piece.java +++ b/app/src/main/java/habitat/Piece.java @@ -2,6 +2,7 @@ package habitat; import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -33,6 +34,7 @@ public class Piece implements Parcelable { for(int j=0; j<4; j++){ JSONObject Jmur = Jmurs.getJSONObject(j); Mur mur = new Mur(Jmur); + mur.setPiece(this); addMur(mur); } } catch (JSONException e) { diff --git a/app/src/main/res/layout/activity_mode_immersion.xml b/app/src/main/res/layout/activity_mode_immersion.xml index c99fa40f689ec92a8c1d8764441ae559d1471a7f..fa8eabe31903f05e3ed2f524cd591458ea620728 100644 --- a/app/src/main/res/layout/activity_mode_immersion.xml +++ b/app/src/main/res/layout/activity_mode_immersion.xml @@ -8,8 +8,8 @@ tools:context=".ModeImmersionActivity"> <ImageView - android:layout_width="308dp" - android:layout_height="305dp" + android:layout_width="414dp" + android:layout_height="355dp" app:srcCompat="@drawable/imagemur" android:id="@+id/imageViewMur" app:layout_constraintTop_toTopOf="parent" @@ -30,4 +30,24 @@ app:layout_constraintStart_toStartOf="parent" android:layout_marginBottom="117dp" app:layout_constraintBottom_toTopOf="@+id/imageViewMur"/> + + <SurfaceView + android:layout_width="414dp" + android:layout_height="355dp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintHorizontal_bias="0.495" + app:layout_constraintVertical_bias="0.69" + android:id="@+id/surfaceView"/> + + <TextView + android:text="TextView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/textViewPiece" + tools:layout_editor_absoluteX="176dp" + app:layout_constraintTop_toBottomOf="@+id/imageViewMur" + app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file