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" /> + +