From 99d97d7b102ce228e2a20574a092252d4d2bf331 Mon Sep 17 00:00:00 2001 From: Josh Halvorson Date: Thu, 8 Nov 2018 16:57:53 -0800 Subject: [PATCH 1/2] Implemented the MVVM architecture --- app/src/main/AndroidManifest.xml | 5 +- .../CongressPersonOverviewViewmodel.java | 26 ++++++++ .../CongresspersonDetailsActivity.java | 48 +++++++++++++++ .../CongresspersonDetailsRepo.java | 17 ++++++ .../CongresspersonDetailsViewModel.java | 24 ++++++++ .../CongresspersonOverviewRepo.java | 20 +++++++ .../congressdetails/ListActivity.java | 60 +++++++++++++++++++ .../activity_congressperson_details.xml | 50 ++++++++++++++++ app/src/main/res/layout/activity_list.xml | 19 +++--- 9 files changed, 260 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongressPersonOverviewViewmodel.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepo.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepo.java create mode 100644 app/src/main/res/layout/activity_congressperson_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26b1cb9..9c1e86f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,10 @@ - + + + \ No newline at end of file diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongressPersonOverviewViewmodel.java b/app/src/main/java/com/lambdaschool/congressdetails/CongressPersonOverviewViewmodel.java new file mode 100644 index 0000000..3aeb961 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongressPersonOverviewViewmodel.java @@ -0,0 +1,26 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; +import android.util.Log; + +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import java.util.ArrayList; + +public class CongressPersonOverviewViewmodel extends ViewModel { + private MutableLiveData> congressList; + + public LiveData> getCongressList(){ + if(congressList == null){ + Log.i("LOADLIST", "list is loaded"); + loadList(); + } + return congressList; + } + + private void loadList(){ + congressList = CongresspersonOverviewRepo.getOverviewList(); + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java new file mode 100644 index 0000000..2c4436b --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java @@ -0,0 +1,48 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.Observer; +import android.arch.lifecycle.ViewModelProviders; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.TextView; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + +public class CongresspersonDetailsActivity extends AppCompatActivity { + + TextView name, party, state, totalVotes; + CongresspersonDetailsViewModel viewModel; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_congressperson_details); + name = findViewById(R.id.name); + party = findViewById(R.id.party); + state = findViewById(R.id.state); + totalVotes = findViewById(R.id.votes); + + String id = getIntent().getStringExtra("PersonId"); + final String stateString = getIntent().getStringExtra("PersonState"); + final int totalVotesNumber = getIntent().getIntExtra("PersonVotes", -1); + + if(id != null && stateString != null && totalVotesNumber != -1){ + viewModel = ViewModelProviders.of(this).get(CongresspersonDetailsViewModel.class); + LiveData liveDetails = viewModel.getDetails(id); + liveDetails.observe(this, new Observer() { + @Override + public void onChanged(@Nullable CongresspersonDetails congresspersonDetails) { + if(congresspersonDetails != null){ + name.setText(congresspersonDetails.getFirstName() + " " + congresspersonDetails.getLastName()); + party.setText(congresspersonDetails.getCurrentParty()); + state.setText(stateString); + totalVotes.setText(totalVotesNumber); + } + } + }); + } + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepo.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepo.java new file mode 100644 index 0000000..54e42ca --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepo.java @@ -0,0 +1,17 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.MutableLiveData; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + +import java.util.ArrayList; + +public class CongresspersonDetailsRepo { + public static MutableLiveData getDetails(String id){ + final MutableLiveData liveDataList = new MutableLiveData<>(); + CongresspersonDetails profile = CongressDao.getMemberDetails(id); + liveDataList.setValue(profile); + return liveDataList; + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java new file mode 100644 index 0000000..d6a9f8d --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java @@ -0,0 +1,24 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + +public class CongresspersonDetailsViewModel extends ViewModel { + + private MutableLiveData liveDetails; + + public LiveData getDetails(String id){ + if(liveDetails == null){ + loadData(id); + } + return liveDetails; + } + + public void loadData(String id) { + liveDetails = CongresspersonDetailsRepo.getDetails(id); + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepo.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepo.java new file mode 100644 index 0000000..84c353f --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepo.java @@ -0,0 +1,20 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.MutableLiveData; +import android.util.Log; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import java.util.ArrayList; + +public class CongresspersonOverviewRepo { + + public static MutableLiveData> getOverviewList(){ + final MutableLiveData> liveDataList = new MutableLiveData<>(); + ArrayList rawData = CongressDao.getAllMembers(); + liveDataList.setValue(rawData); + return liveDataList; + } + +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index 3b2296e..4157b48 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -1,13 +1,73 @@ package com.lambdaschool.congressdetails; +import android.arch.lifecycle.Observer; +import android.arch.lifecycle.ViewModelProviders; +import android.content.Context; +import android.content.Intent; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import java.util.ArrayList; public class ListActivity extends AppCompatActivity { + LinearLayout parentLayout; + CongressPersonOverviewViewmodel viewModel; + Context context; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); + context = this; + parentLayout = findViewById(R.id.parent_layout); + viewModel = ViewModelProviders.of(this).get(CongressPersonOverviewViewmodel.class); + viewModel.getCongressList().observe(this, new Observer>() { + @Override + public void onChanged(@Nullable ArrayList congresspersonOverviews) { + if (congresspersonOverviews != null) { + for (final CongresspersonOverview c : congresspersonOverviews) { + runOnUiThread(new Runnable() { + @Override + public void run() { + parentLayout.addView(getDefaultTextView(c)); + } + }); + + } + } + } + }); + } + + TextView getDefaultTextView(final CongresspersonOverview congress) { + TextView view = new TextView(context); + final String fName = congress.getFirstName(); + final String lName = congress.getLastName(); + final String state = congress.getState(); + final String party = congress.getParty(); + String displayText = String.format("%s, %s - %s (%s)", lName, fName, party, state); + view.setText(displayText); + view.setTextSize(28); + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String id = congress.getId(); + int votes = congress.getTotalVotes(); + Intent intent = new Intent(context, CongresspersonDetailsActivity.class); + intent.putExtra("PersonId", id); + intent.putExtra("PersonState", state); + intent.putExtra("PersonVotes", votes); + startActivity(intent); + } + }); + return view; } } diff --git a/app/src/main/res/layout/activity_congressperson_details.xml b/app/src/main/res/layout/activity_congressperson_details.xml new file mode 100644 index 0000000..8af3961 --- /dev/null +++ b/app/src/main/res/layout/activity_congressperson_details.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml index 1884df2..f5a83b6 100644 --- a/app/src/main/res/layout/activity_list.xml +++ b/app/src/main/res/layout/activity_list.xml @@ -6,13 +6,16 @@ android:layout_height="match_parent" tools:context=".ListActivity"> - + + + + + \ No newline at end of file From 831d4a62a9ac705b05e8ae84907864bb0573098d Mon Sep 17 00:00:00 2001 From: Josh Halvorson Date: Thu, 8 Nov 2018 17:24:52 -0800 Subject: [PATCH 2/2] Implemented the MVVM architecture --- app/build.gradle | 3 +++ .../congressdetails/CongresspersonDetailsActivity.java | 4 ++-- .../java/com/lambdaschool/congressdetails/ListActivity.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b036fea..9bf0476 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,4 +25,7 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation 'android.arch.lifecycle:extensions:1.1.1' + implementation 'android.arch.lifecycle:viewmodel:1.1.1' + implementation project(':congressdataapiaccess-debug') } diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java index 2c4436b..49d6a93 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java @@ -27,9 +27,9 @@ protected void onCreate(Bundle savedInstanceState) { String id = getIntent().getStringExtra("PersonId"); final String stateString = getIntent().getStringExtra("PersonState"); - final int totalVotesNumber = getIntent().getIntExtra("PersonVotes", -1); + final String totalVotesNumber = getIntent().getStringExtra("PersonVotes"); - if(id != null && stateString != null && totalVotesNumber != -1){ + if(id != null && stateString != null && totalVotesNumber != null){ viewModel = ViewModelProviders.of(this).get(CongresspersonDetailsViewModel.class); LiveData liveDetails = viewModel.getDetails(id); liveDetails.observe(this, new Observer() { diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index 4157b48..697f0d6 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -60,7 +60,7 @@ TextView getDefaultTextView(final CongresspersonOverview congress) { @Override public void onClick(View v) { String id = congress.getId(); - int votes = congress.getTotalVotes(); + String votes = Integer.toString(congress.getTotalVotes()); Intent intent = new Intent(context, CongresspersonDetailsActivity.class); intent.putExtra("PersonId", id); intent.putExtra("PersonState", state);