contacts, OnItemClickListener listener) {
+ this.mContacts = contacts;
+ this.listener = listener;
}
@Override
@@ -41,7 +54,7 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
- holder.bind(mContacts.get(position));
+ holder.bind(mContacts.get(position), listener);
}
@Override
@@ -53,14 +66,32 @@ class ViewHolder extends RecyclerView.ViewHolder {
@Nullable @Bind(R.id.contact_id) protected TextView mId;
@Nullable @Bind(R.id.contact_name) protected TextView mName;
+ @OnClick(R.id.phone)
+ void callContact() {
+ //TODO Implement Call feature
+ Toast.makeText(itemView.getContext(), "Calling contact...", Toast.LENGTH_SHORT).show();
+ }
+
+ @OnClick(R.id.email)
+ void emailContact() {
+ //TODO Implement Email feature
+ Toast.makeText(itemView.getContext(), "Emailing contact...", Toast.LENGTH_SHORT).show();
+ }
+
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
- public void bind(ContactEntity entity) {
- mId.setText(entity.ContactID);
- mName.setText(entity.FirstName+" "+entity.LastName);
+ public void bind(final ContactEntity entity, final OnItemClickListener listener) {
+ mId.setText(String.valueOf(entity.ContactID));
+ mName.setText(String.format(Locale.UK, "%1$s %2$s", entity.FirstNane, entity.LastName));
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onItemClick(entity);
+ }
+ });
}
}
}
diff --git a/app/src/main/java/com/salesi/coding/ui/adapter/TabsAdapter.java b/app/src/main/java/com/salesi/coding/ui/adapter/TabsAdapter.java
index 4bbb33e..e01b323 100644
--- a/app/src/main/java/com/salesi/coding/ui/adapter/TabsAdapter.java
+++ b/app/src/main/java/com/salesi/coding/ui/adapter/TabsAdapter.java
@@ -24,9 +24,8 @@ public TabsAdapter(final FragmentManager fm, final Context context) {
@Override
public Fragment getItem(int position) {
switch(position) {
- case 0 : {
+ case 0 :
return FContacts.instance();
- }
}
return null;
}
@@ -34,9 +33,8 @@ public Fragment getItem(int position) {
@Override
public CharSequence getPageTitle(int position) {
switch(position) {
- case 0 : {
+ case 0 :
return mContext.getString(R.string.title_tab_question_1);
- }
}
return null;
}
diff --git a/app/src/main/java/com/salesi/coding/ui/screens/FContacts.java b/app/src/main/java/com/salesi/coding/ui/screens/FContacts.java
index 066c80e..ba5cd0d 100644
--- a/app/src/main/java/com/salesi/coding/ui/screens/FContacts.java
+++ b/app/src/main/java/com/salesi/coding/ui/screens/FContacts.java
@@ -1,7 +1,9 @@
package com.salesi.coding.ui.screens;
import android.content.Context;
+import android.content.Intent;
import android.os.Bundle;
+import android.os.CpuUsageInfo;
import android.os.StrictMode;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
@@ -11,13 +13,20 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Toast;
+import com.salesi.coding.DetailsActivity;
+import com.salesi.coding.MainActivity;
import com.salesi.coding.MainApp;
import com.salesi.coding.R;
import com.salesi.coding.entity.ContactEntity;
import com.salesi.coding.service.IContactService;
+import com.salesi.coding.ui.Fragments.DetailFragment;
import com.salesi.coding.ui.adapter.ContactsAdapter;
+import com.salesi.coding.ui.adapter.ContactsAdapter.OnItemClickListener;
+import com.salesi.coding.utils.Utils;
+import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
@@ -28,15 +37,22 @@
/**
* Fragment matching first tab
- *
+ *
* Copyright © 2017 salesi
*/
public class FContacts extends Fragment {
- @Inject protected Lazy mContactService;
- @Inject protected Lazy mAdapter;
+ @Inject
+ protected Lazy mContactService;
+ @Inject
+ protected Lazy mAdapter;
- @Bind(R.id.list_contacts) protected RecyclerView mRecycler;
+ @Bind(R.id.list_contacts)
+ protected RecyclerView mRecycler;
+
+ private ContactEntity selectedContact;
+
+ DetailFragment detailsFrag;
public static FContacts instance() {
return new FContacts();
@@ -54,19 +70,28 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
ButterKnife.bind(this, view);
StrictMode.ThreadPolicy strictPolicy = new StrictMode.ThreadPolicy.Builder()
- .permitAll().build();
+ .permitAll().build();
StrictMode.setThreadPolicy(strictPolicy);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
- List contacts = mContactService.get().fetchContacts();
+
+ detailsFrag = ((DetailFragment) getActivity().getSupportFragmentManager().findFragmentByTag(MainActivity.DETAILFRAGMENT_TAG));
+
+ if (detailsFrag != null) {
+ selectedContact = detailsFrag.getContact();
+ }
+
+ List contacts = (selectedContact != null)
+ ? filterContactData(selectedContact, mContactService.get().fetchContacts())
+ : mContactService.get().fetchContacts();
mRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecycler.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL));
mRecycler.setItemAnimator(new DefaultItemAnimator());
- mAdapter.get().setData(contacts);
+ mAdapter.get().setData(contacts, onItemClickListener);
mRecycler.setAdapter(mAdapter.get());
}
});
@@ -74,6 +99,63 @@ public void run() {
return view;
}
+ private List filterContactData(ContactEntity selectedContact, List contactEntities) {
+ List filteredDataList = new ArrayList<>();
+
+ if (selectedContact != null && (selectedContact.Hobbies != null && selectedContact.Hobbies.size() > 0)) {
+ for (ContactEntity contactEntity : contactEntities) {
+
+ // DOn't add selected contact or contact we've already got
+ if (contactEntity.ContactID.equals(selectedContact.ContactID) || filteredDataList.contains(contactEntity)) {
+ continue;
+ }
+
+ if (contactEntity.Hobbies != null) {
+ for (String contactHobby : contactEntity.Hobbies) {
+ if (Utils.containsIgnoreCase(selectedContact.Hobbies, contactHobby)) {
+ filteredDataList.add(contactEntity);
+ break;
+ }
+
+ }
+ }
+ }
+ }
+
+ return filteredDataList;
+ }
+
+
+
+ public OnItemClickListener onItemClickListener = new OnItemClickListener() {
+ @Override
+ public void onItemClick(ContactEntity item) {
+ selectedContact = item;
+
+ // If I had more time, I would instead save all the data into local storage, pass across the id,
+ // and then retrieve the data from the database using a DAO
+ // Because this way could cause a transaction too large exception
+ displayDetails(item);
+ }
+ };
+
+ private void displayDetails(ContactEntity contactEntity) {
+ if (getActivity().findViewById(R.id.contact_detail_container) != null) {
+
+ DetailFragment fragment = new DetailFragment();
+ fragment.setData(contactEntity);
+
+ getActivity().getSupportFragmentManager().beginTransaction()
+ .replace(R.id.contact_detail_container, fragment, MainActivity.DETAILFRAGMENT_TAG)
+ .commit();
+
+ } else {
+ Intent intent = new Intent(getActivity(), DetailsActivity.class);
+ intent.putExtra("contact", contactEntity);
+ startActivity(intent);
+ }
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
diff --git a/app/src/main/java/com/salesi/coding/utils/Utils.java b/app/src/main/java/com/salesi/coding/utils/Utils.java
new file mode 100644
index 0000000..97020f4
--- /dev/null
+++ b/app/src/main/java/com/salesi/coding/utils/Utils.java
@@ -0,0 +1,19 @@
+package com.salesi.coding.utils;
+
+import java.util.List;
+
+/**
+ * Created by buxtonj on 05/11/2017.
+ */
+
+public class Utils {
+ public static boolean containsIgnoreCase(List> array, String item) {
+ for(int i = 0; i < array.size(); i++) {
+ if (array.get(i).toString().equalsIgnoreCase(item)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/app/src/main/res/layout-large/activity_main.xml b/app/src/main/res/layout-large/activity_main.xml
new file mode 100644
index 0000000..db75f2c
--- /dev/null
+++ b/app/src/main/res/layout-large/activity_main.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml
new file mode 100644
index 0000000..f3da6c8
--- /dev/null
+++ b/app/src/main/res/layout/activity_detail.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_detail.xml b/app/src/main/res/layout/fragment_detail.xml
new file mode 100644
index 0000000..b94ea5e
--- /dev/null
+++ b/app/src/main/res/layout/fragment_detail.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_contact_row_item.xml b/app/src/main/res/layout/layout_contact_row_item.xml
index a3118bf..bde8ab5 100644
--- a/app/src/main/res/layout/layout_contact_row_item.xml
+++ b/app/src/main/res/layout/layout_contact_row_item.xml
@@ -2,70 +2,70 @@
+ android:textStyle="normal|bold"
+ tools:targetApi="ICE_CREAM_SANDWICH" />
+ app:srcCompat="@android:drawable/sym_action_email"
+ tools:targetApi="ICE_CREAM_SANDWICH" />
\ No newline at end of file
diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/main_activity.xml
new file mode 100644
index 0000000..dea54d2
--- /dev/null
+++ b/app/src/main/res/menu/main_activity.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e30960f..f6b2fcc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,4 +2,10 @@
CodingTest
http://www.mocky.io/
Contacts
+
+
+ 885
+ Arriva PLC
+
+ Close App