diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36bf4ee..b2e9655 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,11 @@ android:supportsRtl="true" android:theme="@style/Theme.MyRealEstateAgency"> + + diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/AgentsAdapter.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/AgentsAdapter.java index 5d1fde4..6716088 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/AgentsAdapter.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/AgentsAdapter.java @@ -2,6 +2,7 @@ package fr.romanet.vj.apps.myrealestateagency.adapter; import java.util.List; +import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -13,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import fr.romanet.vj.apps.myrealestateagency.adapter.AgentsAdapter.AgentViewHolder; import fr.romanet.vj.apps.myrealestateagency.entities.Agent; import fr.romanet.vj.apps.myrealestateagency.R; +import fr.romanet.vj.apps.myrealestateagency.view.PropertiesActivity; public final class AgentsAdapter extends Adapter{ @@ -36,7 +38,18 @@ public final class AgentsAdapter extends Adapter{ { agentFirstName.setText("First name : " + agent.agentFirstName); agentLastName.setText("Last name : " + agent.agentLastName); - agencyName.setText("Agency : " + agent.nameOfAgency); + agencyName.setText("Agency : " + agent.getAgency().agencyName); + + itemView.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + final Intent intent = new Intent(itemView.getContext(), PropertiesActivity.class); + intent.putExtra(PropertiesActivity.AGENCY_EXTRA, agent.getAgency()); + itemView.getContext().startActivity(intent); + } + }); } } diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/PropertiesAdapter.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/PropertiesAdapter.java new file mode 100644 index 0000000..b9c87b7 --- /dev/null +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/adapter/PropertiesAdapter.java @@ -0,0 +1,68 @@ +package fr.romanet.vj.apps.myrealestateagency.adapter; + +import java.util.List; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView.Adapter; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; +import fr.romanet.vj.apps.myrealestateagency.adapter.PropertiesAdapter.PropertiesViewHolder; +import fr.romanet.vj.apps.myrealestateagency.R; +import fr.romanet.vj.apps.myrealestateagency.entities.Property; + +public class PropertiesAdapter extends Adapter { + + public static final class PropertiesViewHolder extends ViewHolder { + + private final TextView agencyAddress; + + private final TextView agencyDescription; + + private final TextView agencyPrice; + + public PropertiesViewHolder(@NonNull View itemView) + { + super(itemView); + agencyAddress = itemView.findViewById(R.id.propertyAddress); + agencyDescription = itemView.findViewById(R.id.propertyDescription); + agencyPrice = itemView.findViewById(R.id.propertyPrice); + } + + public void update(final Property property) + { + agencyAddress.setText("Address : " + property.address); + agencyDescription.setText("Description : " + property.description); + agencyPrice.setText("Price : "); + } + } + private final List properties; + + public PropertiesAdapter(List properties) + { + this.properties = properties; + } + + @NonNull + @Override + public PropertiesAdapter.PropertiesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) + { + final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewholder_properties, parent, false); + return new PropertiesAdapter.PropertiesViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull PropertiesAdapter.PropertiesViewHolder holder, int position) + { + holder.update(properties.get(position)); + } + + @Override + public int getItemCount() + { + return properties.size(); + } +} diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgencyDao.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgencyDao.java index a63915c..e86bbae 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgencyDao.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgencyDao.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; @@ -7,16 +8,22 @@ import androidx.room.Query; import java.util.List; import fr.romanet.vj.apps.myrealestateagency.entities.Agency; +import fr.romanet.vj.apps.myrealestateagency.entities.Agent; +import fr.romanet.vj.apps.myrealestateagency.entities.Property; @Dao public interface AgencyDao { @Query("SELECT * FROM agency") - List getAgencyList(); + LiveData> getAgencyList(); @Insert void insertAgency(Agency agency); @Insert void insertPreData(Agency[] agencies); + + @Query("SELECT property_id, description, address, longitude, latitude, belongs_agency_id, statue_sale, sold_date, price, type_description, number_rooms, surface_area " + + "FROM property INNER JOIN agency ON agency.agency_id = property.belongs_agency_id WHERE agency.agency_id = :idAgency") + LiveData> getPropertiesList(int idAgency); } \ No newline at end of file diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgentDao.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgentDao.java index 360852f..d495ed4 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgentDao.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/dao/AgentDao.java @@ -4,9 +4,11 @@ import androidx.lifecycle.LiveData; import androidx.room.Dao; import androidx.room.Insert; import androidx.room.Query; +import androidx.room.RoomWarnings; import java.util.List; +import fr.romanet.vj.apps.myrealestateagency.entities.Agency; import fr.romanet.vj.apps.myrealestateagency.entities.Agent; @Dao @@ -15,8 +17,8 @@ public interface AgentDao { @Query("SELECT * FROM agent") LiveData> getAgentList(); - @Query("SELECT agency_name FROM agency INNER JOIN agent ON agent.agency_employer_id = agency.agency_id WHERE agent.agent_id = :idAgent") - String getAgencyName(int idAgent); + @Query("SELECT agency_id, agency_name FROM agency INNER JOIN agent ON agent.agency_employer_id = agency.agency_id WHERE agent.agent_id = :idAgent") + Agency getAgency(int idAgent); @Insert void insertAgent(Agent agent); 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 52cdc4f..bf70506 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 @@ -6,6 +6,7 @@ import androidx.room.Query; import java.util.List; +import fr.romanet.vj.apps.myrealestateagency.entities.Agent; import fr.romanet.vj.apps.myrealestateagency.entities.Property; @Dao @@ -15,4 +16,7 @@ public interface PropertyDao { @Insert void insertProperty(Property property); + + @Insert + void insertPreProperties(Property[] properties); } diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/database/RealEstateAgencyDatabase.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/database/RealEstateAgencyDatabase.java index f242c88..1feb352 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/database/RealEstateAgencyDatabase.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/database/RealEstateAgencyDatabase.java @@ -55,6 +55,7 @@ public abstract class RealEstateAgencyDatabase extends RoomDatabase { public void run() { getInstance(context).agencyDao().insertPreData(Agency.populateAgencyTable()); getInstance(context).agentDao().insertPreAgents(Agent.populateAgentsTable()); + getInstance(context).propertyDao().insertPreProperties(Property.populatePropertyTable()); } }); } diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agency.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agency.java index 9785c09..c3afb15 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agency.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agency.java @@ -5,11 +5,13 @@ import androidx.room.Entity; import androidx.room.Index; import androidx.room.PrimaryKey; +import java.io.Serializable; + //Parent class of agent (indeed, zero or many agents can work in an agency) @Entity(tableName = "agency", indices = {@Index("agency_id"), @Index(value = {"agency_name"}, unique = true)}) -public class Agency { +public class Agency implements Serializable { @ColumnInfo(name = "agency_id") @PrimaryKey(autoGenerate = true) diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agent.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agent.java index 2fc327f..f9e1d9d 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agent.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/entities/Agent.java @@ -7,6 +7,8 @@ import androidx.room.Ignore; import androidx.room.Index; import androidx.room.PrimaryKey; +import fr.romanet.vj.apps.myrealestateagency.database.RealEstateAgencyDatabase; + import static androidx.room.ForeignKey.CASCADE; //Child class of Agency (indeed, an agent work only in one agency) @@ -32,7 +34,7 @@ public class Agent { public int agencyEmployerId; @Ignore - public String nameOfAgency; + public Agency agency; public Agent(String agentFirstName, String agentLastName, int agencyEmployerId) { @@ -47,9 +49,14 @@ public class Agent { return agentFirstName; } - public void setNameOfAgency(String nameOfAgency) + public void setAgency(Agency agency) { - this.nameOfAgency = nameOfAgency; + this.agency = agency; + } + + public Agency getAgency() + { + return this.agency; } public int getAgencyEmployerId() {return agencyEmployerId;} 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 1d3a6db..2e01ab5 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 @@ -67,4 +67,12 @@ public class Property { return date == null ? null : date.getTime(); } } + + 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), + }; + } } diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgencyRepository.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgencyRepository.java new file mode 100644 index 0000000..1d58269 --- /dev/null +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgencyRepository.java @@ -0,0 +1,33 @@ +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.AgencyDao; +import fr.romanet.vj.apps.myrealestateagency.database.RealEstateAgencyDatabase; +import fr.romanet.vj.apps.myrealestateagency.entities.Agency; +import fr.romanet.vj.apps.myrealestateagency.entities.Property; + +public class AgencyRepository { + + public AgencyDao agencyDao; + public LiveData> allAgencies; + + public AgencyRepository(Application application) { + RealEstateAgencyDatabase realEstateAgencyDatabase = RealEstateAgencyDatabase.getInstance(application); + agencyDao = realEstateAgencyDatabase.agencyDao(); + allAgencies = agencyDao.getAgencyList(); + } + + public LiveData> getAllAgencies() { + return allAgencies; + } + + public LiveData> getProperties(Agency agency) + { + return agencyDao.getPropertiesList(agency.agencyId); + } +} diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgentRepository.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgentRepository.java index 2039535..82b2868 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgentRepository.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/repository/AgentRepository.java @@ -8,6 +8,7 @@ import java.util.List; import fr.romanet.vj.apps.myrealestateagency.dao.AgentDao; import fr.romanet.vj.apps.myrealestateagency.database.RealEstateAgencyDatabase; +import fr.romanet.vj.apps.myrealestateagency.entities.Agency; import fr.romanet.vj.apps.myrealestateagency.entities.Agent; public class AgentRepository { @@ -25,8 +26,8 @@ public class AgentRepository { return allAgents; } - public String getAgencyName(Agent agent) + public Agency getAgency(Agent agent) { - return agentDao.getAgencyName(agent.agentId); + return agentDao.getAgency(agent.agentId); } } 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 new file mode 100644 index 0000000..7f4f74c --- /dev/null +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/view/PropertiesActivity.java @@ -0,0 +1,58 @@ +package fr.romanet.vj.apps.myrealestateagency.view; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.Observer; +import androidx.lifecycle.SavedStateViewModelFactory; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import fr.romanet.vj.apps.myrealestateagency.R; +import fr.romanet.vj.apps.myrealestateagency.adapter.AgentsAdapter; +import fr.romanet.vj.apps.myrealestateagency.adapter.PropertiesAdapter; +import fr.romanet.vj.apps.myrealestateagency.entities.Agency; +import fr.romanet.vj.apps.myrealestateagency.entities.Agent; +import fr.romanet.vj.apps.myrealestateagency.entities.Property; +import fr.romanet.vj.apps.myrealestateagency.viewmodel.PropertiesActivityViewModel; +import fr.romanet.vj.apps.myrealestateagency.viewmodel.PropertiesActivityViewModelFactory; + +public class PropertiesActivity extends AppCompatActivity { + + public static final String AGENCY_EXTRA = "agencyExtra"; + + private Bundle extras; + + private PropertiesActivityViewModel viewModel; + + private RecyclerView recyclerView; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_properties); + recyclerView = findViewById(R.id.recyclerViewProperties); + recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); + Agency agency = (Agency) getIntent().getSerializableExtra("agencyExtra"); + viewModel = new ViewModelProvider(this, new PropertiesActivityViewModelFactory(this.getApplication(), agency)).get(PropertiesActivityViewModel.class); + observeProperties(); + } + + private void observeProperties() + { + viewModel.properties.observe(this, new Observer>() + { + @Override + public void onChanged(List properties) + { + final PropertiesAdapter propertiesAdapter = new PropertiesAdapter(properties); + recyclerView.setAdapter(propertiesAdapter); + } + }); + } +} diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AgentsActivityViewModel.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AgentsActivityViewModel.java index f788b21..1aa635c 100644 --- a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AgentsActivityViewModel.java +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/AgentsActivityViewModel.java @@ -9,6 +9,7 @@ import androidx.lifecycle.MutableLiveData; import java.util.List; +import fr.romanet.vj.apps.myrealestateagency.entities.Agency; import fr.romanet.vj.apps.myrealestateagency.entities.Agent; import fr.romanet.vj.apps.myrealestateagency.repository.AgentRepository; @@ -30,8 +31,8 @@ public class AgentsActivityViewModel extends AndroidViewModel { for(int i = 0; i < currentList.size(); i++) { Agent currentAgent = currentList.get(i); - String nameOfAgency = agentRepository.getAgencyName(currentList.get(i)); - currentAgent.setNameOfAgency(nameOfAgency); + Agency agency = agentRepository.getAgency(currentList.get(i)); + currentAgent.setAgency(agency); } } } diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/PropertiesActivityViewModel.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/PropertiesActivityViewModel.java new file mode 100644 index 0000000..9754b00 --- /dev/null +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/PropertiesActivityViewModel.java @@ -0,0 +1,32 @@ +package fr.romanet.vj.apps.myrealestateagency.viewmodel; + +import android.app.Application; + +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.SavedStateHandle; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import java.util.List; + +import fr.romanet.vj.apps.myrealestateagency.entities.Agency; +import fr.romanet.vj.apps.myrealestateagency.entities.Property; +import fr.romanet.vj.apps.myrealestateagency.repository.AgencyRepository; +import fr.romanet.vj.apps.myrealestateagency.view.PropertiesActivity; + +public class PropertiesActivityViewModel extends AndroidViewModel { + + public AgencyRepository agencyRepository; + public LiveData> properties = new MutableLiveData<>(); + + public PropertiesActivityViewModel(Application application, Agency agency) + { + super(application); + agencyRepository = new AgencyRepository(application); + properties = agencyRepository.getProperties(agency); + } +} + + diff --git a/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/PropertiesActivityViewModelFactory.java b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/PropertiesActivityViewModelFactory.java new file mode 100644 index 0000000..976e568 --- /dev/null +++ b/app/src/main/java/fr/romanet/vj/apps/myrealestateagency/viewmodel/PropertiesActivityViewModelFactory.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 PropertiesActivityViewModelFactory implements ViewModelProvider.Factory { + private Application mApplication; + private Agency mParam; + + + public PropertiesActivityViewModelFactory(Application application, Agency param) { + mApplication = application; + mParam = param; + } + + + @Override + public T create(Class modelClass) { + return (T) new PropertiesActivityViewModel(mApplication, mParam); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_agency_add.xml b/app/src/main/res/drawable/ic_agency_add.xml new file mode 100644 index 0000000..c9a6a8d --- /dev/null +++ b/app/src/main/res/drawable/ic_agency_add.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/layout/activity_properties.xml b/app/src/main/res/layout/activity_properties.xml new file mode 100644 index 0000000..91e5a9d --- /dev/null +++ b/app/src/main/res/layout/activity_properties.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/viewholder_properties.xml b/app/src/main/res/layout/viewholder_properties.xml new file mode 100644 index 0000000..1a40f78 --- /dev/null +++ b/app/src/main/res/layout/viewholder_properties.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 8f6b03e..70d7098 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -4,11 +4,9 @@ @color/purple_200 @color/purple_700 - @color/black @color/teal_200 @color/teal_200 - @color/black ?attr/colorPrimaryVariant diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..19b1102 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,6 +5,5 @@ #FF3700B3 #FF03DAC5 #FF018786 - #FF000000 #FFFFFFFF \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index dfa6ff3..8aa3541 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -8,7 +8,6 @@ @color/teal_200 @color/teal_700 - @color/black ?attr/colorPrimaryVariant