package im.actor.sdk.controllers.contacts; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import im.actor.core.entity.PhoneBookContact; import im.actor.sdk.ActorSDK; import im.actor.sdk.R; import im.actor.sdk.controllers.BaseFragment; import im.actor.sdk.core.AndroidPhoneBook; import im.actor.sdk.view.adapters.OnItemClickedListener; import im.actor.sdk.view.adapters.RecyclerListView; public class InviteFragment extends BaseFragment { private RecyclerListView collection; private InviteAdapter adapter; private List<PhoneBookContact> contacts; private TextView emptyText; private Menu menu; private MenuInflater inflater; public InviteFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View res = inflater.inflate(R.layout.fragment_list, container, false); res.findViewById(R.id.listView).setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor()); emptyText = (TextView) res.findViewById(R.id.emptyView); emptyText.setTextColor(ActorSDK.sharedActor().style.getTextSecondaryColor()); emptyText.setText(R.string.progress_common); collection = (RecyclerListView) res.findViewById(R.id.listView); AndroidPhoneBook phoneBookLoader = new AndroidPhoneBook(); phoneBookLoader.useDelay(false); res.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor()); phoneBookLoader.loadPhoneBook(contacts -> { if (contacts.size() > 0) { getActivity().runOnUiThread(() -> { InviteFragment.this.contacts = contacts; adapter = new InviteAdapter(getActivity(), contacts, new OnItemClickedListener<PhoneBookContact>() { @Override public void onClicked(PhoneBookContact item) { onItemClicked(item); } @Override public boolean onLongClicked(PhoneBookContact item) { return false; } }); collection.setAdapter(adapter); hideView(emptyText); showView(collection); showMenu(); }); } }); return res; } public void onItemClicked(PhoneBookContact contact) { boolean selected = isSelected(contact); boolean needDialog = contact.getEmails().size() > 0 && contact.getPhones().size() > 0; if (needDialog) { String[] items = new String[selected ? 3 : 2]; items[0] = Long.toString(contact.getPhones().get(0).getNumber()); items[1] = contact.getEmails().get(0).getEmail(); if (selected) { items[2] = getString(R.string.dialog_cancel); } AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setItems(items, (dialog, which) -> { if (which == 2) { unselect(contact); } else { select(contact, which); } getAdapter().notifyDataSetChanged(); dialog.dismiss(); }).show(); } else { if (selected) { unselect(contact); } else { select(contact, -1); } getAdapter().notifyDataSetChanged(); } } public void select(PhoneBookContact id, int type) { getAdapter().select(id, type); } public void unselect(PhoneBookContact id) { getAdapter().unselect(id); } public boolean isSelected(PhoneBookContact id) { return getAdapter().isSelected(id); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); this.menu = menu; this.inflater = inflater; showMenu(); } public void showMenu() { if (menu != null && inflater != null && adapter != null) { if (adapter.getCount() > 0) { inflater.inflate(R.menu.invite, menu); } } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.send_invites) { sendInvites(); return true; } else if (id == R.id.select_all) { adapter.selectAll(); } else if (id == R.id.select_none) { adapter.selectNone(); } return super.onOptionsItemSelected(item); } private void sendInvites() { ArrayList<Long> phones = new ArrayList<Long>(); ArrayList<String> emails = new ArrayList<String>(); PhoneBookContact[] selected = getAdapter().getSelected(); HashMap<PhoneBookContact, Integer> selectedTypes = getAdapter().getSelectedContactsTypes(); Integer selectedType; //Prepare email/phones lists String phoneNumbersStrings = ""; String emailsString = ""; String email; long number; for (PhoneBookContact contact : selected) { selectedType = selectedTypes.get(contact); selectedType = selectedType != null ? selectedType : InviteContactHolder.TYPE_PHONE; if ((selectedType == InviteContactHolder.TYPE_EMAIL && contact.getEmails().size() > 0) || contact.getPhones().size() == 0) { email = contact.getEmails().get(0).getEmail(); emails.add(email); emailsString += email + ";"; } else { number = contact.getPhones().get(0).getNumber(); phones.add(number); phoneNumbersStrings += number + ";"; } } String inviteMessage = getResources().getString(R.string.invite_message).replace("{inviteUrl}", ActorSDK.sharedActor().getInviteUrl()).replace("{appName}", ActorSDK.sharedActor().getAppName()); if (phones.size() > 0 && emails.size() > 0) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); String[] options = new String[]{getString(R.string.invite_options_sms), getString(R.string.invite_options_email)}; final String finalPhoneNumbersStrings = phoneNumbersStrings; final String finalEmailsString = emailsString; builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (which == 0) { sendSmsInvites(finalPhoneNumbersStrings, inviteMessage); } else { sendEmailInvites(finalEmailsString, inviteMessage); } dialog.dismiss(); } }).show(); } else if (phones.size() > 0) { sendSmsInvites(phoneNumbersStrings, inviteMessage); } else { sendEmailInvites(emailsString, inviteMessage); } // SmsManager smsManager = SmsManager.getDefault(); // smsManager.sendTextMessage(phoneNumbers, null, inviteMessage, null, null); } private void sendEmailInvites(String emailsString, String inviteMessage) { Uri emailsToUri = Uri.parse("mailto:" + emailsString); Intent i = new Intent(Intent.ACTION_SENDTO, emailsToUri); i.putExtra(Intent.EXTRA_TEXT, inviteMessage); startActivity(Intent.createChooser(i, getString(R.string.contacts_invite_via_link))); } private void sendSmsInvites(String phoneNumbersStrings, String inviteMessage) { Uri smsToUri = Uri.parse("smsto:" + phoneNumbersStrings); Intent i = new Intent(Intent.ACTION_SENDTO, smsToUri); i.putExtra("sms_body", inviteMessage); startActivity(i); } public InviteAdapter getAdapter() { return adapter; } @Override public void onDestroy() { super.onDestroy(); if (adapter != null) { adapter.dispose(); } } }