package im.actor.sdk.controllers.contacts;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
import android.view.Gravity;
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.FrameLayout;
import android.widget.TextView;
import im.actor.core.entity.Contact;
import im.actor.runtime.generic.mvvm.BindedDisplayList;
import im.actor.sdk.ActorSDK;
import im.actor.sdk.R;
import im.actor.sdk.controllers.DisplayListFragment;
import im.actor.sdk.controllers.contacts.view.ContactHolder;
import im.actor.sdk.controllers.contacts.view.ContactsAdapter;
import im.actor.sdk.controllers.fragment.help.HelpActivity;
import im.actor.sdk.util.Screen;
import im.actor.sdk.util.Fonts;
import im.actor.sdk.view.adapters.OnItemClickedListener;
import im.actor.sdk.view.TintImageView;
import im.actor.runtime.android.view.BindedListAdapter;
import im.actor.runtime.mvvm.ValueChangedListener;
import im.actor.runtime.mvvm.Value;
import static im.actor.sdk.util.ActorSDKMessenger.messenger;
public abstract class BaseContactFragment extends DisplayListFragment<Contact, ContactHolder> {
private static final boolean USE_APP_INVITES = true;
private final boolean useCompactVersion;
private final boolean userSearch;
private final boolean useSelection;
private View emptyView;
public BaseContactFragment(boolean useCompactVersion, boolean userSearch, boolean useSelection) {
this.useCompactVersion = useCompactVersion;
this.userSearch = userSearch;
this.useSelection = useSelection;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return onCreateContactsView(R.layout.fragment_base_contacts, inflater, container, savedInstanceState);
}
protected View onCreateContactsView(int layoutId, LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View res = inflate(inflater, container, layoutId, messenger().buildContactsDisplayList());
res.findViewById(R.id.collection).setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
emptyView = res.findViewById(R.id.emptyCollection);
if (emptyView != null) {
emptyView.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
emptyView.findViewById(R.id.empty_collection_bg).setBackgroundColor(ActorSDK.sharedActor().style.getMainColor());
((TextView) emptyView.findViewById(R.id.empty_collection_text)).setTextColor(ActorSDK.sharedActor().style.getMainColor());
} else {
emptyView = res.findViewById(R.id.empty_collection_text);
if (emptyView != null && emptyView instanceof TextView) {
((TextView) emptyView.findViewById(R.id.empty_collection_text)).setTextColor(ActorSDK.sharedActor().style.getMainColor());
}
}
setAnimationsEnabled(false);
View headerPadding = new View(getActivity());
headerPadding.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
headerPadding.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, useCompactVersion ? 0 : ActorSDK.sharedActor().style.getContactsMainPaddingTop()));
addHeaderView(headerPadding);
addFootersAndHeaders();
if (emptyView != null) {
if (messenger().getAppState().getIsContactsEmpty().get()) {
emptyView.setVisibility(View.VISIBLE);
} else {
emptyView.setVisibility(View.GONE);
}
}
bind(messenger().getAppState().getIsContactsEmpty(), new ValueChangedListener<Boolean>() {
@Override
public void onChanged(Boolean val, Value<Boolean> Value) {
if (emptyView != null) {
if (val) {
emptyView.setVisibility(View.VISIBLE);
} else {
emptyView.setVisibility(View.GONE);
}
}
}
});
res.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
return res;
}
protected void addFootersAndHeaders() {
View header = new View(getActivity());
header.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(8)));
header.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
addHeaderView(header);
if (useCompactVersion) {
View footer = new View(getActivity());
footer.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(4)));
footer.setBackgroundColor(ActorSDK.sharedActor().style.getBackyardBackgroundColor());
addFooterView(footer);
} else {
addFooterOrHeaderAction(ActorSDK.sharedActor().style.getActionShareColor(), R.drawable.ic_share_white_24dp, R.string.contacts_share, false, new Runnable() {
@Override
public void run() {
sendInvites();
}
}, true);
addFooterOrHeaderAction(ActorSDK.sharedActor().style.getActionAddContactColor(), R.drawable.ic_person_add_white_24dp, R.string.contacts_add, false, new Runnable() {
@Override
public void run() {
startActivity(new Intent(getActivity(), AddContactActivity.class));
}
}, true);
FrameLayout footer = new FrameLayout(getActivity());
footer.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(112)));
footer.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
addFooterView(footer);
}
}
public void sendInvites() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setItems(new String[]{getString(R.string.invites_share_link_one), getString(R.string.invites_share_link_multiple)}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
sendOneInvite();
break;
case 1:
sendMultipleInvites();
break;
}
dialog.dismiss();
}
}).show();
}
public void sendMultipleInvites() {
Intent intent = new Intent(getActivity(), InviteActivity.class);
startActivity(intent);
}
public void sendOneInvite() {
String inviteMessage = getResources().getString(R.string.invite_message).replace("{inviteUrl}", ActorSDK.sharedActor().getInviteUrl()).replace("{appName}", ActorSDK.sharedActor().getAppName());
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, inviteMessage);
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
protected void addFooterOrHeaderAction(int color, int icon, int text, boolean isLast, final Runnable action, boolean isHeader) {
FrameLayout container = new FrameLayout(getActivity());
container.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
{
container.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
}
FrameLayout invitePanel = new FrameLayout(getActivity());
invitePanel.setBackgroundResource(R.drawable.selector_fill);
invitePanel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
action.run();
}
});
{
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(64));
params.leftMargin = Screen.dp(40);
invitePanel.setLayoutParams(params);
container.addView(invitePanel);
}
TintImageView inviteIcon = new TintImageView(getActivity());
inviteIcon.setTint(color);
inviteIcon.setResource(icon);
{
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(Screen.dp(52), Screen.dp(52));
layoutParams.leftMargin = Screen.dp(6);
layoutParams.topMargin = Screen.dp(6);
layoutParams.bottomMargin = Screen.dp(6);
layoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.LEFT;
invitePanel.addView(inviteIcon, layoutParams);
}
TextView inviteText = new TextView(getActivity());
inviteText.setText(getString(text).replace("{appName}", ActorSDK.sharedActor().getAppName()));
inviteText.setTextColor(color);
inviteText.setPadding(Screen.dp(72), 0, Screen.dp(8), 0);
inviteText.setTextSize(16);
inviteText.setSingleLine(true);
inviteText.setEllipsize(TextUtils.TruncateAt.END);
inviteText.setTypeface(Fonts.medium());
{
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER_VERTICAL;
layoutParams.topMargin = Screen.dp(16);
layoutParams.bottomMargin = Screen.dp(16);
invitePanel.addView(inviteText, layoutParams);
}
if (!isLast) {
View div = new View(getActivity());
div.setBackgroundColor(ActorSDK.sharedActor().style.getContactDividerColor());
{
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
getResources().getDimensionPixelSize(R.dimen.div_size));
layoutParams.gravity = Gravity.BOTTOM;
layoutParams.leftMargin = Screen.dp(72);
invitePanel.addView(div, layoutParams);
}
}
if (isHeader) {
addHeaderView(container);
} else {
addFooterView(container);
}
}
@Override
protected BindedListAdapter<Contact, ContactHolder> onCreateAdapter(BindedDisplayList<Contact> displayList, Activity activity) {
return new ContactsAdapter(displayList, activity, useSelection, new OnItemClickedListener<Contact>() {
@Override
public void onClicked(Contact item) {
onItemClicked(item);
}
@Override
public boolean onLongClicked(Contact item) {
return onItemLongClicked(item);
}
});
}
public void onItemClicked(Contact contact) {
}
public boolean onItemLongClicked(Contact contact) {
return false;
}
public void filter(String query) {
query = query.trim();
if (query.length() == 0) {
getDisplayList().initTop(false);
} else {
getDisplayList().initSearch(query, false);
}
((ContactsAdapter) getAdapter()).setQuery(query.toLowerCase());
}
public void select(int uid) {
((ContactsAdapter) getAdapter()).select(uid);
}
public void unselect(int uid) {
((ContactsAdapter) getAdapter()).unselect(uid);
}
public Integer[] getSelected() {
return ((ContactsAdapter) getAdapter()).getSelected();
}
public int getSelectedCount() {
return ((ContactsAdapter) getAdapter()).getSelectedCount();
}
public boolean isSelected(int uid) {
return ((ContactsAdapter) getAdapter()).isSelected(uid);
}
// Search menu
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if (userSearch) {
inflater.inflate(R.menu.compose, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return true;
}
});
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (userSearch) {
if (item.getItemId() == R.id.help) {
startActivity(new Intent(getActivity(), HelpActivity.class));
return true;
}
}
return super.onOptionsItemSelected(item);
}
}