diff --git a/app/src/main/java/fr/ul/projet/AccesActivity.java b/app/src/main/java/fr/ul/projet/AccesActivity.java index d873063efa043c4e791cec3218ad22e9c3fceb58..e95f7672d7b332ee6cf0f3e7f9131437e9ba6915 100644 --- a/app/src/main/java/fr/ul/projet/AccesActivity.java +++ b/app/src/main/java/fr/ul/projet/AccesActivity.java @@ -1,42 +1,38 @@ package fr.ul.projet; -import android.content.DialogInterface; import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; import android.net.Uri; import android.os.Bundle; -import android.os.Environment; -import android.os.SystemClock; -import android.provider.MediaStore; -import android.util.Log; import android.view.View; import android.widget.Button; -import android.widget.EditText; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; -import android.widget.Toast; +import android.content.ContentResolver; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import java.io.InputStream; import androidx.activity.EdgeToEdge; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.FileProvider; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; +import fr.ul.projet.modele.Acces; import fr.ul.projet.modele.Modele; import fr.ul.projet.modele.Piece; +import fr.ul.projet.outils.GestionImage; public class AccesActivity extends AppCompatActivity { @@ -47,6 +43,11 @@ public class AccesActivity extends AppCompatActivity { private int idDest; private Uri photo; + private ImageView imageView; + private DrawingView drawingView; + private boolean isDrawingEnabled = false; + + private ActivityResultLauncher<Intent> launcher; @@ -57,6 +58,7 @@ public class AccesActivity extends AppCompatActivity { EdgeToEdge.enable(this); setContentView(R.layout.activity_acces); + this.modele = getIntent().getParcelableExtra("modele"); this.piece = this.modele.getPieceCourante(); this.photo = getIntent().getParcelableExtra("photo"); @@ -64,33 +66,81 @@ public class AccesActivity extends AppCompatActivity { this.directionDest = getIntent().getExtras().getString("directionDest"); this.idDest = getIntent().getExtras().getInt("pieceDest"); + ContentResolver resolver = this.getContentResolver(); + InputStream inputStream = null; + try{ + inputStream = resolver.openInputStream(this.photo); + }catch (Exception e){ + + } + Bitmap image = BitmapFactory.decodeStream(inputStream); TextView textView = findViewById(R.id.textView2); textView.setText(getString(R.string.acces, this.modele.getNom(), this.piece.getNom(), direction)); - DrawableImageView imageView = findViewById(R.id.imageView); - imageView.setImageURI(photo); + this.imageView = findViewById(R.id.imageView); + this.drawingView = findViewById(R.id.drawingView); + this.drawingView.setImageBitmap(image); + this.imageView.post(()->{ + Bitmap originalBitmap = GestionImage.getBitmapFromUri(this, photo); + Bitmap resizedBitmap = GestionImage.getResizedBitmap(originalBitmap, imageView); + imageView.setImageBitmap(resizedBitmap); + drawingView.setImageBitmap(resizedBitmap); + }); + + for (Acces a : this.modele.getPieceCourante().getAcces().values()){ + if (a.getDestination().getId() == this.idDest){ + switch (this.directionDest){ + case "Nord": + if (a.getDestination().getPhotoNord() != null){ + this.drawingView.addRectangleFromCoords(a.getXCoinHautGauche(), a.getYCoinHautGauche(), a.getXCoinBasDroite(), a.getYCoinBasDroite()); + } + break; + case "Sud": + if (a.getDestination().getPhotoSud() != null){ + this.drawingView.addRectangleFromCoords(a.getXCoinHautGauche(), a.getYCoinHautGauche(), a.getXCoinBasDroite(), a.getYCoinBasDroite()); + } + break; + case "Est": + if (a.getDestination().getPhotoEst() != null){ + this.drawingView.addRectangleFromCoords(a.getXCoinHautGauche(), a.getYCoinHautGauche(), a.getXCoinBasDroite(), a.getYCoinBasDroite()); + } + break; + + case "Ouest": + if (a.getDestination().getPhotoOuest() != null){ + this.drawingView.addRectangleFromCoords(a.getXCoinHautGauche(), a.getYCoinHautGauche(), a.getXCoinBasDroite(), a.getYCoinBasDroite()); + } + break; + } + } + } + + this.drawingView.setOnRectangleDrawnListener((startX, startY, endX, endY) -> { + this.modele.ajouterAcces(this.modele.getPieces().get(this.idDest), startX, startY, endX, endY); + }); Button ajouter = findViewById(R.id.boutonAcces); ajouter.setOnClickListener(v -> { - imageView.setDrawing(this.idDest); + drawingView.enableDrawing(true); }); + Button supprimer = findViewById(R.id.suppAcces); - imageView.setOnRectangleClickListener(new DrawableImageView.OnRectangleClickListener() { - @Override - public void onRectangleClick(int rectangleId) { - AccesActivity.this.modele.setPieceCourante(AccesActivity.this.modele.getPieces().get(rectangleId)); - Intent intent = new Intent(AccesActivity.this, PieceActivity.class); - intent.putExtra("modele", modele); - launcher.launch(intent); - //Toast.makeText(AccesActivity.this, getString(R.string.destAcces, AccesActivity.this.modele.getPieces().get(rectangleId).getNom()) , Toast.LENGTH_SHORT).show(); + supprimer.setOnClickListener(v -> { + for (Acces a : this.modele.getPieceCourante().getAcces().values()){ + if (a.getDestination().getId() == this.idDest){ + this.modele.supprimerAcces(a.getId()); + } } + + drawingView.clear(); }); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.acces), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); @@ -110,6 +160,7 @@ public class AccesActivity extends AppCompatActivity { } + public void quit(View v){ Intent res = new Intent(AccesActivity.this, MainActivity.class); launcher.launch(res); diff --git a/app/src/main/java/fr/ul/projet/DrawableImageView.java b/app/src/main/java/fr/ul/projet/DrawableImageView.java deleted file mode 100644 index f29ef99ca728194e5881bc40ecb04d5c8716225a..0000000000000000000000000000000000000000 --- a/app/src/main/java/fr/ul/projet/DrawableImageView.java +++ /dev/null @@ -1,137 +0,0 @@ -package fr.ul.projet; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.view.MotionEvent; - - -import androidx.appcompat.widget.AppCompatImageView; - -import java.util.HashMap; - - -public class DrawableImageView extends AppCompatImageView { - - private Paint paint; - private HashMap<Integer,RectF> rectangles = new HashMap<>(); - private HashMap<Integer,RectF> rectanglesTemp = new HashMap<>(); - private float startX, startY, endX, endY; - private boolean isDrawingFinished = false; - private boolean fixed = false; - private boolean drawing = false; - private int id; - - private OnRectangleClickListener listener; - - public DrawableImageView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public DrawableImageView(Context context) { - super(context); - init(); - } - - private void init() { - paint = new Paint(); - paint.setColor(Color.RED); - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(5); - } - - @Override - public boolean performClick() { - super.performClick(); // Appeler la méthode de la superclasse pour marquer le clic - return true; - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - for (RectF rect : rectangles.values()) { - canvas.drawRect(rect, paint); - } - for (RectF rect : rectanglesTemp.values()) { - canvas.drawRect(rect, paint); - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - - if (isDrawingFinished){ - // Vérifier si l'utilisateur a cliqué sur un rectangle existant - for (Integer key : rectangles.keySet()) { - RectF rect = rectangles.get(key); - if (rect.contains(event.getX(), event.getY())) { - performClick(); - if (listener != null) { - listener.onRectangleClick(key); // Passer l'ID du rectangle cliqué - - } - - return true; // Clic détecté, on arrête l'événement - } - } - return false; - } - if (!drawing){ - return false; - } - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - startX = event.getX(); - startY = event.getY(); - isDrawingFinished = false; - return true; - - case MotionEvent.ACTION_MOVE: - if (!fixed) { - endX = event.getX(); - endY = event.getY(); - // Mettre à jour un rectangle temporaire en cours de dessin - rectanglesTemp.put(-1, new RectF( - Math.min(startX, endX), Math.min(startY, endY), - Math.max(startX, endX), Math.max(startY, endY) - )); - invalidate(); - } - return true; - - case MotionEvent.ACTION_UP: - if (!fixed) { - RectF rect = new RectF( - Math.min(startX, endX), Math.min(startY, endY), - Math.max(startX, endX), Math.max(startY, endY) - ); - rectangles.put(this.id, rect); - rectanglesTemp.clear(); - fixed = true; - drawing=false; - isDrawingFinished=true; - invalidate(); - } - return true; - } - return false; - } - - public void setDrawing(int idDest){ - drawing = true; - id = idDest; - } - - public void setOnRectangleClickListener(OnRectangleClickListener listener) { - this.listener = listener; - } - - public interface OnRectangleClickListener { - void onRectangleClick(int rectangleId); - } -} diff --git a/app/src/main/java/fr/ul/projet/DrawingView.java b/app/src/main/java/fr/ul/projet/DrawingView.java new file mode 100644 index 0000000000000000000000000000000000000000..e6484b81f8356bedb8e419cff29958183a1c4601 --- /dev/null +++ b/app/src/main/java/fr/ul/projet/DrawingView.java @@ -0,0 +1,154 @@ +package fr.ul.projet; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import java.util.ArrayList; +import java.util.List; + +public class DrawingView extends View { + private Path drawPath; + private OnRectangleDrawnListener rectangleDrawnListener; + + private Paint drawPaint; + private Bitmap canvasBitmap, backgroundBitmap; + private Canvas drawCanvas; + private float startX, startY, endX, endY; + private boolean isDrawing = false; + private boolean isDrawingEnabled = false; + private List<RectF> rectangles = new ArrayList<>(); + + public interface OnRectangleDrawnListener { + void onRectangleDrawn(float startX, float startY, float endX, float endY); + } + + public void setOnRectangleDrawnListener(OnRectangleDrawnListener listener) { + this.rectangleDrawnListener = listener; + } + + public DrawingView(Context context, AttributeSet attrs) { + super(context, attrs); + setupDrawing(); + } + + private void setupDrawing() { + drawPath = new Path(); + drawPaint = new Paint(); + drawPaint.setColor(Color.RED); // Couleur du trait + drawPaint.setAntiAlias(true); + drawPaint.setStrokeWidth(10); + drawPaint.setStyle(Paint.Style.STROKE); + } + + public void enableDrawing(boolean enable) { + isDrawingEnabled = enable; + } + + public void setImageBitmap(Bitmap bitmap) { + backgroundBitmap = bitmap; + canvasBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); + drawCanvas = new Canvas(canvasBitmap); + drawCanvas.drawBitmap(backgroundBitmap, 0, 0, null); + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (canvasBitmap != null) { + canvas.drawBitmap(canvasBitmap, 0, 0, null); + for (RectF rect : rectangles) { + canvas.drawRect(rect, drawPaint); + } + + // Dessiner le rectangle en cours de tracé + if (isDrawing) { + canvas.drawRect(new RectF(startX, startY, endX, endY), drawPaint); + } + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + + float touchX = event.getX(); + float touchY = event.getY(); + + if (!isDrawingEnabled){ + for (RectF rect : rectangles) { + if (rect.contains(touchX, touchY)) { + onRectangleClicked(rect); + return true; + } + } + return false; + } + + + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + startX = touchX; + startY = touchY; + isDrawing = true; + break; + case MotionEvent.ACTION_MOVE: + endX = touchX; + endY = touchY; + invalidate(); // Mettre à jour l'affichage + break; + case MotionEvent.ACTION_UP: + isDrawing = false; + RectF newRect = new RectF(startX, startY, endX, endY); + rectangles.add(newRect); // ✅ Ajouter le rectangle à la liste + drawCanvas.drawRect(newRect, drawPaint); + invalidate(); + isDrawingEnabled = false;// Mettre à jour l'affichage + + if (rectangleDrawnListener != null) { + rectangleDrawnListener.onRectangleDrawn(startX, startY, endX, endY); + } + break; + } + return true; + } + + public Bitmap getDrawing() { + return canvasBitmap; + } + + public Bitmap getFinalBitmap() { + Bitmap resultBitmap = Bitmap.createBitmap(backgroundBitmap.getWidth(), backgroundBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(resultBitmap); + canvas.drawBitmap(backgroundBitmap, 0, 0, null); + canvas.drawBitmap(canvasBitmap, 0, 0, null); + return resultBitmap; + } + + private void onRectangleClicked(RectF rect) { + System.out.println("Rectangle cliqué : " + rect); + } + + public void addRectangleFromCoords(float startX, float startY, float endX, float endY) { + RectF rect = new RectF(startX, startY, endX, endY); + rectangles.add(rect); + drawCanvas.drawRect(rect, drawPaint); + invalidate(); + } + + public void clear(){ + rectangles.clear(); + drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + invalidate(); + } + +} diff --git a/app/src/main/java/fr/ul/projet/ModeleActivity.java b/app/src/main/java/fr/ul/projet/ModeleActivity.java index 8adb021b68ca85ebda0808e2992f92f2afed9055..b85d915aa2523be1ff35621dd1333816e487f47c 100644 --- a/app/src/main/java/fr/ul/projet/ModeleActivity.java +++ b/app/src/main/java/fr/ul/projet/ModeleActivity.java @@ -49,6 +49,10 @@ public class ModeleActivity extends AppCompatActivity { TextView textView = findViewById(R.id.textView); textView.setText(this.modele.getNom()); + if (this.getIntent().getExtras().getInt("supp") == 1){ + this.modele.supprimerPiece(this.modele.getPieceCourante().getId()); + } + afficherPieces(); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.create), (v, insets) -> { @@ -63,6 +67,7 @@ public class ModeleActivity extends AppCompatActivity { new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result){ + } } ); diff --git a/app/src/main/java/fr/ul/projet/PieceActivity.java b/app/src/main/java/fr/ul/projet/PieceActivity.java index 8178da2720e6a98248be5d4d7660d0a9be85f9ed..a49b72049b3c3772009bfa9b97557902cd030f71 100644 --- a/app/src/main/java/fr/ul/projet/PieceActivity.java +++ b/app/src/main/java/fr/ul/projet/PieceActivity.java @@ -111,6 +111,13 @@ public class PieceActivity extends AppCompatActivity { this.modele = getIntent().getParcelableExtra("modele"); this.piece = this.modele.getPieceCourante(); + Button suppPiece = findViewById(R.id.suppPiece); + suppPiece.setOnClickListener(v->{ + Intent intent = new Intent(PieceActivity.this, ModeleActivity.class); + intent.putExtra("modele", this.modele); + intent.putExtra("supp", 1); + launcher.launch(intent); + }); diff --git a/app/src/main/java/fr/ul/projet/modele/Acces.java b/app/src/main/java/fr/ul/projet/modele/Acces.java index 487394387f073372353f23768c71f029efb45c30..6c0149a27cab7a4a2d6a6268226e2ce02486f494 100644 --- a/app/src/main/java/fr/ul/projet/modele/Acces.java +++ b/app/src/main/java/fr/ul/projet/modele/Acces.java @@ -3,6 +3,9 @@ package fr.ul.projet.modele; import android.os.Parcel; import android.os.Parcelable; +import org.json.JSONArray; +import org.json.JSONObject; + import java.util.Map; import fr.ul.projet.outils.FabriqueIdentifiant; @@ -10,11 +13,11 @@ import fr.ul.projet.outils.FabriqueIdentifiant; public class Acces implements Parcelable { private int id; - private int xCoinHautGauche, yCoinHautGauche; - private int xCoinBasDroite, yCoinBasDroite; + private float xCoinHautGauche, yCoinHautGauche; + private float xCoinBasDroite, yCoinBasDroite; private Piece destination; - public Acces(Piece dest, int x1, int y1, int x2, int y2){ + public Acces(Piece dest, float x1, float y1, float x2, float y2){ this.destination = dest; this.xCoinHautGauche = x1; this.yCoinHautGauche = y1; @@ -23,12 +26,21 @@ public class Acces implements Parcelable { this.id = FabriqueIdentifiant.getInstance().getCptAcces(); } + public Acces(){ + this.destination = null; + this.xCoinHautGauche = 0; + this.yCoinHautGauche = 0; + this.xCoinBasDroite = 0; + this.yCoinBasDroite = 0; + this.id = -1; + } + public Acces(Parcel in){ this.id = in.readInt(); - this.xCoinHautGauche = in.readInt(); - this.yCoinHautGauche = in.readInt(); - this.xCoinBasDroite = in.readInt(); - this.yCoinBasDroite = in.readInt(); + this.xCoinHautGauche = in.readFloat(); + this.yCoinHautGauche = in.readFloat(); + this.xCoinBasDroite = in.readFloat(); + this.yCoinBasDroite = in.readFloat(); this.destination = in.readParcelable(Piece.class.getClassLoader()); } @@ -47,10 +59,10 @@ public class Acces implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags){ dest.writeInt(this.id); - dest.writeInt(this.xCoinHautGauche); - dest.writeInt(this.yCoinHautGauche); - dest.writeInt(this.xCoinBasDroite); - dest.writeInt(this.yCoinBasDroite); + dest.writeFloat(this.xCoinHautGauche); + dest.writeFloat(this.yCoinHautGauche); + dest.writeFloat(this.xCoinBasDroite); + dest.writeFloat(this.yCoinBasDroite); dest.writeParcelable(this.destination, flags); } @@ -63,35 +75,39 @@ public class Acces implements Parcelable { return this.id; } - public int getXCoinBasDroite() { + public void setId(int id){ + this.id = id; + } + + public float getXCoinBasDroite() { return this.xCoinBasDroite; } - public void setxCoinBasDroite(int xCoinBasDroite) { + public void setxCoinBasDroite(float xCoinBasDroite) { this.xCoinBasDroite = xCoinBasDroite; } - public int getXCoinHautGauche() { + public float getXCoinHautGauche() { return this.xCoinHautGauche; } - public void setxCoinHautGauche(int xCoinHautGauche) { + public void setxCoinHautGauche(float xCoinHautGauche) { this.xCoinHautGauche = xCoinHautGauche; } - public int getYCoinBasDroite() { + public float getYCoinBasDroite() { return this.yCoinBasDroite; } - public void setyCoinBasDroite(int yCoinBasDroite) { + public void setyCoinBasDroite(float yCoinBasDroite) { this.yCoinBasDroite = yCoinBasDroite; } - public int getYCoinHautGauche() { + public float getYCoinHautGauche() { return this.yCoinHautGauche; } - public void setyCoinHautGauche(int yCoinHautGauche) { + public void setyCoinHautGauche(float yCoinHautGauche) { this.yCoinHautGauche = yCoinHautGauche; } @@ -102,4 +118,21 @@ public class Acces implements Parcelable { public void setDestination(Piece destination) { this.destination = destination; } + + public JSONObject toJson(){ + JSONObject acces = new JSONObject(); + try{ + acces.put("id", this.getId()); + acces.put("xCoinHautGauche", this.getXCoinHautGauche()); + acces.put("yCoinHautGauche", this.getYCoinHautGauche()); + acces.put("xCoinBasDroit", this.getXCoinBasDroite()); + acces.put("yCoinBasDroit", this.getYCoinBasDroite()); + acces.put("destination", this.getDestination().getId()); + + } catch (Exception e) { + e.printStackTrace(); + } + + return acces; + } } diff --git a/app/src/main/java/fr/ul/projet/modele/Modele.java b/app/src/main/java/fr/ul/projet/modele/Modele.java index 516dee700be2ec82695387da7c8722949cf0d3e7..d05cc5f367ebdc2602cd4a8b3c82d1093b956282 100644 --- a/app/src/main/java/fr/ul/projet/modele/Modele.java +++ b/app/src/main/java/fr/ul/projet/modele/Modele.java @@ -301,7 +301,7 @@ public class Modele implements Parcelable{ * @param x2 Coordonnée x du coin bas droit du rectangle représenant l'accès * @param y2 Coordonnée y du coin bas droit du rectangle représenant l'accès */ - public void ajouterAcces(Piece destination, int x1, int y1, int x2, int y2){ + public void ajouterAcces(Piece destination, float x1, float y1, float x2, float y2){ this.getPieceCourante().ajouterAcces(destination, x1, y1, x2, y2); } @@ -309,7 +309,7 @@ public class Modele implements Parcelable{ * Méthode qui supprime un accès en fonction de son id * @param idAcces Id de l'accès à supprimer */ - public void supprimerAcces(String idAcces){ + public void supprimerAcces(int idAcces){ this.getPieceCourante().supprimerAcces(idAcces); } @@ -432,7 +432,19 @@ public class Modele implements Parcelable{ piece.setPhotoEst(Uri.parse(pieceJson.getString("cheminPhotoEst"))); piece.setPhotoOuest(Uri.parse(pieceJson.getString("cheminPhotoOuest"))); this.pieces.put(piece.getId(), piece); - Log.i("nom piece", piece.getNom()); + String accesJsonString = pieceJson.getString("accès"); + JSONArray accessJson = new JSONArray(accesJsonString); + for (int j=0; j<accessJson.length(); j++){ + JSONObject accesJson = accessJson.getJSONObject(j); + Acces acces = new Acces(); + acces.setId(accesJson.getInt("id")); + acces.setxCoinHautGauche(accesJson.getLong("xCoinHautGauche")); + acces.setyCoinHautGauche(accesJson.getLong("yCoinHautGauche")); + acces.setxCoinBasDroite(accesJson.getLong("xCoinBasDroit")); + acces.setyCoinBasDroite(accesJson.getLong("yCoinBasDroit")); + acces.setDestination(getPieces().get(accesJson.getInt("destination"))); + piece.ajouterAcces(acces.getDestination(), acces.getXCoinHautGauche(), acces.getYCoinHautGauche(), acces.getXCoinBasDroite(), acces.getYCoinBasDroite()); + } } } catch (Exception e){ e.printStackTrace(); diff --git a/app/src/main/java/fr/ul/projet/modele/Piece.java b/app/src/main/java/fr/ul/projet/modele/Piece.java index 72a6ac9ca017c00ac179e086f683994ca26ef52a..ec3fc5c5e60810fac3fac2ab3e2401d55e115546 100644 --- a/app/src/main/java/fr/ul/projet/modele/Piece.java +++ b/app/src/main/java/fr/ul/projet/modele/Piece.java @@ -4,6 +4,7 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; +import org.json.JSONArray; import org.json.JSONObject; import java.util.HashMap; @@ -155,12 +156,12 @@ public class Piece implements Parcelable { return this.acces; } - public void ajouterAcces(Piece destination, int x1, int y1, int x2, int y2){ + public void ajouterAcces(Piece destination, float x1, float y1, float x2, float y2){ Acces acc = new Acces(destination, x1, y1, x2, y2); this.getAcces().put(acc.getId(), acc); } - public void supprimerAcces(String idAcces){ + public void supprimerAcces(int idAcces){ this.getAcces().remove(idAcces); } @@ -169,10 +170,17 @@ public class Piece implements Parcelable { try{ piece.put("id", this.getId()); piece.put("nom", this.getNom()); - piece.put("cheminPhotoNord", this.getPhotoNord() == null ? "" : this.getPhotoNord().getPath()); - piece.put("cheminPhotoSud", this.getPhotoNord() == null ? "" : this.getPhotoSud().getPath()); - piece.put("cheminPhotoEst", this.getPhotoNord() == null ? "" : this.getPhotoEst().getPath()); - piece.put("cheminPhotoOuest", this.getPhotoNord() == null ? "" : this.getPhotoOuest().getPath()); + piece.put("cheminPhotoNord", this.getPhotoNord() == null ? "" : this.getPhotoNord().toString()); + piece.put("cheminPhotoSud", this.getPhotoSud() == null ? "" : this.getPhotoSud().toString()); + piece.put("cheminPhotoEst", this.getPhotoEst() == null ? "" : this.getPhotoEst().toString()); + piece.put("cheminPhotoOuest", this.getPhotoOuest() == null ? "" : this.getPhotoOuest().toString()); + + JSONArray acces = new JSONArray(); + for (Acces a : this.acces.values()){ + acces.put(a.toJson()); + } + piece.put("accès", acces); + } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/fr/ul/projet/outils/GestionImage.java b/app/src/main/java/fr/ul/projet/outils/GestionImage.java new file mode 100644 index 0000000000000000000000000000000000000000..e9418bd2bc0961b1e0eedaff9f09fab88dfd4948 --- /dev/null +++ b/app/src/main/java/fr/ul/projet/outils/GestionImage.java @@ -0,0 +1,45 @@ +package fr.ul.projet.outils; + +import android.content.ContentResolver; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.RectF; +import android.net.Uri; +import android.widget.ImageView; + +import java.io.InputStream; + +public class GestionImage { + public static Bitmap getBitmapFromUri(Context context, Uri uri) { + try { + ContentResolver resolver = context.getContentResolver(); + InputStream inputStream = resolver.openInputStream(uri); + return BitmapFactory.decodeStream(inputStream); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + // 🔹 Redimensionner le Bitmap pour l'adapter à l'ImageView + public static Bitmap getResizedBitmap(Bitmap original, ImageView imageView) { + int viewWidth = imageView.getWidth(); + int viewHeight = imageView.getHeight(); + if (viewWidth == 0 || viewHeight == 0) return original; // Éviter erreurs + + Bitmap resizedBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(resizedBitmap); + + // Adapter l'image à l'ImageView en conservant les proportions + Matrix matrix = new Matrix(); + RectF src = new RectF(0, 0, original.getWidth(), original.getHeight()); + RectF dst = new RectF(0, 0, viewWidth, viewHeight); + matrix.setRectToRect(src, dst, Matrix.ScaleToFit.CENTER); + canvas.drawBitmap(original, matrix, null); + + return resizedBitmap; + } +} diff --git a/app/src/main/res/layout/activity_acces.xml b/app/src/main/res/layout/activity_acces.xml index c7d2703d3498dfa67d55c53e7b8fb36245447f1b..3b5b308a0493687148c5625c893bc1ce7be741f7 100644 --- a/app/src/main/res/layout/activity_acces.xml +++ b/app/src/main/res/layout/activity_acces.xml @@ -32,7 +32,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.951" /> - <fr.ul.projet.DrawableImageView + <ImageView android:id="@+id/imageView" android:layout_width="399dp" android:layout_height="248dp" @@ -42,6 +42,18 @@ app:layout_constraintTop_toTopOf="parent" tools:srcCompat="@tools:sample/backgrounds/scenic"/> + <fr.ul.projet.DrawingView + android:id="@+id/drawingView" + android:layout_width="399dp" + android:layout_height="248dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:background="@android:color/transparent" + tools:layout_editor_absoluteY="246dp" + /> + <TextView android:id="@+id/textView2" @@ -62,8 +74,19 @@ android:text="@string/boutonAcces" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.727" /> + + <Button + android:id="@+id/suppAcces" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/suppAcces" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.745" /> + app:layout_constraintVertical_bias="0.797" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_piece.xml b/app/src/main/res/layout/activity_piece.xml index bff8bc723b209ecce553f20c431c43abc727079d..13f9cdb64b4ee4d7e0f383afe8162deb101d292c 100644 --- a/app/src/main/res/layout/activity_piece.xml +++ b/app/src/main/res/layout/activity_piece.xml @@ -58,4 +58,16 @@ </LinearLayout> + <Button + android:id="@+id/suppPiece" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/suppPiece" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.498" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.689" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 80beabfac9b11f49790d5bb73a4e50f3f715fac5..66d4e4be35fd666c7d05798b73315096a7de4247 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,6 +36,7 @@ <string name="prendrePhoto">Prendre une photo</string> <string name="selecPhoto">Séléctionner une photo</string> <string name="ajoutAcces">Ajouter un accès</string> + <string name="suppAcces">Supprimer accès</string> <string name="zeroPieces">Aucune pièce à accéder</string> <string name="pieceDest">Choisir une pièce de destination</string> <string name="choixDir">Choisir une direction</string> @@ -45,4 +46,5 @@ <string name="cardS">Sud</string> <string name="cardE">Est</string> <string name="cardO">Ouest</string> + <string name="suppPiece">Supprimer la pièce</string> </resources> \ No newline at end of file