diff --git a/app/build.gradle b/app/build.gradle
index 001fc97e345d69a5c7324b9f543e00bbfe9636d5..59fbd3d15c2434b7adba6387064f1e3882ba03a9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -92,6 +92,7 @@ dependencies {
compile "com.android.support:design:$supportLibraryVersion"
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:multidex:1.0.1'
+ compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.google.android.gms:play-services-maps:11.0.1'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a56a55cd00b07c8cbf11fc192cd1ba7234fb67cb..de7b6209a556609fd81449f8df9b81b8473a4949 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,6 +17,7 @@
+
diff --git a/app/src/main/java/com/ninja/mobile/data/DataManager.java b/app/src/main/java/com/ninja/mobile/data/DataManager.java
index e5d5ad30496dfb36c12687a583b0de9978584a01..134ba6b97490d70c5e06fe2d97305f101daff9ba 100644
--- a/app/src/main/java/com/ninja/mobile/data/DataManager.java
+++ b/app/src/main/java/com/ninja/mobile/data/DataManager.java
@@ -2,8 +2,12 @@ package com.ninja.mobile.data;
import android.content.Context;
+import com.ninja.mobile.data.models.mqtt.Person;
import com.ninja.mobile.injection.ApplicationContext;
import com.ninja.mobile.intetfaces.APIManager;
+import com.ninja.mobile.utils.ContactsUtil;
+
+import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -38,4 +42,8 @@ public class DataManager {
helper.parseCountries(mContext);
return helper;
}
+
+ public List getContactsFromPhone(){
+ return ContactsUtil.getContacts(mContext);
+ }
}
diff --git a/app/src/main/java/com/ninja/mobile/data/models/mqtt/Person.java b/app/src/main/java/com/ninja/mobile/data/models/mqtt/Person.java
index ecaf808e4c804e7d96bac8b78c5a0de160f9eee0..5cc834bcecec859f90eb5f8bd6dfa9b290d087b5 100644
--- a/app/src/main/java/com/ninja/mobile/data/models/mqtt/Person.java
+++ b/app/src/main/java/com/ninja/mobile/data/models/mqtt/Person.java
@@ -2,9 +2,10 @@ package com.ninja.mobile.data.models.mqtt;
import com.ninja.mobile.data.server.bert.BertTuple;
+import java.util.ArrayList;
import java.util.List;
-public class Person extends BaseModelMQQT{
+public class Person extends BaseModelMQQT {
public long id;
public String name;
@@ -12,6 +13,9 @@ public class Person extends BaseModelMQQT{
public String username;
public List phonelist;
public String alias;
+ public boolean isNinja;
+ public String phone;
+ public String photoUrl;
public Person() {
}
@@ -23,4 +27,30 @@ public class Person extends BaseModelMQQT{
@Override public Object encode() {
return null;
}
+
+
+ public static List getMockData() {
+ List contacts = new ArrayList<>();
+
+ for (int i = 0; i < 30; i++) {
+ Person person = new Person();
+ person.name = "name " + i;
+ person.phone = "1234 ..... " + i;
+ person.username = "username " + i;
+ person.isNinja = (i % 2 == 0);
+ person.photoUrl = "https://cdn0.iconfinder.com/data/icons/PRACTIKA/256/user.png";
+ contacts.add(person);
+ }
+
+ Person person = new Person();
+ person.name = "O name ";
+ person.phone = "1234 ..... " ;
+ person.username = "username ";
+ person.isNinja = true;
+ person.photoUrl = "https://cdn0.iconfinder.com/data/icons/PRACTIKA/256/user.png";
+ contacts.add(person);
+
+
+ return contacts;
+ }
}
diff --git a/app/src/main/java/com/ninja/mobile/mvp/presenters/AddContactsFromPhonePresenter.java b/app/src/main/java/com/ninja/mobile/mvp/presenters/AddContactsFromPhonePresenter.java
new file mode 100644
index 0000000000000000000000000000000000000000..42ebd2c96e566fb6bbd519edfa14bda8ae0ec3ea
--- /dev/null
+++ b/app/src/main/java/com/ninja/mobile/mvp/presenters/AddContactsFromPhonePresenter.java
@@ -0,0 +1,23 @@
+package com.ninja.mobile.mvp.presenters;
+
+import com.arellomobile.mvp.InjectViewState;
+import com.ninja.mobile.data.models.mqtt.Person;
+import com.ninja.mobile.mvp.view.AddContactsFromPhoneView;
+
+import java.util.List;
+
+@InjectViewState
+public class AddContactsFromPhonePresenter extends BasePresenter {
+ public void getContactsFromNinja(){
+ //TODO get contacts from ninja server
+// List contacts = mDataManager.getContactsFromPhone();
+ List contacts = Person.getMockData();
+ getViewState().setAllContacts(contacts);
+ }
+
+ public void AddContact(Person contact){
+ //TODO
+ getViewState().addContact(contact);
+ }
+
+}
diff --git a/app/src/main/java/com/ninja/mobile/mvp/view/AddContactsFromPhoneView.java b/app/src/main/java/com/ninja/mobile/mvp/view/AddContactsFromPhoneView.java
new file mode 100644
index 0000000000000000000000000000000000000000..989de903276c49d941e3b28900100f48d3ce57f3
--- /dev/null
+++ b/app/src/main/java/com/ninja/mobile/mvp/view/AddContactsFromPhoneView.java
@@ -0,0 +1,11 @@
+package com.ninja.mobile.mvp.view;
+
+import com.arellomobile.mvp.MvpView;
+import com.ninja.mobile.data.models.mqtt.Person;
+
+import java.util.List;
+
+public interface AddContactsFromPhoneView extends MvpView{
+ void setAllContacts(List contacts);
+ void addContact(Person contact);
+}
diff --git a/app/src/main/java/com/ninja/mobile/ui/adapters/AddContactFromPhoneAdapter.java b/app/src/main/java/com/ninja/mobile/ui/adapters/AddContactFromPhoneAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3a94cfe815e0f28ffcb8f7175ebcdb4bba05f57
--- /dev/null
+++ b/app/src/main/java/com/ninja/mobile/ui/adapters/AddContactFromPhoneAdapter.java
@@ -0,0 +1,109 @@
+package com.ninja.mobile.ui.adapters;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.bumptech.glide.Glide;
+import com.ninja.mobile.R;
+import com.ninja.mobile.data.models.mqtt.Contact;
+import com.ninja.mobile.data.models.mqtt.Person;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class AddContactFromPhoneAdapter extends RecyclerView.Adapter {
+ private List contacts;
+ private Activity mActivity;
+ private onContactAddClick mOnContactAddClick;
+
+ public AddContactFromPhoneAdapter(List contacts, Activity activity) {
+ this.contacts = contacts;
+ this.mActivity = activity;
+
+ }
+
+ @Override
+ public ContactAddPhoneView onCreateViewHolder(ViewGroup parent, int viewType) {
+ View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_add_contacts_from_phone_recycler, parent, false);
+ return new ContactAddPhoneView(itemView) ;
+ }
+
+ @Override
+ public void onBindViewHolder(ContactAddPhoneView holder, int position) {
+ checkForLetterHeader(holder, position);
+
+ Person contact = contacts.get(position);
+ holder.name.setText(contact.name);
+ if (contact.isNinja){
+ holder.phoneNick.setText(contact.username);
+ holder.add.setText(R.string.added);
+ holder.add.setBackground(null);
+ } else {
+ holder.phoneNick.setText(contact.phone);
+ holder.add.setBackgroundResource(R.drawable.red_round_button);
+ }
+ Glide.with(mActivity).load(contact.photoUrl).into(holder.photo);
+
+ holder.add.setOnClickListener(v -> mOnContactAddClick.onAdd(contact));
+ }
+
+ private void checkForLetterHeader(ContactAddPhoneView holder, int position){
+ if (position != 0){
+ Person contact = contacts.get(position);
+ String firstLetterPrevious = contacts.get(position-1).name.substring(0,2);
+ String firstLetter = contact.name.substring(0,2);
+
+ if (!firstLetterPrevious.equalsIgnoreCase(firstLetter)){
+ holder.layoutWithLetter.setVisibility(View.VISIBLE);
+ holder.letter.setText(firstLetter.toUpperCase());
+ } else {
+ holder.layoutWithLetter.setVisibility(View.GONE);
+ }
+ } else {
+ Person contact = contacts.get(position);
+ String firstLetter = contact.name.substring(0,1);
+ holder.layoutWithLetter.setVisibility(View.VISIBLE);
+ holder.letter.setText(firstLetter);
+ }
+ }
+
+ @Override public int getItemCount() {
+ return contacts.size();
+ }
+
+ class ContactAddPhoneView extends RecyclerView.ViewHolder{
+ @BindView(R.id.add_contact_from_phone_tv_name) TextView name;
+ @BindView(R.id.add_contact_from_phone_tv_phone) TextView phoneNick;
+ @BindView(R.id.add_contact_from_phone_btn_add) Button add;
+ @BindView(R.id.add_contact_from_phone_iv_photo) ImageView photo;
+ @BindView(R.id.add_contact_from_phone_tv_letter) TextView letter;
+ @BindView(R.id.add_contact_from_phone_fl_for_letter) View layoutWithLetter;
+
+ ContactAddPhoneView(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ }
+ }
+
+ public void addContact(Person contact){
+ contact.isNinja = true;
+ notifyDataSetChanged();
+ }
+
+ public void setOnAddClickLIstener(onContactAddClick onAddClickLIstener){
+ this.mOnContactAddClick = onAddClickLIstener;
+ }
+
+ public interface onContactAddClick{
+ void onAdd(Person contact);
+ }
+}
diff --git a/app/src/main/java/com/ninja/mobile/ui/fragments/contacts/AddContactFromPhoneFragment.java b/app/src/main/java/com/ninja/mobile/ui/fragments/contacts/AddContactFromPhoneFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..666d383c9ea8e59f59d488bcb3f07c33662c62b6
--- /dev/null
+++ b/app/src/main/java/com/ninja/mobile/ui/fragments/contacts/AddContactFromPhoneFragment.java
@@ -0,0 +1,65 @@
+package com.ninja.mobile.ui.fragments.contacts;
+
+import android.Manifest;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.arellomobile.mvp.presenter.InjectPresenter;
+import com.ninja.mobile.R;
+import com.ninja.mobile.data.models.mqtt.Person;
+import com.ninja.mobile.mvp.presenters.AddContactsFromPhonePresenter;
+import com.ninja.mobile.mvp.view.AddContactsFromPhoneView;
+import com.ninja.mobile.ui.adapters.AddContactFromPhoneAdapter;
+import com.ninja.mobile.ui.base.BaseFragment;
+
+import java.util.List;
+
+import butterknife.BindView;
+
+public class AddContactFromPhoneFragment extends BaseFragment implements AddContactsFromPhoneView{
+
+ @InjectPresenter AddContactsFromPhonePresenter mPresenter;
+ @BindView(R.id.addContactsFromPhone_recyclerView) RecyclerView mRecyclerView;
+ AddContactFromPhoneAdapter mAdapter;
+
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_add_contact_from_phone, container, false);
+ }
+
+ @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ getAllContacts();
+ }
+
+ private void getAllContacts(){
+ rxPermissions
+ .request(Manifest.permission.READ_CONTACTS)
+ .subscribe(granted -> {
+ if (granted) {
+ mPresenter.getContactsFromNinja();
+ } else {
+ //// FIXME: 29.06.2017 message?
+ }
+ });
+ }
+
+ @Override public void setAllContacts(List contacts) {
+ mAdapter = new AddContactFromPhoneAdapter(contacts, getActivity());
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ mRecyclerView.setAdapter(mAdapter);
+ mAdapter.setOnAddClickLIstener(contact -> mPresenter.AddContact(contact));
+
+ }
+
+ @Override public void addContact(Person contact) {
+ mAdapter.addContact(contact);
+ }
+}
diff --git a/app/src/main/java/com/ninja/mobile/utils/ContactsUtil.java b/app/src/main/java/com/ninja/mobile/utils/ContactsUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4727b6d6cc932b126678d1ea768738ff273e23de
--- /dev/null
+++ b/app/src/main/java/com/ninja/mobile/utils/ContactsUtil.java
@@ -0,0 +1,68 @@
+package com.ninja.mobile.utils;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.provider.ContactsContract;
+
+import com.ninja.mobile.data.models.mqtt.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ContactsUtil {
+
+ public static List getContacts(Context ctx) {
+ List list = new ArrayList<>();
+// ContentResolver contentResolver = ctx.getContentResolver();
+// Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
+// if (cursor.getCount() > 0) {
+// while (cursor.moveToNext()) {
+// String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
+// if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
+// Cursor cursorInfo = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
+// ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
+// InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(),
+// ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id)));
+//
+// Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id));
+// Uri pURI = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
+//
+// while (cursorInfo.moveToNext()) {
+// Person info = new Person();
+// info.setName(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
+//
+// info.setPhonelist();
+//// info.setMobileNumber(cursorInfo.getString(cursorInfo.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
+// list.add(info);
+// }
+//
+// cursorInfo.close();
+// }
+// }
+// }
+ Cursor phones = ctx.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
+ while (phones.moveToNext()) {
+ String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
+ String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
+ addContact(list, name, phoneNumber);
+ }
+ phones.close();
+ return list;
+ }
+
+
+ private static void addContact(List persons, String name, String phone){
+ for (Person person:persons){
+ if (person.name != null && person.name.equals(name)){
+ person.phonelist.add(phone);
+ } else {
+ Person newPerson = new Person();
+ newPerson.name = name;
+ List phones = new ArrayList<>();
+ phones.add(phone);
+ newPerson.phonelist = phones;
+ }
+ }
+
+ }
+}
diff --git a/app/src/main/res/drawable/rec_circle.xml b/app/src/main/res/drawable/rec_circle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e0d92ace3d3cb19a4e3392f5d27eaac58a627c44
--- /dev/null
+++ b/app/src/main/res/drawable/rec_circle.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/red_round_button.xml b/app/src/main/res/drawable/red_round_button.xml
new file mode 100644
index 0000000000000000000000000000000000000000..95abf0d0285e0a85ad911e16629f284e5aeb7fc1
--- /dev/null
+++ b/app/src/main/res/drawable/red_round_button.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_add_contact_from_phone.xml b/app/src/main/res/layout/fragment_add_contact_from_phone.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9f9fce8a7ffdb1e15b3fc8e7af7fb3f31b689394
--- /dev/null
+++ b/app/src/main/res/layout/fragment_add_contact_from_phone.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_add_contacts_from_phone_recycler.xml b/app/src/main/res/layout/item_add_contacts_from_phone_recycler.xml
new file mode 100644
index 0000000000000000000000000000000000000000..192f65cfd8598aa3e12c309a8c8879a4bfc0ae29
--- /dev/null
+++ b/app/src/main/res/layout/item_add_contacts_from_phone_recycler.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index ccad443dcd72330d21a7b00b18a367c513a7aba2..d8a72116beb610c0dab3836ea001275c0e75d9b4 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -9,4 +9,6 @@
#C9D2D1
#2b2e32
#ff818181
+
+ #ffffff
diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml
new file mode 100644
index 0000000000000000000000000000000000000000..397e2fc26606855a5c7f901e45ac28ab2a7b2d16
--- /dev/null
+++ b/app/src/main/res/values/dimen.xml
@@ -0,0 +1,9 @@
+
+
+ 100dp
+ 60dp
+ 40dp
+ 15dp
+
+
+
\ 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 5ab074feef02cc30f1b4dc9ef7d3a09c6c3cfcf6..8925650785f2349aaa6a60f4a96d7f6e7035c1dd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -24,4 +24,9 @@
Cancel
Add contact
+
+ ADD
+ ADDED
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 40fec0ed2d9cae9b74f41c83a8c63f8a631f2f7a..af1290d5820e4db8940f5e2c19ef53f1c6e91b31 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -38,4 +38,11 @@
- 0dp
- @android:color/transparent
+
+