From 1e0978f47be8de828606fce3cd11029bdd92e73c Mon Sep 17 00:00:00 2001 From: Israel dela Cruz Date: Tue, 19 Mar 2019 23:40:04 -0500 Subject: [PATCH 1/2] almost finished --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 3 + .../CongresspeopleViewModel.java | 32 ++++++++ .../CongresspersonDetailsActivity.java | 57 +++++++++++++ .../CongresspersonDetailsViewModel.java | 23 ++++++ .../congressdetails/ListActivity.java | 79 ++++++++++++++++++- .../activity_congressperson_details.xml | 35 ++++++++ app/src/main/res/layout/activity_list.xml | 36 ++++++--- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 10 files changed, 258 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java create mode 100644 app/src/main/res/layout/activity_congressperson_details.xml diff --git a/app/build.gradle b/app/build.gradle index 0b6820d..38eefb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,4 +26,6 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.2' implementation project(':congressdataapiaccess-debug') androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation "android.arch.lifecycle:extensions:1.1.0" + implementation "android.arch.lifecycle:viewmodel:1.1.0" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26b1cb9..bc688bf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + + diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java new file mode 100644 index 0000000..1392d02 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java @@ -0,0 +1,32 @@ +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.CongresspersonOverview; + +import java.util.ArrayList; + +public class CongresspeopleViewModel extends ViewModel { + + private MutableLiveData> m_CongresspeopleLD = new MutableLiveData<>(); + + public LiveData> getCongresspeopleLD() { + + return m_CongresspeopleLD; + } + + // @NOTE this is thread safe + public void loadCongresspeople() { + ArrayList allMembers = CongressDao.getAllMembers(); + if (allMembers != null) { + // @NOTE postValue will send notification ASYNC to observer + m_CongresspeopleLD.postValue(allMembers); + // @NOTE setValue will send notification SYNC to observer, must be called from UI thread + } + } + + +} 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..b123e9c --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java @@ -0,0 +1,57 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.Observer; +import android.arch.lifecycle.ViewModelProviders; +import android.content.Intent; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + +public class CongresspersonDetailsActivity extends AppCompatActivity { + + private CongresspersonDetailsViewModel m_congresspersonDetailsViewModel; + private LinearLayout m_congresspersonLinearLayout; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_congressperson_details); + + m_congresspersonLinearLayout = findViewById(R.id.linear_layout_congressperson_details); + + m_congresspersonDetailsViewModel = ViewModelProviders.of(this).get(CongresspersonDetailsViewModel.class); + + Intent intent = getIntent(); + Object congresspersonIdObj = intent.getSerializableExtra("congressperson id"); + if (congresspersonIdObj != null) { + String congresspersonId = (String)congresspersonIdObj; + m_congresspersonDetailsViewModel.loadCongresspersonDetails(congresspersonId); + } + + m_congresspersonDetailsViewModel.getCongresspersonDetailsLD().observe(this, new CongresspersonDetailsObserver()); + } + + private class CongresspersonDetailsObserver implements Observer { + + @Override + public void onChanged(@Nullable CongresspersonDetails congresspersonDetails) { + if (congresspersonDetails == null) { + return; + } + + TextView textViewFullName = new TextView(CongresspersonDetailsActivity.this); + String fullName = congresspersonDetails.getFirstName(); + fullName += " " + congresspersonDetails.getMiddleName(); + fullName += " " + congresspersonDetails.getLastName(); + textViewFullName.setTextSize(25.f); + textViewFullName.setText(fullName); + + m_congresspersonLinearLayout.addView(textViewFullName); + + } + } +} 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..589dd51 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java @@ -0,0 +1,23 @@ +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 m_CongresspersonDetailsLD = new MutableLiveData<>(); + + public LiveData getCongresspersonDetailsLD() { + return m_CongresspersonDetailsLD; + } + + public void loadCongresspersonDetails(String id) { + + m_CongresspersonDetailsLD.postValue(CongressDao.getMemberDetails(id)); + + } + +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index 8be745a..9aa13b0 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -1,18 +1,93 @@ package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.ViewModelProviders; +import android.content.Intent; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import android.arch.lifecycle.Observer; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.util.ArrayList; public class ListActivity extends AppCompatActivity { + public static final String TAG = "MyDebug"; + + private CongresspeopleViewModel m_congresspeopleViewModel; + private LinearLayout m_congresspeopleLinearLayout; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); - CongressDao.getAllMembers(); +// if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED) { +// Log.d("MyDebug", "Write permission granted"); +// } +// else { +// Log.d("MyDebug", "Write permission denied"); +// +// ActivityCompat.requestPermissions(this, +// new String[] {Manifest.permission.INTERNET}, 1); +// } + + //ArrayList CongresspersonOverviews = CongressDao.getAllMembers(); + + m_congresspeopleLinearLayout = findViewById(R.id.linear_layout_congresspeople); + + // this will create the ViewModel + m_congresspeopleViewModel = ViewModelProviders.of(this).get(CongresspeopleViewModel.class); + + // @NOTE to future self, this loading should not be done here + // it should be done in another thread + m_congresspeopleViewModel.loadCongresspeople(); // this will download the data + // bind + m_congresspeopleViewModel.getCongresspeopleLD().observe(this, new CongresspersonObserver()); + } + + private class CongresspersonObserver implements Observer> { + + @Override + public void onChanged(@Nullable ArrayList arg) { + String threadName = Thread.currentThread().getName(); // @NOTE: UI thread + Log.d(TAG, "Observer onChanged Thread: " + threadName); + + if (arg == null) { + return; + } + + for (int i = 0; i < arg.size(); ++i) { + TextView newTextView = new TextView(ListActivity.this); + final CongresspersonOverview congressperson = arg.get(i); + String text = congressperson.getFirstName() + " " + congressperson.getLastName() + ", " + + congressperson.getParty() + " " + congressperson.getState(); + newTextView.setText(text); + newTextView.setTextSize(30.f); + newTextView.setTag(congressperson.getId()); + newTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // open details + Intent intent = new Intent(ListActivity.this, CongresspersonDetailsActivity.class); + intent.putExtra("congressperson id", congressperson.getId()); + startActivity(intent); + } + }); + + m_congresspeopleLinearLayout.addView(newTextView); + } + } + } + } + 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..ca91b4b --- /dev/null +++ b/app/src/main/res/layout/activity_congressperson_details.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + \ 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..f3e628b 100644 --- a/app/src/main/res/layout/activity_list.xml +++ b/app/src/main/res/layout/activity_list.xml @@ -1,18 +1,34 @@ - - + - \ No newline at end of file + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 077cb2f..af70df7 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.3.2' // 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..c764f4e 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 +#Tue Mar 19 09:55:26 CDT 2019 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.10.1-all.zip From c0900520df86f1f3f66836ebbb4464e2f7c629c6 Mon Sep 17 00:00:00 2001 From: Israel dela Cruz Date: Thu, 2 May 2019 15:41:37 -0500 Subject: [PATCH 2/2] first --- .idea/codeStyles/Project.xml | 29 -------- app/build.gradle | 1 + .../CongresspeopleAdapter.java | 72 +++++++++++++++++++ .../CongresspeopleViewModel.java | 24 ++++--- .../CongresspersonDetailsActivity.java | 43 +++++++---- .../CongresspersonDetailsRepository.java | 28 ++++++++ .../CongresspersonDetailsViewModel.java | 20 +++--- .../CongresspersonOverviewRepository.java | 36 ++++++++++ .../congressdetails/ListActivity.java | 64 ++++++----------- .../activity_congressperson_details.xml | 20 +++--- app/src/main/res/layout/activity_list.xml | 24 +------ .../main/res/layout/item_congressperson.xml | 17 +++++ 12 files changed, 244 insertions(+), 134 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleAdapter.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepository.java create mode 100644 app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepository.java create mode 100644 app/src/main/res/layout/item_congressperson.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 38eefb2..93d072d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,4 +28,5 @@ dependencies { androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation "android.arch.lifecycle:extensions:1.1.0" implementation "android.arch.lifecycle:viewmodel:1.1.0" + implementation 'com.android.support:recyclerview-v7:28.0.0-rc02' } diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleAdapter.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleAdapter.java new file mode 100644 index 0000000..a672932 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleAdapter.java @@ -0,0 +1,72 @@ +package com.lambdaschool.congressdetails; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import java.util.ArrayList; + +public class CongresspeopleAdapter extends RecyclerView.Adapter { + + private ArrayList congresspersonOverviews = new ArrayList<>(); + private OnCongresspersonClickListener onCongresspersonClickListener; + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_congressperson, viewGroup, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { + final CongresspersonOverview congresspersonOverview = congresspersonOverviews.get(i); + + String text = congresspersonOverview.getFirstName() + " " + congresspersonOverview.getLastName() + ", " + + congresspersonOverview.getParty() + ", " + congresspersonOverview.getState(); + viewHolder.detailsTextView.setText(text); + + viewHolder.detailsTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onCongresspersonClickListener != null) { + onCongresspersonClickListener.onClick(congresspersonOverview); + } + } + }); + } + + @Override + public int getItemCount() { + return congresspersonOverviews.size(); + } + + public void setCongresspersonOverviews(@NonNull ArrayList congresspersonOverviews) { + this.congresspersonOverviews = congresspersonOverviews; + notifyDataSetChanged(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + + public ViewHolder(@NonNull View itemView) { + super(itemView); + + detailsTextView = itemView.findViewById(R.id.item_congressperson_text_details); + } + + private TextView detailsTextView; + + } + + public interface OnCongresspersonClickListener { + void onClick(CongresspersonOverview congresspersonOverview); + } + + public void setOnCongresspersonClickListener(OnCongresspersonClickListener l) { + onCongresspersonClickListener = l; + } +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java index 1392d02..c9d7602 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspeopleViewModel.java @@ -3,29 +3,33 @@ import android.arch.lifecycle.LiveData; import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.ViewModel; +import android.support.annotation.AnyThread; -import com.lambdaschool.congressdataapiaccess.CongressDao; import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; import java.util.ArrayList; public class CongresspeopleViewModel extends ViewModel { - private MutableLiveData> m_CongresspeopleLD = new MutableLiveData<>(); + private MutableLiveData> m_CongresspeopleLD; + private CongresspersonOverviewRepository repository; public LiveData> getCongresspeopleLD() { + if (m_CongresspeopleLD == null) { + loadCongresspeople(); + } return m_CongresspeopleLD; } - // @NOTE this is thread safe - public void loadCongresspeople() { - ArrayList allMembers = CongressDao.getAllMembers(); - if (allMembers != null) { - // @NOTE postValue will send notification ASYNC to observer - m_CongresspeopleLD.postValue(allMembers); - // @NOTE setValue will send notification SYNC to observer, must be called from UI thread - } + private void loadCongresspeople() { + repository = new CongresspersonOverviewRepository(); + m_CongresspeopleLD = repository.getData(); + } + + @AnyThread + public void reload() { + repository.reload(m_CongresspeopleLD); } diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java index b123e9c..911fa1d 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsActivity.java @@ -13,7 +13,7 @@ public class CongresspersonDetailsActivity extends AppCompatActivity { - private CongresspersonDetailsViewModel m_congresspersonDetailsViewModel; + private CongresspersonDetailsViewModel congresspersonDetailsViewModel; private LinearLayout m_congresspersonLinearLayout; @Override @@ -23,16 +23,12 @@ protected void onCreate(Bundle savedInstanceState) { m_congresspersonLinearLayout = findViewById(R.id.linear_layout_congressperson_details); - m_congresspersonDetailsViewModel = ViewModelProviders.of(this).get(CongresspersonDetailsViewModel.class); + congresspersonDetailsViewModel = ViewModelProviders.of(this).get(CongresspersonDetailsViewModel.class); Intent intent = getIntent(); - Object congresspersonIdObj = intent.getSerializableExtra("congressperson id"); - if (congresspersonIdObj != null) { - String congresspersonId = (String)congresspersonIdObj; - m_congresspersonDetailsViewModel.loadCongresspersonDetails(congresspersonId); - } + String congresspersonId = intent.getStringExtra(ListActivity.KEY_EXTRA_CONGRESSPERSON_ID); - m_congresspersonDetailsViewModel.getCongresspersonDetailsLD().observe(this, new CongresspersonDetailsObserver()); + congresspersonDetailsViewModel.getCongresspersonDetailsLD(congresspersonId).observe(this, new CongresspersonDetailsObserver()); } private class CongresspersonDetailsObserver implements Observer { @@ -43,15 +39,36 @@ public void onChanged(@Nullable CongresspersonDetails congresspersonDetails) { return; } + // full name TextView textViewFullName = new TextView(CongresspersonDetailsActivity.this); - String fullName = congresspersonDetails.getFirstName(); - fullName += " " + congresspersonDetails.getMiddleName(); - fullName += " " + congresspersonDetails.getLastName(); - textViewFullName.setTextSize(25.f); + String fullName = "Name: "; + fullName += congresspersonDetails.getFirstName(); + if (!congresspersonDetails.getMiddleName().equals("null")) { + fullName += " " + congresspersonDetails.getMiddleName(); + } + if (!congresspersonDetails.getLastName().equals("null")) { + fullName += " " + congresspersonDetails.getLastName(); + } textViewFullName.setText(fullName); - + textViewFullName.setTextSize(25.f); m_congresspersonLinearLayout.addView(textViewFullName); + // party + TextView textViewParty = new TextView(CongresspersonDetailsActivity.this); + String party = "Party: "; + party += congresspersonDetails.getCurrentParty(); + textViewParty.setText(party); + textViewParty.setTextSize(25.f); + m_congresspersonLinearLayout.addView(textViewParty); + + // bInOffice + TextView textViewInOffice = new TextView(CongresspersonDetailsActivity.this); + String inOffice = "In office: "; + inOffice += congresspersonDetails.isInOffice() ? "Yes" : "No"; + textViewInOffice.setText(inOffice); + textViewInOffice.setTextSize(25.f); + m_congresspersonLinearLayout.addView(textViewInOffice); + } } } diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepository.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepository.java new file mode 100644 index 0000000..a4977bc --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsRepository.java @@ -0,0 +1,28 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.MutableLiveData; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonDetails; + +public class CongresspersonDetailsRepository { + + public MutableLiveData getData(String id) { + final MutableLiveData liveData = new MutableLiveData<>(); + + requestDetails(liveData, id); + + liveData.setValue(null); + return liveData; + } + + private void requestDetails(final MutableLiveData liveData, final String id) { + new Thread(new Runnable() { + @Override + public void run() { + liveData.postValue(CongressDao.getMemberDetails(id)); + } + }).start(); + } + +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java index 589dd51..eeb5463 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonDetailsViewModel.java @@ -4,20 +4,24 @@ 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 m_CongresspersonDetailsLD = new MutableLiveData<>(); - - public LiveData getCongresspersonDetailsLD() { + private MutableLiveData m_CongresspersonDetailsLD; + private CongresspersonDetailsRepository repository; + private String id; + + public LiveData getCongresspersonDetailsLD(String id) { + if (m_CongresspersonDetailsLD == null) { + this.id = id; + loadCongresspersonDetails(); + } return m_CongresspersonDetailsLD; } - public void loadCongresspersonDetails(String id) { - - m_CongresspersonDetailsLD.postValue(CongressDao.getMemberDetails(id)); - + private void loadCongresspersonDetails() { + repository = new CongresspersonDetailsRepository(); + m_CongresspersonDetailsLD = repository.getData(id); } } diff --git a/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepository.java b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepository.java new file mode 100644 index 0000000..1777645 --- /dev/null +++ b/app/src/main/java/com/lambdaschool/congressdetails/CongresspersonOverviewRepository.java @@ -0,0 +1,36 @@ +package com.lambdaschool.congressdetails; + +import android.arch.lifecycle.MutableLiveData; +import android.support.annotation.AnyThread; + +import com.lambdaschool.congressdataapiaccess.CongressDao; +import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; + +import java.util.ArrayList; + +public class CongresspersonOverviewRepository { + + public MutableLiveData> getData() { + final MutableLiveData> liveData = new MutableLiveData<>(); + + requestAllMembers(liveData); + + liveData.setValue(new ArrayList()); + return liveData; + } + + @AnyThread + public void reload(MutableLiveData> liveData) { + requestAllMembers(liveData); + } + + private void requestAllMembers(final MutableLiveData> liveData) { + new Thread(new Runnable() { + @Override + public void run() { + liveData.postValue(CongressDao.getAllMembers()); + } + }).start(); + } + +} diff --git a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java index 9aa13b0..16ad49d 100644 --- a/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java +++ b/app/src/main/java/com/lambdaschool/congressdetails/ListActivity.java @@ -10,6 +10,8 @@ import com.lambdaschool.congressdataapiaccess.CongresspersonOverview; import android.arch.lifecycle.Observer; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.LinearLayout; @@ -21,71 +23,47 @@ public class ListActivity extends AppCompatActivity { public static final String TAG = "MyDebug"; + public static final String KEY_EXTRA_CONGRESSPERSON_ID = "congressperson_id"; - private CongresspeopleViewModel m_congresspeopleViewModel; - private LinearLayout m_congresspeopleLinearLayout; + private CongresspeopleViewModel congresspeopleViewModel; + private CongresspeopleAdapter congresspeopleAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); -// if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED) { -// Log.d("MyDebug", "Write permission granted"); -// } -// else { -// Log.d("MyDebug", "Write permission denied"); -// -// ActivityCompat.requestPermissions(this, -// new String[] {Manifest.permission.INTERNET}, 1); -// } + RecyclerView congresspeopleRecyclerView = findViewById(R.id.activity_list_recycler_congresspeople); + congresspeopleRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); - //ArrayList CongresspersonOverviews = CongressDao.getAllMembers(); - - m_congresspeopleLinearLayout = findViewById(R.id.linear_layout_congresspeople); + congresspeopleAdapter = new CongresspeopleAdapter(); + congresspeopleAdapter.setOnCongresspersonClickListener(new CongresspeopleAdapter.OnCongresspersonClickListener() { + @Override + public void onClick(CongresspersonOverview congresspersonOverview) { + Intent intent = new Intent(ListActivity.this, CongresspersonDetailsActivity.class); + intent.putExtra(KEY_EXTRA_CONGRESSPERSON_ID, congresspersonOverview.getId()); + startActivity(intent); + } + }); + congresspeopleRecyclerView.setAdapter(congresspeopleAdapter); // this will create the ViewModel - m_congresspeopleViewModel = ViewModelProviders.of(this).get(CongresspeopleViewModel.class); + congresspeopleViewModel = ViewModelProviders.of(this).get(CongresspeopleViewModel.class); - // @NOTE to future self, this loading should not be done here - // it should be done in another thread - m_congresspeopleViewModel.loadCongresspeople(); // this will download the data // bind - m_congresspeopleViewModel.getCongresspeopleLD().observe(this, new CongresspersonObserver()); + congresspeopleViewModel.getCongresspeopleLD().observe(this, new CongresspersonObserver()); } private class CongresspersonObserver implements Observer> { @Override - public void onChanged(@Nullable ArrayList arg) { + public void onChanged(ArrayList arg) { String threadName = Thread.currentThread().getName(); // @NOTE: UI thread Log.d(TAG, "Observer onChanged Thread: " + threadName); - if (arg == null) { - return; - } + congresspeopleAdapter.setCongresspersonOverviews(arg); - for (int i = 0; i < arg.size(); ++i) { - TextView newTextView = new TextView(ListActivity.this); - final CongresspersonOverview congressperson = arg.get(i); - String text = congressperson.getFirstName() + " " + congressperson.getLastName() + ", " + - congressperson.getParty() + " " + congressperson.getState(); - newTextView.setText(text); - newTextView.setTextSize(30.f); - newTextView.setTag(congressperson.getId()); - newTextView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // open details - Intent intent = new Intent(ListActivity.this, CongresspersonDetailsActivity.class); - intent.putExtra("congressperson id", congressperson.getId()); - startActivity(intent); - } - }); - - m_congresspeopleLinearLayout.addView(newTextView); - } } } diff --git a/app/src/main/res/layout/activity_congressperson_details.xml b/app/src/main/res/layout/activity_congressperson_details.xml index ca91b4b..a625013 100644 --- a/app/src/main/res/layout/activity_congressperson_details.xml +++ b/app/src/main/res/layout/activity_congressperson_details.xml @@ -16,17 +16,17 @@ android:layout_height="match_parent" android:orientation="vertical"> - + + + + + - + + + + + diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml index f3e628b..37e8d32 100644 --- a/app/src/main/res/layout/activity_list.xml +++ b/app/src/main/res/layout/activity_list.xml @@ -6,29 +6,11 @@ android:layout_height="match_parent" tools:context=".ListActivity"> - - + - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_congressperson.xml b/app/src/main/res/layout/item_congressperson.xml new file mode 100644 index 0000000..fb8a1e7 --- /dev/null +++ b/app/src/main/res/layout/item_congressperson.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file