From d2372ff34d44a5345d92587e118ed70beb3937e5 Mon Sep 17 00:00:00 2001 From: Jacob Seppanen Date: Thu, 8 Nov 2018 20:18:01 -0800 Subject: [PATCH 1/4] Gets names of Congress people and displays them on start. --- .../congressdetails/ListActivity.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index 3b2296e..122c858 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -1,13 +1,71 @@ package com.lambdaschool.congressdetails; +import android.arch.lifecycle.Observer; +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.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import android.arch.lifecycle.ViewModelProviders; + +import java.util.ArrayList; public class ListActivity extends AppCompatActivity { + LinearLayout parentLayout; + CPOverviewViewModel viewModel; + Context context; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); + + parentLayout = findViewById(R.id.parent_layout); + context = this; + + viewModel = ViewModelProviders.of(this).get(CPOverviewViewModel.class); + + viewModel.getOverViewList().observe(this, new Observer>() { + @Override + public void onChanged(@Nullable ArrayList cpOverviews) { + if (cpOverviews != null) { + for (CongresspersonOverview person : cpOverviews) { + parentLayout.addView(getDefaultTextView(person)); + } + } + } + }); + } + + TextView getDefaultTextView(final CongresspersonOverview person) { + TextView view = new TextView(context); + String displayText = String.format("%s %s", person.getFirstName(), person.getLastName()); + view.setText(displayText); + view.setTextSize(28); + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String id = person.getId(); + Log.i("CPID", id); + + Intent intent = new Intent(context, DetailsView.class); + intent.putExtra("CPID",id); + startActivity(intent); + } + }); + return view; + } + + + + } From 04ad99663d2e32c387b987ec8cd03494b0f8ff72 Mon Sep 17 00:00:00 2001 From: Jacob Seppanen Date: Sat, 10 Nov 2018 20:00:39 -0800 Subject: [PATCH 2/4] Displays details page of each member when clicked. --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 7 +- .../congressdetails/CPDetailsRepo.java | 16 +++++ .../congressdetails/CPDetailsViewModel.java | 25 +++++++ .../congressdetails/CPOverviewRepo.java | 18 +++++ .../congressdetails/CPOverviewViewModel.java | 24 +++++++ .../congressdetails/DetailsView.java | 53 +++++++++++++++ .../congressdetails/ListActivity.java | 3 +- .../main/res/layout/activity_details_view.xml | 65 +++++++++++++++++++ app/src/main/res/layout/activity_list.xml | 19 +++--- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 12 files changed, 226 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CPDetailsRepo.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CPDetailsViewModel.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CPOverviewRepo.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java create mode 100644 app/src/main/res/layout/activity_details_view.xml 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/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26b1cb9..5f347ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,13 +2,17 @@ + + + + android:theme="@style/AppTheme" + android:usesCleartextTraffic="true"> @@ -16,6 +20,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CPDetailsRepo.java b/app/src/main/java/com/lambdaschool/congressdetails/CPDetailsRepo.java new file mode 100644 index 0000000..2fb1ce2 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CPDetailsRepo.java @@ -0,0 +1,16 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.MutableLiveData; + +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; +import com.lambdaschool.congressdataapiaccess.CongressDao; + + +public class CPDetailsRepo { + public static MutableLiveData getDetails(String id) { + final MutableLiveData liveDataList = new MutableLiveData<>(); + CongresspersonDetails details = CongressDao.getMemberDetails(id); + liveDataList.setValue(details); + return liveDataList; + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CPDetailsViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CPDetailsViewModel.java new file mode 100644 index 0000000..518b6aa --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CPDetailsViewModel.java @@ -0,0 +1,25 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + +public class CPDetailsViewModel extends ViewModel { + + private MutableLiveData liveDetails; + + public LiveData getDetails(String id) { + if (liveDetails == null) { + loadData(id); + } + return liveDetails; + } + + private void loadData(String id) { + liveDetails = CPDetailsRepo.getDetails(id); + + } + + +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewRepo.java b/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewRepo.java new file mode 100644 index 0000000..3440c95 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewRepo.java @@ -0,0 +1,18 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import java.util.ArrayList; + +public class CPOverviewRepo extends ViewModel { + 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/CPOverviewViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.java new file mode 100644 index 0000000..6966ad3 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.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.CongresspersonOverview; + +import java.util.ArrayList; + +public class CPOverviewViewModel extends ViewModel { + private MutableLiveData> overviewList; + + public LiveData> getOverViewList() { + if (overviewList == null) { + loadList(); + } + return overviewList; + } + + private void loadList() { + overviewList = CPOverviewRepo.getOverviewList(); + } + +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java b/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java new file mode 100644 index 0000000..42bdf51 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java @@ -0,0 +1,53 @@ +package com.lambdaschool.congressdetails; + +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.util.Log; +import android.widget.TextView; + +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + + +public class DetailsView extends AppCompatActivity { + + TextView textName, textParty, textURL; + CPDetailsViewModel viewModel; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_details_view); + textName = findViewById(R.id.text_name); + textParty = findViewById(R.id.text_party); + textURL = findViewById(R.id.text_url); + + String id = getIntent().getStringExtra("CPID"); + + if (id != null) { + viewModel = ViewModelProviders.of(this).get(CPDetailsViewModel.class); + viewModel.getDetails(id).observe(this, new Observer() { + @Override + public void onChanged(@Nullable CongresspersonDetails cpDetails) { + if (cpDetails != null) { + textName.setText(String.format("%s %s", cpDetails.getFirstName(), cpDetails.getLastName())); + String partyName = ""; + partyName = cpDetails.getCurrentParty().trim(); + Log.i("Test", ((Integer)partyName.indexOf('R')).toString()); + if (partyName.equals("R")) { + partyName = "Republican"; + } else if (partyName.equals("D")) { + partyName = "Democrat"; + } + textParty.setText(partyName); + textURL.setText(cpDetails.getUrl()); + } + } + }); + } + + + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index 122c858..afeb4e9 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -13,6 +13,7 @@ import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + import android.arch.lifecycle.ViewModelProviders; import java.util.ArrayList; @@ -48,7 +49,7 @@ public void onChanged(@Nullable ArrayList cpOverviews) { TextView getDefaultTextView(final CongresspersonOverview person) { TextView view = new TextView(context); - String displayText = String.format("%s %s", person.getFirstName(), person.getLastName()); + String displayText = String.format("%s %s (%s)", person.getFirstName(), person.getLastName(), person.getState()); view.setText(displayText); view.setTextSize(28); view.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/res/layout/activity_details_view.xml b/app/src/main/res/layout/activity_details_view.xml new file mode 100644 index 0000000..fd16a55 --- /dev/null +++ b/app/src/main/res/layout/activity_details_view.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + \ 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 diff --git a/build.gradle b/build.gradle index 077cb2f..8d3ef8e 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.1' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 95d3e5f..441e1cd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Sep 04 14:01:16 MDT 2018 +#Thu Nov 08 13:06:56 PST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip From 24bf46f1f73ed6463433af2dd0323b33865f13ab Mon Sep 17 00:00:00 2001 From: Jacob Seppanen Date: Sat, 10 Nov 2018 20:14:32 -0800 Subject: [PATCH 3/4] Sort list by state. --- app/build.gradle | 6 +++++- .../lambdaschool/congressdetails/CPOverviewViewModel.java | 3 +++ .../java/com/lambdaschool/congressdetails/ListActivity.java | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9bf0476..1d7e22a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,10 +16,14 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0-rc02' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.java index 6966ad3..0918f8b 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/CPOverviewViewModel.java @@ -6,6 +6,7 @@ import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; import java.util.ArrayList; +import java.util.Collections; public class CPOverviewViewModel extends ViewModel { private MutableLiveData> overviewList; @@ -14,6 +15,8 @@ public LiveData> getOverViewList() { if (overviewList == null) { loadList(); } + + return overviewList; } diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index afeb4e9..dcd2f57 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -17,6 +17,7 @@ import android.arch.lifecycle.ViewModelProviders; import java.util.ArrayList; +import java.util.Collections; public class ListActivity extends AppCompatActivity { @@ -38,7 +39,9 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onChanged(@Nullable ArrayList cpOverviews) { if (cpOverviews != null) { - for (CongresspersonOverview person : cpOverviews) { + Collections.sort(cpOverviews, + (o1, o2) -> o1.getState().compareTo(o2.getState())); + for (CongresspersonOverview person : cpOverviews) { parentLayout.addView(getDefaultTextView(person)); } } From 0ba83f54f9f80efb2647fc8060baf186402ea57a Mon Sep 17 00:00:00 2001 From: Jacob Seppanen Date: Sat, 10 Nov 2018 21:08:28 -0800 Subject: [PATCH 4/4] Clean up the details view activity layout. --- .../congressdetails/DetailsView.java | 7 +-- .../main/res/layout/activity_details_view.xml | 43 +++++++++++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java b/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java index 42bdf51..2b9e53c 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/DetailsView.java @@ -13,7 +13,7 @@ public class DetailsView extends AppCompatActivity { - TextView textName, textParty, textURL; + TextView textName, textParty, textURL, textVotePercent; CPDetailsViewModel viewModel; @Override @@ -23,6 +23,8 @@ protected void onCreate(Bundle savedInstanceState) { textName = findViewById(R.id.text_name); textParty = findViewById(R.id.text_party); textURL = findViewById(R.id.text_url); +// textVotePercent = findViewById(R.id.text_vote_with_party); + String id = getIntent().getStringExtra("CPID"); @@ -34,8 +36,7 @@ public void onChanged(@Nullable CongresspersonDetails cpDetails) { if (cpDetails != null) { textName.setText(String.format("%s %s", cpDetails.getFirstName(), cpDetails.getLastName())); String partyName = ""; - partyName = cpDetails.getCurrentParty().trim(); - Log.i("Test", ((Integer)partyName.indexOf('R')).toString()); + partyName = cpDetails.getCurrentParty(); if (partyName.equals("R")) { partyName = "Republican"; } else if (partyName.equals("D")) { diff --git a/app/src/main/res/layout/activity_details_view.xml b/app/src/main/res/layout/activity_details_view.xml index fd16a55..6234f57 100644 --- a/app/src/main/res/layout/activity_details_view.xml +++ b/app/src/main/res/layout/activity_details_view.xml @@ -17,14 +17,16 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" tools:layout_editor_absoluteY="0dp" /> @@ -33,20 +35,20 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" + android:textSize="15dp" app:layout_constraintBottom_toBottomOf="@+id/textView3" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.141" app:layout_constraintStart_toEndOf="@+id/textView3" app:layout_constraintTop_toTopOf="@+id/textView3" - app:layout_constraintVertical_bias="0.0" /> + app:layout_constraintVertical_bias=".8" /> @@ -56,10 +58,33 @@ android:layout_height="wrap_content" android:autoLink="web" android:text="TextView" + android:textSize="15dp" app:layout_constraintBottom_toBottomOf="@+id/textView5" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.142" app:layout_constraintStart_toEndOf="@+id/textView5" app:layout_constraintTop_toTopOf="@+id/textView5" - app:layout_constraintVertical_bias="1.0" /> + app:layout_constraintVertical_bias=".8" /> + + + \ No newline at end of file