From e6a1d6616cef83e4f98c07ae1dabda21d5cc57e6 Mon Sep 17 00:00:00 2001
From: BGbaderguet <48762010+BGbaderguet@users.noreply.github.com>
Date: Fri, 1 Jan 2021 17:03:48 +0100
Subject: [PATCH] Modify the files to add a property in the database
---
app/src/main/AndroidManifest.xml | 1 -
.../myrealestateagency/dao/PropertyDao.java | 3 +-
.../myrealestateagency/entities/Property.java | 11 +-
.../entities/PropertyStatue.java | 7 ++
.../entities/PropertyType.java | 9 +-
.../repository/PropertyRepository.java | 32 ++++++
.../view/AddPropertyActivity.java | 106 +++++++++++++++++-
.../view/PropertiesActivity.java | 16 ++-
.../AddPropertyActivityViewModel.java | 69 ++++++++++++
.../AddPropertyActivityViewModelFactory.java | 25 +++++
.../main/res/layout/activity_add_property.xml | 24 +++-
app/src/main/res/values/strings.xml | 2 +
12 files changed, 288 insertions(+), 17 deletions(-)
create mode 100644 app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/PropertyRepository.java
create mode 100644 app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModel.java
create mode 100644 app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModelFactory.java
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f8fc6e3..e2d5ace 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -34,7 +34,6 @@
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/PropertyDao.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/PropertyDao.java
index bf70506..ecfee69 100644
--- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/PropertyDao.java
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/PropertyDao.java
@@ -1,5 +1,6 @@
package fr.romanet.vj.apps.myrealestateagency.dao;
+import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
@@ -12,7 +13,7 @@ import fr.romanet.vj.apps.myrealestateagency.entities.Property;
@Dao
public interface PropertyDao {
@Query("SELECT * FROM property")
- List getPropertyList();
+ LiveData> getPropertyList();
@Insert
void insertProperty(Property property);
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Property.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Property.java
index 2e01ab5..841a2d8 100644
--- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Property.java
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Property.java
@@ -45,7 +45,7 @@ public class Property {
@ColumnInfo(name = "belongs_agency_id", index = true)
public int belongsToAgencyId;
- public Property(String description, String address, double longitude, double latitude, int belongsToAgencyId)
+ public Property(String description, String address, double longitude, double latitude, int belongsToAgencyId, PropertyStatue propertyStatue, PropertyType propertyType)
{
propertyId = 0;
this.description = description;
@@ -53,6 +53,8 @@ public class Property {
this.longitude = longitude;
this.latitude = latitude;
this.belongsToAgencyId = belongsToAgencyId;
+ this.propertyStatue = propertyStatue;
+ this.propertyType = propertyType;
}
public static class Converters {
@@ -70,9 +72,10 @@ public class Property {
public static Property[] populatePropertyTable() {
return new Property[]{
- new Property("Amazing property in the best district of Paris", "15 rue Champs-Elysée", 15.8, 17.8, 1),
- new Property("Best appartment in Velizy-Villacoublay", "Rue de Villacoublay, 78140 Vélizy-Villacoublay", 19.8, 20.8, 1),
- new Property("Amazing property in the best district of Marseille", "15 rue de Marseille", 15.8, 17.8, 1),
+ new Property("Amazing property in the best district of Paris", "15 rue Champs-Elysée", 15.8, 17.8, 1,
+ new PropertyStatue(false, null, 15.8), new PropertyType("Appartment", 3, 9.8))
+ //new Property("Best appartment in Velizy-Villacoublay", "Rue de Villacoublay, 78140 Vélizy-Villacoublay", 19.8, 20.8, 1),
+ //new Property("Amazing property in the best district of Marseille", "15 rue de Marseille", 15.8, 17.8, 1),
};
}
}
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyStatue.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyStatue.java
index 2365532..dfd7a31 100644
--- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyStatue.java
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyStatue.java
@@ -17,4 +17,11 @@ public class PropertyStatue{
@ColumnInfo(name = "price")
public double price;
+
+ public PropertyStatue(boolean statueSale, Date soldDate, double price)
+ {
+ this.statueSale = statueSale;
+ this.soldDate = soldDate;
+ this.price = price;
+ }
}
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyType.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyType.java
index f0f0899..e46ac7a 100644
--- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyType.java
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/PropertyType.java
@@ -11,6 +11,13 @@ public class PropertyType {
public int numberRooms;
@ColumnInfo(name = "surface_area")
- public float surfaceArea;
+ public double surfaceArea;
+
+ public PropertyType(String typeDescription, int numberRooms, double surfaceArea)
+ {
+ this.typeDescription = typeDescription;
+ this.numberRooms = numberRooms;
+ this.surfaceArea = surfaceArea;
+ }
}
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/PropertyRepository.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/PropertyRepository.java
new file mode 100644
index 0000000..320aedd
--- /dev/null
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/PropertyRepository.java
@@ -0,0 +1,32 @@
+package fr.romanet.vj.apps.myrealestateagency.repository;
+
+import android.app.Application;
+
+import androidx.lifecycle.LiveData;
+
+import java.util.List;
+
+import fr.romanet.vj.apps.myrealestateagency.dao.PropertyDao;
+import fr.romanet.vj.apps.myrealestateagency.database.RealEstateAgencyDatabase;
+import fr.romanet.vj.apps.myrealestateagency.entities.Property;
+
+public class PropertyRepository {
+
+ public PropertyDao propertyDao;
+ public LiveData> allProperties;
+
+ public PropertyRepository(Application application) {
+ RealEstateAgencyDatabase realEstateAgencyDatabase = RealEstateAgencyDatabase.getInstance(application);
+ propertyDao = realEstateAgencyDatabase.propertyDao();
+ allProperties = propertyDao.getPropertyList();
+ }
+
+ public LiveData> getAllProperties() {
+ return allProperties;
+ }
+
+ public void insertProperty(Property property)
+ {
+ propertyDao.insertProperty(property);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/AddPropertyActivity.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/AddPropertyActivity.java
index 7f53a0e..589ba2d 100644
--- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/AddPropertyActivity.java
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/AddPropertyActivity.java
@@ -1,15 +1,115 @@
package fr.romanet.vj.apps.myrealestateagency.view;
import android.os.Bundle;
-import androidx.appcompat.app.AppCompatActivity;
-import fr.romanet.vj.apps.myrealestateagency.R;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProvider;
+
+import java.io.IOException;
+
+import fr.romanet.vj.apps.myrealestateagency.R;
+import fr.romanet.vj.apps.myrealestateagency.entities.Agency;
+import fr.romanet.vj.apps.myrealestateagency.viewmodel.AddPropertyActivityViewModel;
+import fr.romanet.vj.apps.myrealestateagency.viewmodel.AddPropertyActivityViewModel.Event;
+import fr.romanet.vj.apps.myrealestateagency.viewmodel.AddPropertyActivityViewModelFactory;
+import fr.romanet.vj.apps.myrealestateagency.viewmodel.PropertiesActivityViewModelFactory;
+
+public class AddPropertyActivity extends AppCompatActivity implements OnClickListener {
+
+ public static final String AGENCY_EXTRA = "agencyExtra";
+
+ private Agency agency;
+
+ private EditText address;
+
+ private EditText type;
+
+ private EditText numberRooms;
+
+ private EditText price;
+
+ private EditText surface;
+
+ private EditText description;
+
+ private AddPropertyActivityViewModel viewModel;
-public class AddPropertyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_property);
+
+ address = findViewById(R.id.addPropertyAddress);
+ type = findViewById(R.id.addPropertyType);
+ numberRooms = findViewById(R.id.addPropertyNumberOfRooms);
+ price = findViewById(R.id.addPropertyPrice);
+ surface = findViewById(R.id.addPropertyPrice);
+ description = findViewById(R.id.addPropertyDescription);
+
+ findViewById(R.id.addPropertyButton).setOnClickListener(this);
+ agency = (Agency) getIntent().getSerializableExtra("agencyExtra");
+ viewModel = new ViewModelProvider(this, new AddPropertyActivityViewModelFactory(this.getApplication(), agency)).get(AddPropertyActivityViewModel.class);
+
+ observeEvent();
+ }
+
+ private void observeEvent()
+ {
+ viewModel.event.observe(this, new Observer()
+ {
+ @Override
+ public void onChanged(Event event)
+ {
+ if (event == Event.ResetForm)
+ {
+ resetForm();
+ }
+ else if (event == Event.DisplayError)
+ {
+ displayError();
+ }
+ }
+ });
+ }
+
+ private void displayError()
+ {
+ Toast.makeText(this, R.string.cannot_add_property, Toast.LENGTH_SHORT).show();
+ }
+
+ private void resetForm()
+ {
+ address.setText(null);
+ type.setText(null);
+ numberRooms.setText(null);
+ price.setText(null);
+ surface.setText(null);
+ description.setText(null);
+ }
+
+ @Override
+ public void onClick(View v)
+ {
+ final String propertyAddress = address.getEditableText().toString();
+ final String propertyType = type.getEditableText().toString();
+ final int propertyNumberRooms = Integer.parseInt(numberRooms.getEditableText().toString());
+ final double propertyPrice = Double.parseDouble(price.getEditableText().toString());
+ final double propertySurface = Double.parseDouble(numberRooms.getEditableText().toString());
+ final String propertyDescription = price.getEditableText().toString();
+
+ try {
+ viewModel.saveProperty(propertyAddress, propertyType, propertyNumberRooms, propertyPrice, propertySurface, propertyDescription);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
}
+
+
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/PropertiesActivity.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/PropertiesActivity.java
index 7a19ae7..7f2fef6 100644
--- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/PropertiesActivity.java
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/PropertiesActivity.java
@@ -62,13 +62,27 @@ public class PropertiesActivity extends AppCompatActivity implements OnClickList
protected void onResume()
{
super.onResume();
- viewModel.loadProperties(agency);
+ viewModel = new ViewModelProvider(this, new PropertiesActivityViewModelFactory(this.getApplication(), agency)).get(PropertiesActivityViewModel.class);
+ observeProperties();
}
+ /*@Override
+ protected void onSaveInstanceState(Bundle savedInstanceState) {
+ super.onSaveInstanceState(savedInstanceState);
+ savedInstanceState.putSerializable(AGENCY_EXTRA, agency);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ agency = (Agency) savedInstanceState.getSerializable(AGENCY_EXTRA);
+ }*/
+
@Override
public void onClick(View v)
{
final Intent intent = new Intent(this, AddPropertyActivity.class);
+ intent.putExtra(AddPropertyActivity.AGENCY_EXTRA, agency);
startActivity(intent);
}
}
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModel.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModel.java
new file mode 100644
index 0000000..a8ab6e9
--- /dev/null
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModel.java
@@ -0,0 +1,69 @@
+package fr.romanet.vj.apps.myrealestateagency.viewmodel;
+
+
+import android.app.Application;
+import android.location.Address;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.MutableLiveData;
+
+import java.io.IOException;
+
+import fr.romanet.vj.apps.myrealestateagency.MyApp;
+import fr.romanet.vj.apps.myrealestateagency.entities.Agency;
+import fr.romanet.vj.apps.myrealestateagency.entities.Property;
+import fr.romanet.vj.apps.myrealestateagency.entities.PropertyStatue;
+import fr.romanet.vj.apps.myrealestateagency.entities.PropertyType;
+import fr.romanet.vj.apps.myrealestateagency.repository.MapsActivityRepository;
+import fr.romanet.vj.apps.myrealestateagency.repository.PropertyRepository;
+import fr.romanet.vj.apps.myrealestateagency.view.AddPropertyActivity;
+
+public class AddPropertyActivityViewModel extends AndroidViewModel {
+
+ public enum Event
+ {
+ ResetForm, DisplayError
+ }
+
+ public MutableLiveData event = new MutableLiveData<>();
+
+ private Agency agency;
+
+ public PropertyRepository propertyRepository;
+
+ public AddPropertyActivityViewModel(@NonNull Application application, Agency agency)
+ {
+ super(application);
+ this.agency = agency;
+ propertyRepository = new PropertyRepository(application);
+ }
+
+ public void saveProperty(String propertyAddress, String propertyType, int propertyNumberRooms, double propertyPrice, double propertySurface, String propertyDescription) throws IOException {
+
+ final boolean canAddProperty = checkFormEntries(propertyAddress, propertyType, propertyNumberRooms, propertyPrice, propertySurface, propertyDescription);
+
+ if (canAddProperty == true)
+ {
+ Address address = MapsActivityRepository.get_lat_long_from_address(propertyAddress, MyApp.getContext());
+ double latitude = address.getLatitude();
+ double longitude = address.getLongitude();
+ Property propertyToAdd = new Property(propertyDescription, propertyAddress, longitude, latitude, this.agency.getAgencyId(), new PropertyStatue(false, null, propertyPrice),
+ new PropertyType(propertyType, propertyNumberRooms, propertySurface));
+ propertyRepository.insertProperty(propertyToAdd);
+ event.postValue(Event.ResetForm);
+ }
+ else
+ {
+ event.postValue(Event.DisplayError);
+ }
+ }
+
+ private boolean checkFormEntries(String propertyAddress, String propertyType, int propertyNumberRooms, double propertyPrice, double propertySurface, String propertyDescription)
+ {
+ return TextUtils.isEmpty(propertyAddress) == false && TextUtils.isEmpty(propertyType) == false && TextUtils.isEmpty(propertyDescription) == false;
+ }
+
+}
diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModelFactory.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModelFactory.java
new file mode 100644
index 0000000..bda0f8a
--- /dev/null
+++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AddPropertyActivityViewModelFactory.java
@@ -0,0 +1,25 @@
+package fr.romanet.vj.apps.myrealestateagency.viewmodel;
+
+import android.app.Application;
+
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+import fr.romanet.vj.apps.myrealestateagency.entities.Agency;
+
+public class AddPropertyActivityViewModelFactory implements ViewModelProvider.Factory {
+ private Application mApplication;
+ private Agency mParam;
+
+
+ public AddPropertyActivityViewModelFactory(Application application, Agency param) {
+ mApplication = application;
+ mParam = param;
+ }
+
+
+ @Override
+ public T create(Class modelClass) {
+ return (T) new AddPropertyActivityViewModel(mApplication, mParam);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_add_property.xml b/app/src/main/res/layout/activity_add_property.xml
index b9dd891..dfcad3b 100644
--- a/app/src/main/res/layout/activity_add_property.xml
+++ b/app/src/main/res/layout/activity_add_property.xml
@@ -38,7 +38,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/Type"
- android:inputType="phone"
+ android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@id/addPropertyNumberOfRooms"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -50,7 +50,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/Number_of_room"
- android:inputType="textPostalAddress"
+ android:inputType="phone"
app:layout_constraintBottom_toTopOf="@id/addPropertyPrice"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -62,13 +62,25 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/price"
- android:inputType="textPostalAddress"
- app:layout_constraintBottom_toTopOf="@id/addPropertyDescription"
+ android:inputType="textPersonName"
+ app:layout_constraintBottom_toTopOf="@id/addPropertySurface"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/addPropertyNumberOfRooms"
/>
+
+