diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/ProposalsList.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/ProposalsList.java index e690352..33b768c 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/ProposalsList.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/ProposalsList.java @@ -5,8 +5,8 @@ import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.widget.ListView; +import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.External.SlidingTabLayout; import com.mdsgpp.cidadedemocratica.R; @@ -81,20 +81,23 @@ public void setDataUpdateListener(ProposalRequestResponseHandler handler) { handler.setRequestUpdateListener(this); } - public void afterSuccess() { + public void afterSuccess(JsonHttpResponseHandler handler) { progressDialog.dismiss(); loadProposalsList(); createToast(getString(R.string.message_success_load_proposals)); ProposalRequestResponseHandler.nextPageToRequest++; } + @Override + public void afterSuccess(JsonHttpResponseHandler handler, Object response) { + } private void createToast(String message) { FeedbackManager.createToast(this, message); } - public void afterError(String message) { + public void afterError(JsonHttpResponseHandler handler, String message) { } } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagDetailActivity.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagDetailActivity.java index 7010779..e7b6cf0 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagDetailActivity.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagDetailActivity.java @@ -1,24 +1,40 @@ package com.mdsgpp.cidadedemocratica.controller; +import android.app.ProgressDialog; import android.net.Uri; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.widget.ListView; import android.widget.TextView; +import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.R; +import com.mdsgpp.cidadedemocratica.model.Proposal; import com.mdsgpp.cidadedemocratica.model.Tag; import com.mdsgpp.cidadedemocratica.persistence.DataContainer; +import com.mdsgpp.cidadedemocratica.requester.ProposalRequestResponseHandler; +import com.mdsgpp.cidadedemocratica.requester.RequestUpdateListener; +import com.mdsgpp.cidadedemocratica.requester.Requester; +import com.mdsgpp.cidadedemocratica.requester.TaggingsRequestResponseHandler; import com.mdsgpp.cidadedemocratica.view.ListProposalFragment; -public class TagDetailActivity extends AppCompatActivity implements OnFragmentInteractionListener, ListProposalFragment.OnFragmentInteractionListener { +import java.lang.reflect.Array; +import java.util.ArrayList; + +public class TagDetailActivity extends AppCompatActivity implements OnFragmentInteractionListener, ListProposalFragment.OnFragmentInteractionListener, RequestUpdateListener { private Tag tag; private DataContainer dataContainter = DataContainer.getInstance(); private FragmentManager fragmentManager; + private ProgressDialog progressDialog; + + private TaggingsRequestResponseHandler taggingsRequestResponseHandler; + private ProposalRequestResponseHandler proposalRequestResponseHandler; + private String tagIdParameterKey = "tag_id"; + + private static ArrayList loadedTagIds = new ArrayList<>(); @Override @@ -35,10 +51,19 @@ protected void onCreate(Bundle savedInstanceState) { TextView tagNameTextView = (TextView)findViewById(R.id.tagNameTextView); tagNameTextView.setText(this.tag.getName()); + if (!loadedTagIds.contains(tag.getId())) { + pullTaggingsData(); + } else { + loadProposalsList(tag.getProposals()); + } + + } + + private void loadProposalsList(ArrayList proposals) { + getSupportFragmentManager().beginTransaction(). - replace(R.id.container, ListProposalFragment.newInstance(this.tag.getProposals())). + replace(R.id.container, ListProposalFragment.newInstance(proposals)). commit(); - } @Override @@ -50,4 +75,36 @@ public void onFragmentInteraction(Fragment fragment) { public void onFragmentInteraction(Uri uri) { } + + private void pullTaggingsData() { + if (progressDialog == null) { + progressDialog = FeedbackManager.createProgressDialog(this, getString(R.string.message_load_tag_detail)); + } + + proposalRequestResponseHandler = new ProposalRequestResponseHandler(); + proposalRequestResponseHandler.setRequestUpdateListener(this); + + Requester requester = new Requester(ProposalRequestResponseHandler.proposalsEndpointUrl, proposalRequestResponseHandler); + requester.setParameter(tagIdParameterKey, String.valueOf(tag.getId())); + requester.request(Requester.RequestType.GET); + } + + @Override + public void afterSuccess(JsonHttpResponseHandler handler) { + + } + + @Override + public void afterSuccess(JsonHttpResponseHandler handler, Object response) { + progressDialog.dismiss(); + ArrayList proposals = (ArrayList) response; + + tag.setProposals(proposals); + loadProposalsList(proposals); + } + + @Override + public void afterError(JsonHttpResponseHandler handler, String message) { + + } } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagginsList.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagginsList.java index 414ba51..c8c15f1 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagginsList.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagginsList.java @@ -10,17 +10,21 @@ import android.widget.TextView; import android.widget.Toast; +import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.R; import com.mdsgpp.cidadedemocratica.model.Proposal; import com.mdsgpp.cidadedemocratica.model.Tag; +import com.mdsgpp.cidadedemocratica.model.Tagging; import com.mdsgpp.cidadedemocratica.persistence.DataContainer; -import com.mdsgpp.cidadedemocratica.requester.ProposalRequestResponseHandler; +import com.mdsgpp.cidadedemocratica.requester.RequestUpdateListener; import com.mdsgpp.cidadedemocratica.requester.Requester; +import com.mdsgpp.cidadedemocratica.requester.TagRequestResponseHandler; import com.mdsgpp.cidadedemocratica.requester.TaggingsRequestResponseHandler; +import java.lang.reflect.Array; import java.util.ArrayList; -public class TagginsList extends AppCompatActivity implements View.OnClickListener{ +public class TagginsList extends AppCompatActivity implements View.OnClickListener, RequestUpdateListener { ListView tagginsListView; TextView proposalTitleTextView; @@ -29,7 +33,15 @@ public class TagginsList extends AppCompatActivity implements View.OnClickListen Button shareButton; Proposal proposal; - ProgressDialog progressDialog; + private ProgressDialog progressDialog; + TagListAdapter taggingsAdapter; + + TaggingsRequestResponseHandler taggingsRequestResponseHandler; + TagRequestResponseHandler tagRequestResponseHandler; + + private static ArrayList loadedProposalIds = new ArrayList<>(); + + private static String proposalIdParameterKey = "proposal_id"; @Override protected void onCreate(Bundle savedInstanceState) { @@ -52,25 +64,16 @@ protected void onCreate(Bundle savedInstanceState) { relevanceTextView.setText(String.valueOf(proposal.getRelevance())); tagginsListView = (ListView) findViewById(R.id.listaTagsDaPropostaID); - ArrayList tags = getTagsList(); - - if (tags == null) { - Toast.makeText(getApplicationContext(),"Proposta não possui TAGS", Toast.LENGTH_SHORT); - } - TagListAdapter tagginsAdapter = new TagListAdapter(this, tags); - - tagginsListView.setAdapter(tagginsAdapter); shareButton = (Button) findViewById(R.id.shareButton); shareButton.setOnClickListener(this); - } - private ArrayList getTagsList() { - if (proposal != null) { - return proposal.getTags(); + if (!loadedProposalIds.contains(proposal.getId())) { + pullTaggingsData(); } else { - return null; + setTagsListViewAdapter(proposal.getTags()); } + } private void shareProposal(){ @@ -78,26 +81,55 @@ private void shareProposal(){ String subjectShare = getString(R.string.title_sharing) + " " + proposal.getTitle(); String contentShare = getString(R.string.link_site_cidade_democratica) + "topico/" + this.proposal.getId() + "-" + this.proposal.getSlug() + "\n" + subjectShare + getString(R.string.title_sharing_description) + proposal.getContent(); - Intent intentShare =new Intent(android.content.Intent.ACTION_SEND); + Intent intentShare = new Intent(android.content.Intent.ACTION_SEND); intentShare.setType("text/plain"); - intentShare.putExtra(android.content.Intent.EXTRA_SUBJECT,subjectShare); + intentShare.putExtra(android.content.Intent.EXTRA_SUBJECT, subjectShare); intentShare.putExtra(android.content.Intent.EXTRA_TEXT, contentShare); startActivity(Intent.createChooser(intentShare,getString(R.string.name_action_share))); } + private void setTagsListViewAdapter(ArrayList tags) { + + taggingsAdapter = new TagListAdapter(this, tags); + tagginsListView.setAdapter(taggingsAdapter); + } + private void pullTaggingsData() { - progressDialog = FeedbackManager.createProgressDialog(this, getString(R.string.message_load_proposals)); - TaggingsRequestResponseHandler taggingsRequestResponseHandler = new TaggingsRequestResponseHandler(); - setDataUpdateListener(taggingsRequestResponseHandler); - Requester requester = new Requester(ProposalRequestResponseHandler.proposalsEndpointUrl, taggingsRequestResponseHandler); + if (progressDialog == null) { + progressDialog = FeedbackManager.createProgressDialog(this, getString(R.string.message_load_proposal_detail)); + } + + tagRequestResponseHandler = new TagRequestResponseHandler(); + tagRequestResponseHandler.setRequestUpdateListener(this); + + Requester requester = new Requester(TagRequestResponseHandler.tagsEndpointUrl, tagRequestResponseHandler); + requester.setParameter(proposalIdParameterKey, String.valueOf(proposal.getId())); requester.request(Requester.RequestType.GET); } - private void setDataUpdateListener(TaggingsRequestResponseHandler handler) { + @Override + public void afterSuccess(JsonHttpResponseHandler handler) { + + } + + @Override + public void afterSuccess(JsonHttpResponseHandler handler, Object response) { + + ArrayList tags = (ArrayList) response; + + progressDialog.dismiss(); + FeedbackManager.createToast(this, getString(R.string.message_success_load_tags)); + + proposal.setTags(tags); + setTagsListViewAdapter(tags); + } + + @Override + public void afterError(JsonHttpResponseHandler handler, String message) { } @Override diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagsList.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagsList.java index b13648d..3c6180c 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagsList.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/TagsList.java @@ -9,6 +9,7 @@ import android.widget.AdapterView; import android.widget.ListView; +import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.R; import com.mdsgpp.cidadedemocratica.model.Tag; import com.mdsgpp.cidadedemocratica.persistence.DataContainer; @@ -108,7 +109,7 @@ private void setDataUpdateListener(TagRequestResponseHandler tagRequestResponseH } @Override - public void afterSuccess() { + public void afterSuccess(JsonHttpResponseHandler handler) { progressDialog.dismiss(); loadTagsList(); FeedbackManager.createToast(this, getString(R.string.message_success_load_tags)); @@ -116,7 +117,12 @@ public void afterSuccess() { } @Override - public void afterError(String message) { + public void afterSuccess(JsonHttpResponseHandler handler, Object response) { + + } + + @Override + public void afterError(JsonHttpResponseHandler handler, String message) { progressDialog.dismiss(); FeedbackManager.createToast(this, message); } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UserProfile.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UserProfile.java index 6900702..c96eed9 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UserProfile.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UserProfile.java @@ -1,23 +1,27 @@ package com.mdsgpp.cidadedemocratica.controller; +import android.app.ProgressDialog; import android.net.Uri; -import android.provider.ContactsContract; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.R; import com.mdsgpp.cidadedemocratica.model.Proposal; import com.mdsgpp.cidadedemocratica.model.User; import com.mdsgpp.cidadedemocratica.persistence.DataContainer; +import com.mdsgpp.cidadedemocratica.requester.ProposalRequestResponseHandler; +import com.mdsgpp.cidadedemocratica.requester.RequestUpdateListener; +import com.mdsgpp.cidadedemocratica.requester.Requester; +import com.mdsgpp.cidadedemocratica.requester.UserRequestResponseHandler; import com.mdsgpp.cidadedemocratica.view.ListProposalFragment; import java.util.ArrayList; -public class UserProfile extends AppCompatActivity implements ListProposalFragment.OnFragmentInteractionListener { +public class UserProfile extends AppCompatActivity implements ListProposalFragment.OnFragmentInteractionListener, RequestUpdateListener { User user; TextView userName; @@ -25,6 +29,13 @@ public class UserProfile extends AppCompatActivity implements ListProposalFragme TextView relevanceTextView; ListView userProposals; + private ProgressDialog progressDialog; + private ProposalRequestResponseHandler proposalRequestResponseHandler; + private static String userIdParameterKey = "user_id"; + private UserRequestResponseHandler userRequestResponseHandler; + + private static ArrayList loadedUserIds = new ArrayList<>(); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -44,27 +55,65 @@ protected void onCreate(Bundle savedInstanceState) { relevanceTextView = (TextView)findViewById(R.id.relevanceTextView); relevanceTextView.setText(String.valueOf(user.getRelevance())); - ArrayList proposals = getProposalList(); - if(proposals == null){ + if (!loadedUserIds.contains(user.getId())) { + pullUsersProposals(); + } else { + loadProposalsList(); + } + + } + + @Override + public void onFragmentInteraction(Uri uri) { + + } + + private void loadProposalsList() { + + + ArrayList proposals = user.getProposals(); + if(proposals == null) { Toast.makeText(getApplicationContext(),"Usuário não possui propostas", Toast.LENGTH_SHORT); } ListProposalFragment proposalFragment = ListProposalFragment.newInstance(proposals); - getSupportFragmentManager().beginTransaction().replace(R.id.container, proposalFragment).commit(); - } - private ArrayList getProposalList() { - if (user != null) { - return user.getProposals(); - } else { - return null; + private void pullUsersProposals() { + if (progressDialog == null) { + progressDialog = FeedbackManager.createProgressDialog(this, getString(R.string.message_load_proposal_detail)); } + + proposalRequestResponseHandler = new ProposalRequestResponseHandler(); + proposalRequestResponseHandler.setRequestUpdateListener(this); + + Requester requester = new Requester(ProposalRequestResponseHandler.proposalsEndpointUrl, proposalRequestResponseHandler); + requester.setParameter(userIdParameterKey, String.valueOf(user.getId())); + requester.request(Requester.RequestType.GET); } + @Override - public void onFragmentInteraction(Uri uri) { + public void afterSuccess(JsonHttpResponseHandler handler) { + + } + + @Override + public void afterSuccess(JsonHttpResponseHandler handler, Object response) { + + progressDialog.dismiss(); + + ArrayList proposals = (ArrayList) response; + + user.setProposals(proposals); + loadProposalsList(); + + loadedUserIds.add(user.getId()); + } + + @Override + public void afterError(JsonHttpResponseHandler handler, String message) { } } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UsersList.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UsersList.java index 39285b0..f28a6cf 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UsersList.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/controller/UsersList.java @@ -9,6 +9,7 @@ import android.widget.AdapterView; import android.widget.ListView; +import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.R; import com.mdsgpp.cidadedemocratica.model.User; import com.mdsgpp.cidadedemocratica.persistence.DataContainer; @@ -107,7 +108,7 @@ private void setDataUpdateListener(UserRequestResponseHandler handler) { } @Override - public void afterSuccess() { + public void afterSuccess(JsonHttpResponseHandler handler) { progressDialog.dismiss(); loadUsersList(); createToast(getString(R.string.message_success_load_users)); @@ -115,7 +116,12 @@ public void afterSuccess() { } @Override - public void afterError(String message) { + public void afterSuccess(JsonHttpResponseHandler handler, Object response) { + + } + + @Override + public void afterError(JsonHttpResponseHandler handler, String message) { progressDialog.dismiss(); createToast(message); } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/model/Tagging.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/model/Tagging.java new file mode 100644 index 0000000..6313b18 --- /dev/null +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/model/Tagging.java @@ -0,0 +1,30 @@ +package com.mdsgpp.cidadedemocratica.model; + +/** + * Created by andreanmasiro on 10/25/16. + */ + +public class Tagging { + + private long tagId = 0; + private long taggableId = 0; + private long taggerId = 0; + + public Tagging(long tagId, long taggableId, long taggerId) { + this.tagId = tagId; + this.taggableId = taggableId; + this.taggerId = taggerId; + } + + public long getTagId() { + return tagId; + } + + public long getTaggableId() { + return taggableId; + } + + public long getTaggerId() { + return taggerId; + } +} diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/model/User.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/model/User.java index 1232be9..29757ec 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/model/User.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/model/User.java @@ -42,15 +42,7 @@ public long getProposalCount() { } public ArrayList getProposals() { - DataContainer dataContainer = DataContainer.getInstance(); - ArrayList proposalsList = dataContainer.getProposals(); - ArrayList resultProposalsList = new ArrayList(0); - for (Proposal idProposals: proposalsList){ - if (idProposals.getUserId() == id){ - resultProposalsList.add(idProposals); - } - } - return resultProposalsList; + return this.proposals; } public ArrayList getMostUsedTags() { @@ -60,6 +52,11 @@ public ArrayList getMostUsedTags() { public void setMostUsedTags(ArrayList mostUsedTags) { this.mostUsedTags = mostUsedTags; } + + public void setProposals(ArrayList proposals) { + this.proposals = proposals; + } + public long getId(){ return this.id; } public long getRelevance() { diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataContainer.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataContainer.java index 8deae50..a0a9f2e 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataContainer.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataContainer.java @@ -2,9 +2,11 @@ import com.mdsgpp.cidadedemocratica.model.Proposal; import com.mdsgpp.cidadedemocratica.model.Tag; +import com.mdsgpp.cidadedemocratica.model.Tagging; import com.mdsgpp.cidadedemocratica.model.User; import java.util.ArrayList; +import java.util.Collections; /** * Created by andreanmasiro on 9/9/16. @@ -14,6 +16,7 @@ public class DataContainer { private ArrayList tags = new ArrayList<>(); private ArrayList users = new ArrayList<>(); private ArrayList proposals = new ArrayList<>(); + private ArrayList taggings = new ArrayList<>(); private ArrayList dataUpdateListeners = new ArrayList<>(); private static DataContainer instance; @@ -42,6 +45,10 @@ public ArrayList getProposals() { return proposals; } + public ArrayList getTaggings() { + return taggings; + } + public void setDataUpdateListener(DataUpdateListener dataUpdateListener) { this.dataUpdateListeners.add(dataUpdateListener); } @@ -82,6 +89,46 @@ public User getUserForId(long id){ return user; } + public ArrayList getProposalsForUserId(long id) { + ArrayList proposals = new ArrayList<>(); + for (Proposal p : this.proposals) { + if (p.getUserId() == id) { + proposals.add(p); + } else { /* not this one */ } + } + return proposals; + } + + public ArrayList getTaggingsForTagId(long id) { + ArrayList taggings = new ArrayList<>(); + for (Tagging t : this.taggings) { + if (t.getTagId() == id) { + taggings.add(t); + } else { /* not this one */ } + } + return taggings; + } + + public ArrayList getTaggingsForProposalId(long id) { + ArrayList taggings = new ArrayList<>(); + for (Tagging t : this.taggings) { + if (t.getTaggableId() == id) { + taggings.add(t); + } else { /* not this one */ } + } + return taggings; + } + + public ArrayList getTaggingsForUserId(long id) { + ArrayList taggings = new ArrayList<>(); + for (Tagging t : this.taggings) { + if (t.getTaggerId() == id) { + taggings.add(t); + } else { /* not this one */ } + } + return taggings; + } + public void addTag(Tag tag) { this.tags.add(tag); this.notifyTagsUpdate(); @@ -97,21 +144,34 @@ public void addProposal(Proposal proposal) { this.notifyProposalsUpdate(); } + public void addTagging(Tagging tagging) { + this.taggings.add(tagging); + this.notifyTaggingsUpdate(); + } + public void addTags(ArrayList tags) { this.tags.addAll(tags); + Collections.sort(tags); this.notifyTagsUpdate(); } public void addUsers(ArrayList users) { this.users.addAll(users); + Collections.sort(users); this.notifyUsersUpdate(); } public void addProposals(ArrayList proposals) { this.proposals.addAll(proposals); + Collections.sort(proposals); this.notifyProposalsUpdate(); } + public void addTaggings(ArrayList taggings) { + this.taggings.addAll(taggings); + this.notifyTaggingsUpdate(); + } + public void setTags(ArrayList tags) { this.tags = tags; this.notifyTagsUpdate(); @@ -127,6 +187,11 @@ public void setUsers(ArrayList users) { this.notifyUsersUpdate(); } + public void setTaggings(ArrayList taggings) { + this.taggings = taggings; + this.notifyTaggingsUpdate(); + } + public void clearTags() { this.tags.clear(); this.notifyTagsUpdate(); @@ -142,6 +207,11 @@ public void clearUsers() { this.notifyUsersUpdate(); } + public void clearTaggings() { + this.taggings.clear(); + this.notifyTaggingsUpdate(); + } + private void notifyTagsUpdate() { for (DataUpdateListener listener : this.dataUpdateListeners) { listener.tagsUpdated(); @@ -159,4 +229,10 @@ private void notifyUsersUpdate() { listener.usersUpdated(); } } + + private void notifyTaggingsUpdate() { + for (DataUpdateListener listener : this.dataUpdateListeners) { + listener.taggingsUpdated(); + } + } } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListener.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListener.java index 13a8d15..7d54757 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListener.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListener.java @@ -8,4 +8,5 @@ public interface DataUpdateListener { public void tagsUpdated(); public void proposalsUpdated(); public void usersUpdated(); + public void taggingsUpdated(); } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/ProposalRequestResponseHandler.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/ProposalRequestResponseHandler.java index f6a1f54..18a3094 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/ProposalRequestResponseHandler.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/ProposalRequestResponseHandler.java @@ -69,21 +69,30 @@ public int compare(Proposal p1, Proposal p2) { return p1.compareTo(p2); } }); + proposals.removeAll(dataContainer.getProposals()); dataContainer.addProposals(proposals); afterSuccess(); + afterSuccess(proposals); } } private void afterSuccess() { if (requestUpdateListener != null) { - requestUpdateListener.afterSuccess(); + requestUpdateListener.afterSuccess(this); + } else { } + } + + private void afterSuccess(ArrayList response) { + if (requestUpdateListener != null) { + + requestUpdateListener.afterSuccess(this, (Object) response); } else { } } private void afterError(String message) { if (requestUpdateListener != null) { - requestUpdateListener.afterError(message); + requestUpdateListener.afterError(this, message); } else { } } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/RequestUpdateListener.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/RequestUpdateListener.java index ad3fa93..e9dad36 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/RequestUpdateListener.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/RequestUpdateListener.java @@ -1,11 +1,17 @@ package com.mdsgpp.cidadedemocratica.requester; +import com.loopj.android.http.JsonHttpResponseHandler; + +import java.util.ArrayList; +import java.util.Objects; + /** * Created by luisresende on 18/10/16. */ public interface RequestUpdateListener { - void afterSuccess(); - void afterError(String message); + void afterSuccess(JsonHttpResponseHandler handler); + void afterSuccess(JsonHttpResponseHandler handler, Object response); + void afterError(JsonHttpResponseHandler handler, String message); } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/Requester.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/Requester.java index b736a90..a7fb43f 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/Requester.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/Requester.java @@ -20,9 +20,10 @@ public static enum RequestType { } private String url = ""; - private HashMap parameters = new HashMap(); + private HashMap parameters = new HashMap<>(); private AsyncHttpResponseHandler responseHandler; private static AsyncHttpClient client = Looper.myLooper() == null ? new SyncHttpClient() : new AsyncHttpClient(); + private static SyncHttpClient syncClient = new SyncHttpClient(); public Requester(String url, AsyncHttpResponseHandler responseHandler) { this.url = url; @@ -40,6 +41,19 @@ public void request(RequestType method) { } } + public void syncRequest(RequestType method) { + if (method == RequestType.GET) { + + String endpoint = this.url; + String prefix = "?"; + for (String key : parameters.keySet()) { + endpoint += prefix + key + "=" + parameters.get(key); + prefix = "&"; + } + syncClient.get(endpoint, this.responseHandler); + } + } + public void setParameter(String key, String parameter) { parameters.put(key, parameter); } diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TagRequestResponseHandler.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TagRequestResponseHandler.java index 9d69a2c..7647071 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TagRequestResponseHandler.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TagRequestResponseHandler.java @@ -54,16 +54,36 @@ public int compare(Tag t1, Tag t2) { return t1.compareTo(t2); } }); + tags.removeAll(dataContainer.getTags()); dataContainer.addTags(tags); - requestUpdateListener.afterSuccess(); + afterSuccess(); + afterSuccess(tags); } } + private void afterSuccess() { + if (requestUpdateListener != null) { + requestUpdateListener.afterSuccess(this); + } else { } + } + + private void afterSuccess(ArrayList response) { + if (requestUpdateListener != null) { + requestUpdateListener.afterSuccess(this, (Object) response); + } else { } + } + + private void afterError(String message) { + if (requestUpdateListener != null) { + requestUpdateListener.afterError(this, message); + } else { } + } + @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); - requestUpdateListener.afterError(String.valueOf(statusCode)); + afterError(String.valueOf(statusCode)); } public RequestUpdateListener getRequestUpdateListener() { diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TaggingsRequestResponseHandler.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TaggingsRequestResponseHandler.java index 1b89f2f..317ceb6 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TaggingsRequestResponseHandler.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/TaggingsRequestResponseHandler.java @@ -3,6 +3,7 @@ import com.loopj.android.http.JsonHttpResponseHandler; import com.mdsgpp.cidadedemocratica.model.Proposal; import com.mdsgpp.cidadedemocratica.model.Tag; +import com.mdsgpp.cidadedemocratica.model.Tagging; import com.mdsgpp.cidadedemocratica.persistence.DataContainer; import org.json.JSONArray; @@ -26,7 +27,8 @@ public class TaggingsRequestResponseHandler extends JsonHttpResponseHandler { private DataContainer dataContainer = DataContainer.getInstance(); private final String taggingTagIdKey = "tag_id"; private final String taggingTaggableIdKey = "taggable_id"; - private final String taggingTaggableTypeKey = "taggable_type"; + private final String taggingTaggerIdKey = "tagger_id"; + public static final String taggingsEndpointUrl = "http://cidadedemocraticaapi.herokuapp.com/api/v0/taggings"; private RequestUpdateListener requestUpdateListener; @@ -38,39 +40,49 @@ public void onSuccess(int statusCode, Header[] headers, JSONArray response) { if (statusCode == 200) { + ArrayList taggings = new ArrayList<>(); for (int i = 0; i < response.length(); ++i) { try { JSONObject taggingJson = response.getJSONObject(i); - String taggableType = taggingJson.getString(taggingTaggableTypeKey); - if (taggableType.equals("Topico")) { + long tagId = taggingJson.getLong(taggingTagIdKey); + long proposalId = taggingJson.getLong(taggingTaggableIdKey); + long taggerId = taggingJson.getLong(taggingTaggerIdKey); - long tagId = taggingJson.getLong(taggingTagIdKey); - long proposalId = taggingJson.getLong(taggingTaggableIdKey); - - Tag tag = dataContainer.getTagForId(tagId); - Proposal proposal = dataContainer.getProposalForId(proposalId); - - if (tag != null && proposal != null) { - - addTagForProposalId(proposalId, tag); - addProposalForTagId(tagId, proposal); - - } else { /* Tag or Proposal does not exist */ } - - } else { /* Taggable is not a topic */ } + Tagging tagging = new Tagging(tagId, proposalId, taggerId); + taggings.add(tagging); } catch (JSONException e) { e.printStackTrace(); } } - setProposalsTags(); - setTagsProposals(); + taggings.removeAll(dataContainer.getTaggings()); + dataContainer.addTaggings(taggings); + afterSuccess(); + afterSuccess(taggings); } } + private void afterSuccess() { + if (requestUpdateListener != null) { + requestUpdateListener.afterSuccess(this); + } else { } + } + + private void afterSuccess(ArrayList response) { + if (requestUpdateListener != null) { + requestUpdateListener.afterSuccess(this, (Object) response); + } else { } + } + + private void afterError(String message) { + if (requestUpdateListener != null) { + requestUpdateListener.afterError(this, message); + } else { } + } + private void setTagsProposals() { Set tagIdKeySet = tagTaggings.keySet(); @@ -134,6 +146,7 @@ private void addTagForProposalId(long proposalId, Tag tag) { @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); + afterError(String.valueOf(statusCode)); } public RequestUpdateListener getRequestUpdateListener() { diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/UserRequestResponseHandler.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/UserRequestResponseHandler.java index abe796e..4a00386 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/UserRequestResponseHandler.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/requester/UserRequestResponseHandler.java @@ -63,15 +63,35 @@ public int compare(User u1, User u2) { return u1.compareTo(u2); } }); + users.removeAll(dataContainer.getUsers()); dataContainer.addUsers(users); - requestUpdateListener.afterSuccess(); + afterSuccess(); + afterSuccess(users); } } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); - requestUpdateListener.afterError(String.valueOf(statusCode)); + afterError(String.valueOf(statusCode)); + } + + private void afterSuccess() { + if (requestUpdateListener != null) { + requestUpdateListener.afterSuccess(this); + } else { } + } + + private void afterSuccess(ArrayList response) { + if (requestUpdateListener != null) { + requestUpdateListener.afterSuccess(this, (Object) response); + } else { } + } + + private void afterError(String message) { + if (requestUpdateListener != null) { + requestUpdateListener.afterError(this, message); + } else { } } public RequestUpdateListener getRequestUpdateListener() { diff --git a/app/src/main/java/com/mdsgpp/cidadedemocratica/view/ListProposalFragment.java b/app/src/main/java/com/mdsgpp/cidadedemocratica/view/ListProposalFragment.java index 96b5760..bf5ecc3 100644 --- a/app/src/main/java/com/mdsgpp/cidadedemocratica/view/ListProposalFragment.java +++ b/app/src/main/java/com/mdsgpp/cidadedemocratica/view/ListProposalFragment.java @@ -1,6 +1,7 @@ package com.mdsgpp.cidadedemocratica.view; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.DataSetObserver; @@ -101,15 +102,23 @@ public void onScrollStateChanged(AbsListView absListView, int i) { @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + final int itemCountTrigger = totalItemCount/2; final int lastItem = firstVisibleItem + visibleItemCount; - if(lastItem == totalItemCount - 15) { - if(preLast != lastItem) { - preLast = lastItem; - ((ProposalsList) getActivity()).pullProposalsData(); + Activity ac = getActivity(); + if (ac != null) { + if (getActivity().getClass() == ProposalsList.class) { + if(lastItem == totalItemCount - (itemCountTrigger > 15 ? 15 : itemCountTrigger)) { + if(preLast != lastItem) { + preLast = lastItem; + ((ProposalsList)getActivity()).pullProposalsData(); + } + + } + } else { + } } - } }); return view; @@ -161,4 +170,9 @@ public void proposalsUpdated() { public void usersUpdated() { } + + @Override + public void taggingsUpdated() { + + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bb65b60..bde0dfc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,5 +19,7 @@ Novas tags carregadas com sucesso! Carregando propostas... Novas propostas carregadas com sucesso! + Carregando tags da proposta... + Carregando propostas da tag... Hello blank fragment diff --git a/app/src/test/java/com/mdsgpp/cidadedemocratica/model/TaggingTest.java b/app/src/test/java/com/mdsgpp/cidadedemocratica/model/TaggingTest.java new file mode 100644 index 0000000..9c51505 --- /dev/null +++ b/app/src/test/java/com/mdsgpp/cidadedemocratica/model/TaggingTest.java @@ -0,0 +1,42 @@ +package com.mdsgpp.cidadedemocratica.model; + +import org.junit.Test; +import android.test.AndroidTestCase; +import java.net.PortUnreachableException; +import java.util.ArrayList; + +import static org.junit.Assert.assertEquals; + +/** + * Created by gabriel on 25/10/16. + */ +public class TaggingTest { + private Tagging tagging = newTagging(); + + + + private final long tagId = 1; + private final long taggableId = 1; + private final long taggerId = 1; + + @Test + public void testGetID(){ + assertEquals(tagging.getTagId(),tagId); + } + + @Test + public void testGetTaggableID(){ + assertEquals(tagging.getTaggableId(),taggableId); + } + + @Test + public void testGetTaggerID(){ + assertEquals(tagging.getTaggerId(),taggerId); + } + + + private Tagging newTagging(){ + return new Tagging(tagId,taggableId,taggerId); + } + +} diff --git a/app/src/test/java/com/mdsgpp/cidadedemocratica/model/UserTest.java b/app/src/test/java/com/mdsgpp/cidadedemocratica/model/UserTest.java index 62ff493..902061d 100644 --- a/app/src/test/java/com/mdsgpp/cidadedemocratica/model/UserTest.java +++ b/app/src/test/java/com/mdsgpp/cidadedemocratica/model/UserTest.java @@ -65,7 +65,9 @@ public void testGetsTags() { @Test public void testGetProposal(){ - assertEquals(this.user.getProposals(),proposals); + assertTrue(this.user.getProposals().isEmpty()); + user.setProposals(proposals); + assertEquals(this.user.getProposals(), proposals); } @Test diff --git a/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataContainerTest.java b/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataContainerTest.java index 178547c..568e25a 100644 --- a/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataContainerTest.java +++ b/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataContainerTest.java @@ -4,6 +4,7 @@ import com.mdsgpp.cidadedemocratica.model.Proposal; import com.mdsgpp.cidadedemocratica.model.Tag; +import com.mdsgpp.cidadedemocratica.model.Tagging; import com.mdsgpp.cidadedemocratica.model.User; import org.junit.Test; @@ -42,6 +43,25 @@ public void testAddTag() { assertTrue(DataContainer.getInstance().getTags().containsAll(tags)); } + @Test + public void testAddTagging(){ + + + Tagging tagging = newTagging(); + assertFalse(DataContainer.getInstance().getTaggings().contains(tagging)); + dataContainer.addTagging(tagging); + assertTrue(DataContainer.getInstance().getTaggings().contains(tagging)); + ArrayList taggingsArray = new ArrayList(); + for(int i=0;i<10;i++){ + Tagging tagging1 = newTagging(); + taggingsArray.add(tagging1); + } + assertFalse(DataContainer.getInstance().getTaggings().containsAll(taggingsArray)); + dataContainer.addTaggings(taggingsArray); + assertTrue(DataContainer.getInstance().getTaggings().containsAll(taggingsArray)); + + } + @Test public void testAddProposal() { Proposal proposal = newProposal(); @@ -96,6 +116,17 @@ public void testSetTags() { assertEquals(tags, dataContainer.getTags()); } + @Test + public void testSetTaggins(){ + ArrayList taggings = new ArrayList(); + taggings.add(newTagging()); + taggings.add(newTagging()); + taggings.add(newTagging()); + + dataContainer.setTaggings(taggings); + assertEquals(taggings,dataContainer.getTaggings()); + + } @Test public void testSetProposals() { @@ -139,6 +170,18 @@ public void testClearTags() { assertEquals(dataContainer.getTags().size(), 0); } + @Test + public void testClearTaggins(){ + ArrayList taggings = new ArrayList(); + taggings.add(newTagging()); + taggings.add(newTagging()); + taggings.add(newTagging()); + dataContainer.setTaggings(taggings); + assertEquals(taggings,dataContainer.getTaggings()); + dataContainer.clearTaggings(); + assertEquals(dataContainer.getTaggings().size(),0); + } + @Test public void testClearProposals() { @@ -185,6 +228,100 @@ public void testGetTagForId() { assertNotNull(this.dataContainer.getTagForId(99)); } + @Test + public void testGetTaggingForProposalId(){ + this.dataContainer.addTagging(newTagging(1, 1, 1)); + this.dataContainer.addTagging(newTagging(2, 2, 2)); + this.dataContainer.addTagging(newTagging(3, 3, 3)); + this.dataContainer.addTagging(newTagging(4, 4, 4)); + + assertTrue(this.dataContainer.getTaggingsForProposalId(99).isEmpty()); + + long pId = 99; + + this.dataContainer.addTagging(newTagging(1, pId, 1)); + this.dataContainer.addTagging(newTagging(13, pId, 1)); + this.dataContainer.addTagging(newTagging(2, pId, 1)); + this.dataContainer.addTagging(newTagging(15, pId, 1)); + + ArrayList taggings = this.dataContainer.getTaggingsForProposalId(pId); + for (Tagging tagging : taggings) { + assertEquals(tagging.getTaggableId(), pId); + } + } + + @Test + public void testGetTaggingForUserId(){ + this.dataContainer.addTagging(newTagging(1, 1, 1)); + this.dataContainer.addTagging(newTagging(2, 2, 2)); + this.dataContainer.addTagging(newTagging(3, 3, 3)); + this.dataContainer.addTagging(newTagging(4, 4, 4)); + + assertTrue(this.dataContainer.getTaggingsForUserId(99).isEmpty()); + + long pId = 99; + + this.dataContainer.addTagging(newTagging(1, 1, pId)); + this.dataContainer.addTagging(newTagging(13, 1, pId)); + this.dataContainer.addTagging(newTagging(2, 1, pId)); + this.dataContainer.addTagging(newTagging(15, 1, pId)); + + ArrayList taggings = this.dataContainer.getTaggingsForUserId(pId); + for (Tagging tagging : taggings) { + assertEquals(tagging.getTaggerId(), pId); + } + } + + @Test + public void testGetProposalForUserId() { + this.dataContainer.addProposal(newProposal(1, 1)); + this.dataContainer.addProposal(newProposal(2, 2)); + this.dataContainer.addProposal(newProposal(3, 3)); + this.dataContainer.addProposal(newProposal(4, 4)); + + long uId = 99; + assertTrue(this.dataContainer.getProposalsForUserId(uId).isEmpty()); + + ArrayList proposals = new ArrayList<>(); + proposals.add(newProposal(5, uId)); + proposals.add(newProposal(6, uId)); + proposals.add(newProposal(7, uId)); + proposals.add(newProposal(8, uId)); + proposals.add(newProposal(9, uId)); + + this.dataContainer.addProposals(proposals); + + + ArrayList uproposals = this.dataContainer.getProposalsForUserId(uId); + assertTrue(uproposals.containsAll(proposals)); + assertTrue(proposals.containsAll(uproposals)); + + for (Proposal proposal : uproposals) { + assertEquals(proposal.getUserId(), uId); + } + } + + @Test + public void testGetTaggingForTagId(){ + this.dataContainer.addTagging(newTagging(1, 1, 1)); + this.dataContainer.addTagging(newTagging(2, 2, 2)); + this.dataContainer.addTagging(newTagging(3, 3, 3)); + this.dataContainer.addTagging(newTagging(4, 4, 4)); + + assertTrue(this.dataContainer.getTaggingsForTagId(99).isEmpty()); + + long pId = 99; + + this.dataContainer.addTagging(newTagging(pId, 1, 1)); + this.dataContainer.addTagging(newTagging(pId, 1, 14)); + this.dataContainer.addTagging(newTagging(pId, 1, 2)); + this.dataContainer.addTagging(newTagging(pId, 1, 15)); + + ArrayList taggings = this.dataContainer.getTaggingsForTagId(pId); + for (Tagging tagging : taggings) { + assertEquals(tagging.getTagId(), pId); + } + } public void testGetProposalForId() { @@ -230,6 +367,17 @@ private Proposal newProposal() { private Proposal newProposal(long id) { return new Proposal(id, "title", "content", 0,0); } + private Proposal newProposal(long id, long userId) { + return new Proposal(id, "title", "content", 0, userId); + } + + private Tagging newTagging() { + return new Tagging(1,1,1); + } + + private Tagging newTagging(long tagId, long proposalId, long userId){ + return new Tagging(tagId, proposalId, userId); + } private User newUser() { diff --git a/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListenerTest.java b/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListenerTest.java index 21bda5e..bacacef 100644 --- a/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListenerTest.java +++ b/app/src/test/java/com/mdsgpp/cidadedemocratica/persistence/DataUpdateListenerTest.java @@ -35,6 +35,11 @@ public void proposalsUpdated() { public void usersUpdated() { } + + @Override + public void taggingsUpdated() { + + } }); Tag tag = newTag(); @@ -63,6 +68,11 @@ public void proposalsUpdated() { public void usersUpdated() { } + + @Override + public void taggingsUpdated() { + + } }); Proposal proposal = newProposal(); @@ -90,6 +100,11 @@ public void proposalsUpdated() { public void usersUpdated() { updated[0] = true; } + + @Override + public void taggingsUpdated() { + + } }); User user = newUser();