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 @@ + + + + + + + + + + + + + + + + +