content: package im.actor.sdk.controllers.group;
  
  import android.app.AlertDialog;
  import android.content.ClipData;
  import android.content.ClipboardManager;
  import android.content.Context;
  import android.content.Intent;
  import android.graphics.Color;
  import android.graphics.drawable.ColorDrawable;
  import android.os.Bundle;
  import android.support.v7.app.ActionBar;
  import android.support.v7.widget.SwitchCompat;
  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.AbsListView;
  import android.widget.TextView;
  import android.widget.Toast;
  
  import com.google.i18n.phonenumbers.NumberParseException;
  import com.google.i18n.phonenumbers.PhoneNumberUtil;
  import com.google.i18n.phonenumbers.Phonenumber;
  
  import java.util.ArrayList;
  
  import im.actor.core.entity.GroupMember;
  import im.actor.core.entity.GroupType;
  import im.actor.core.entity.Peer;
  import im.actor.core.viewmodel.CommandCallback;
  import im.actor.core.viewmodel.GroupVM;
  import im.actor.core.viewmodel.UserPhone;
  import im.actor.core.viewmodel.UserVM;
  import im.actor.runtime.actors.messages.Void;
  import im.actor.sdk.ActorSDK;
  import im.actor.sdk.ActorSDKLauncher;
  import im.actor.sdk.ActorStyle;
  import im.actor.sdk.R;
  import im.actor.sdk.controllers.ActorBinder;
  import im.actor.sdk.controllers.Intents;
  import im.actor.sdk.controllers.activity.BaseActivity;
  import im.actor.sdk.controllers.BaseFragment;
  import im.actor.sdk.controllers.group.view.MembersAdapter;
  import im.actor.sdk.controllers.fragment.preview.ViewAvatarActivity;
  import im.actor.sdk.util.AlertListBuilder;
  import im.actor.sdk.util.Screen;
  import im.actor.sdk.view.TintImageView;
  import im.actor.sdk.view.adapters.RecyclerListView;
  import im.actor.sdk.view.avatar.AvatarView;
  
  import static im.actor.sdk.util.ActorSDKMessenger.groups;
  import static im.actor.sdk.util.ActorSDKMessenger.messenger;
  import static im.actor.sdk.util.ActorSDKMessenger.myUid;
  import static im.actor.sdk.util.ActorSDKMessenger.users;
  
  public class GroupInfoFragment extends BaseFragment {
  
      private static final String EXTRA_CHAT_ID = "chat_id";
      private ActorBinder.Binding[] memberBindings;
  
      public static GroupInfoFragment create(int chatId) {
          Bundle args = new Bundle();
          args.putInt(EXTRA_CHAT_ID, chatId);
          GroupInfoFragment res = new GroupInfoFragment();
          res.setArguments(args);
          return res;
      }
  
      private int chatId;
      private GroupVM groupVM;
  
      private RecyclerListView listView;
      private AvatarView avatarView;
      private MembersAdapter groupUserAdapter;
      private View notMemberView;
  
      public GroupInfoFragment() {
          setRootFragment(true);
          setHomeAsUp(true);
          setShowHome(true);
      }
  
      @Override
      public void onConfigureActionBar(ActionBar actionBar) {
          super.onConfigureActionBar(actionBar);
          actionBar.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
      }
  
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  
          chatId = getArguments().getInt(EXTRA_CHAT_ID);
  
          groupVM = groups().get(chatId);
  
          View res = inflater.inflate(R.layout.fragment_group, container, false);
          listView = (RecyclerListView) res.findViewById(R.id.groupList);
          notMemberView = res.findViewById(R.id.notMember);
  
          res.setBackgroundColor(style.getMainBackgroundColor());
          // listView.setBackgroundColor(style.getMainBackgroundColor());
          notMemberView.setBackgroundColor(style.getMainBackgroundColor());
          ((TextView) notMemberView.findViewById(R.id.not_member_text)).setTextColor(style.getTextPrimaryColor());
  
          //
          // Header
          //
  
          // Views
          View header = inflater.inflate(R.layout.fragment_group_header, listView, false);
          TextView title = (TextView) header.findViewById(R.id.title);
          TextView subtitle = (TextView) header.findViewById(R.id.subtitle);
          avatarView = (AvatarView) header.findViewById(R.id.avatar);
          avatarView.init(Screen.dp(48), 22);
  
          TextView aboutTV = (TextView) header.findViewById(R.id.about);
          View shortNameCont = header.findViewById(R.id.shortNameContainer);
          TextView shortNameView = (TextView) header.findViewById(R.id.shortName);
          TextView shortLinkView = (TextView) header.findViewById(R.id.shortNameLink);
  
          TextView addMember = (TextView) header.findViewById(R.id.addMemberAction);
          addMember.setText(groupVM.getGroupType() == GroupType.CHANNEL ? R.string.channel_add_member : R.string.group_add_member);
  
          TextView members = (TextView) header.findViewById(R.id.viewMembersAction);
          TextView leaveAction = (TextView) header.findViewById(R.id.leaveAction);
          TextView administrationAction = (TextView) header.findViewById(R.id.administrationAction);
  
          View descriptionContainer = header.findViewById(R.id.descriptionContainer);
          SwitchCompat isNotificationsEnabled = (SwitchCompat) header.findViewById(R.id.enableNotifications);
  
          // Styling
          // ((TextView) header.findViewById(R.id.about_hint)).setTextColor(style.getTextSecondaryColor());
          header.setBackgroundColor(style.getMainBackgroundColor());
          header.findViewById(R.id.avatarContainer).setBackgroundColor(style.getToolBarColor());
          title.setTextColor(style.getProfileTitleColor());
          subtitle.setTextColor(style.getProfileSubtitleColor());
          aboutTV.setTextColor(style.getTextPrimaryColor());
          shortNameView.setTextColor(style.getTextPrimaryColor());
          shortLinkView.setTextColor(style.getTextSecondaryColor());
          // settingsHeaderText.setTextColor(style.getSettingsCategoryTextColor());
  
          ((TintImageView) header.findViewById(R.id.settings_notification_icon))
                  .setTint(style.getSettingsIconColor());
          ((TintImageView) header.findViewById(R.id.settings_about_icon))
                  .setTint(style.getSettingsIconColor());
          ((TextView) header.findViewById(R.id.settings_notifications_title))
                  .setTextColor(style.getTextPrimaryColor());
          ((TextView) header.findViewById(R.id.addMemberAction))
                  .setTextColor(style.getTextPrimaryColor());
          members.setTextColor(style.getTextPrimaryColor());
          administrationAction.setTextColor(style.getTextPrimaryColor());
          leaveAction.setTextColor(style.getTextDangerColor());
  
          if (groupVM.getGroupType() == GroupType.CHANNEL) {
              leaveAction.setText(R.string.group_leave_channel);
          } else {
              leaveAction.setText(R.string.group_leave);
          }
  
          header.findViewById(R.id.after_settings_divider).setBackgroundColor(style.getBackyardBackgroundColor());
  
          //
          // Header
          //
          avatarView.bind(groupVM.getAvatar().get(), groupVM.getName().get(), groupVM.getId());
          avatarView.setOnClickListener(view -> {
              if (groupVM.getAvatar().get() != null) {
                  startActivity(ViewAvatarActivity.viewGroupAvatar(chatId, getActivity()));
              }
          });
          bind(groupVM.getName(), name -> {
              title.setText(name);
          });
          bind(groupVM.getMembersCount(), val -> {
              subtitle.setText(messenger().getFormatter().formatGroupMembers(val));
          });
  
          // About
          bind(groupVM.getAbout(), (about) -> {
              aboutTV.setText(about);
              aboutTV.setVisibility(about != null ? View.VISIBLE : View.GONE);
          });
          bind(groupVM.getShortName(), shortName -> {
              if (shortName != null) {
                  shortNameView.setText("@" + shortName);
  
                  String prefix = ActorSDK.sharedActor().getGroupInvitePrefix();
                  if (prefix != null) {
                      shortLinkView.setText(prefix + shortName);
                      shortLinkView.setVisibility(View.VISIBLE);
                  } else {
                      shortLinkView.setVisibility(View.GONE);
                  }
              }
              shortNameCont.setVisibility(shortName != null ? View.VISIBLE : View.GONE);
          });
          final ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
          shortNameCont.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  String link = shortLinkView.getText().toString();
                  clipboard.setPrimaryClip(ClipData.newPlainText(null, (link.contains("://") ? "" : "https://") + link));
                  Toast.makeText(getActivity(), getString(R.string.invite_link_copied), Toast.LENGTH_SHORT).show();
              }
          });
          bind(groupVM.getAbout(), groupVM.getShortName(), (about, shortName) -> {
              descriptionContainer.setVisibility(about != null || shortName != null
                      ? View.VISIBLE
                      : View.GONE);
          });
  
          // Notifications
          isNotificationsEnabled.setChecked(messenger().isNotificationsEnabled(Peer.group(chatId)));
          isNotificationsEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
              messenger().changeNotificationsEnabled(Peer.group(chatId), isChecked);
          });
          header.findViewById(R.id.notificationsCont).setOnClickListener(v -> {
              isNotificationsEnabled.setChecked(!isNotificationsEnabled.isChecked());
          });
  
          // Add Member
          bind(groupVM.getIsCanInviteMembers(), (canInvite) -> {
              if (canInvite) {
                  addMember.setVisibility(View.VISIBLE);
              } else {
                  addMember.setVisibility(View.GONE);
              }
          });
          addMember.setOnClickListener(view -> {
              startActivity(new Intent(getActivity(), AddMemberActivity.class)
                      .putExtra(Intents.EXTRA_GROUP_ID, chatId));
          });
  
          // Administration
          if (groupVM.getIsCanEditAdministration().get() || groupVM.getIsCanDelete().get()) {
              administrationAction.setOnClickListener(view -> {
                  startActivity(new Intent(getActivity(), GroupAdminActivity.class)
                          .putExtra(Intents.EXTRA_GROUP_ID, chatId));
              });
          } else {
              administrationAction.setVisibility(View.GONE);
          }
  
          // Async Members
          // Showing member only when members available and async members is enabled
          bind(groupVM.getIsCanViewMembers(), groupVM.getIsAsyncMembers(), (canViewMembers, vm1, isAsync, vm2) -> {
              if (canViewMembers) {
                  if (isAsync) {
                      members.setVisibility(View.VISIBLE);
                      header.findViewById(R.id.after_settings_divider).setVisibility(View.GONE);
                  } else {
                      members.setVisibility(View.GONE);
                      header.findViewById(R.id.after_settings_divider).setVisibility(View.VISIBLE);
                  }
              } else {
                  members.setVisibility(View.GONE);
                  header.findViewById(R.id.after_settings_divider).setVisibility(View.GONE);
              }
          });
          members.setOnClickListener(view -> {
              startActivity(new Intent(getContext(), MembersActivity.class)
                      .putExtra(Intents.EXTRA_GROUP_ID, groupVM.getId()));
          });
  
          // Leave
          bind(groupVM.getIsCanLeave(), canLeave -> {
              if (canLeave) {
                  leaveAction.setVisibility(View.VISIBLE);
                  leaveAction.setOnClickListener(view1 -> {
                      new AlertDialog.Builder(getActivity())
                              .setMessage(getString(groupVM.getGroupType() == GroupType.CHANNEL ? R.string.alert_leave_channel_message : R.string.alert_leave_group_message).replace("%1$s",
                                      groupVM.getName().get()))
                              .setPositiveButton(R.string.alert_leave_group_yes, (dialog2, which) -> {
                                  execute(messenger().leaveAndDeleteGroup(chatId).then(aVoid -> ActorSDK.returnToRoot(getActivity())));
                              })
                              .setNegativeButton(R.string.dialog_cancel, null)
                              .show()
                              .setCanceledOnTouchOutside(true);
                  });
              } else {
                  leaveAction.setVisibility(View.GONE);
              }
          });
  
  
          listView.addHeaderView(header, null, false);
  
          //
          // Members
          //
  
          groupUserAdapter = new MembersAdapter(getActivity(), getArguments().getInt("groupId"));
  
          listView.setAdapter(groupUserAdapter);
          listView.setOnItemClickListener((parent, view, position, id) -> {
              Object item = parent.getItemAtPosition(position);
              if (item != null && item instanceof GroupMember) {
                  GroupMember groupMember = (GroupMember) item;
                  if (groupMember.getUid() != myUid()) {
                      UserVM userVM = users().get(groupMember.getUid());
                      if (userVM != null) {
                          startActivity(Intents.openPrivateDialog(userVM.getId(), true, getActivity()));
                      }
                  }
              }
          });
          listView.setOnItemLongClickListener((adapterView, view, i, l) -> {
              Object item = adapterView.getItemAtPosition(i);
              if (item != null && item instanceof GroupMember) {
                  GroupMember groupMember = (GroupMember) item;
                  if (groupMember.getUid() != myUid()) {
                      UserVM userVM = users().get(groupMember.getUid());
                      if (userVM != null) {
                          groupUserAdapter.onMemberClick(groupVM, userVM, groupMember.isAdministrator(), groupMember.getInviterUid() == myUid(), (BaseActivity) getActivity());
                          return true;
                      }
                  }
              }
              return false;
          });
  
          //
          // Scroll handling
          //
  
          listView.setOnScrollListener(new AbsListView.OnScrollListener() {
              @Override
              public void onScrollStateChanged(AbsListView view, int scrollState) {
  
              }
  
              @Override
              public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                  if (firstVisibleItem >= 1) {
                      updateBar(Integer.MAX_VALUE);
                  } else {
                      View top = listView.getChildAt(0);
                      if (top != null) {
                          updateBar(-top.getTop());
                      } else {
                          updateBar(Integer.MAX_VALUE);
                      }
                  }
              }
          });
  
          //
          // Placeholder
          //
  
          bind(groupVM.isMember(), (isMember) -> {
              notMemberView.setVisibility(isMember ? View.GONE : View.VISIBLE);
              getActivity().invalidateOptionsMenu();
          });
  
          // Menu
          bind(groupVM.getIsCanEditInfo(), canEditInfo -> {
              getActivity().invalidateOptionsMenu();
          });
  
          return res;
      }
  
      @Override
      public void onResume() {
          super.onResume();
          memberBindings = bind(groupVM.getIsAsyncMembers(), groupVM.getMembers(), (isAsyncMembers, valueModel, memberList, valueModel2) -> {
              if (isAsyncMembers) {
                  groupUserAdapter.setMembers(new ArrayList<>());
              } else {
                  groupUserAdapter.setMembers(memberList);
              }
          });
      }
  
      @Override
      public void onPause() {
          super.onPause();
          if (memberBindings != null) {
              for (ActorBinder.Binding b : memberBindings) {
                  getBINDER().unbind(b);
              }
          }
      }
  
      @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
          super.onCreateOptionsMenu(menu, menuInflater);
          if (groupVM.getIsCanEditInfo().get()) {
              MenuItem menuItem = menu.add(Menu.NONE, R.id.edit, Menu.NONE, R.string.actor_menu_edit);
              menuItem.setIcon(R.drawable.ic_edit_white_24dp);
              menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
          }
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          if (item.getItemId() == R.id.edit) {
              startActivity(new Intent(getContext(), GroupEditActivity.class)
                      .putExtra(Intents.EXTRA_GROUP_ID, groupVM.getId()));
              return true;
          } else {
              return super.onOptionsItemSelected(item);
          }
      }
  
      public void updateBar(int offset) {
  
          int baseColor = getResources().getColor(R.color.primary);
          ActorStyle style = ActorSDK.sharedActor().style;
          if (style.getToolBarColor() != 0) {
              baseColor = style.getToolBarColor();
          }
  
          if (offset > Screen.dp(248 - 56)) {
              ((BaseActivity) getActivity()).getSupportActionBar().setBackgroundDrawable(
                      new ColorDrawable(baseColor));
          } else {
              float alpha = offset / (float) Screen.dp(248 - 56);
  
              int color = Color.argb((int) (255 * alpha),
                      Color.red(baseColor),
                      Color.green(baseColor),
                      Color.blue(baseColor));
  
              ((BaseActivity) getActivity()).getSupportActionBar().setBackgroundDrawable(
                      new ColorDrawable(color));
          }
      }
  
      @Override
      public void onDestroyView() {
          super.onDestroyView();
          if (groupUserAdapter != null) {
              groupUserAdapter.dispose();
              groupUserAdapter = null;
          }
          if (avatarView != null) {
              avatarView.unbind();
              avatarView = null;
          }
      }
  }