package com.xabber.android.ui.fragment;
import android.app.Activity;
import android.app.ListFragment;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.NetworkException;
import com.xabber.android.data.entity.AccountJid;
import com.xabber.android.data.entity.UserJid;
import com.xabber.android.data.roster.RosterManager;
import com.xabber.android.ui.activity.ManagedActivity;
import com.xabber.android.ui.adapter.GroupEditorAdapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
public class GroupEditorFragment extends ListFragment implements TextWatcher, View.OnClickListener {
protected static final String ARG_ACCOUNT = "com.xabber.android.ui.fragment.GroupEditorFragment.ARG_ACCOUNT";
protected static final String ARG_USER = "com.xabber.android.ui.fragment.GroupEditorFragment.ARG_USER";
private static final String SAVED_GROUPS = "com.xabber.android.ui.fragment.GroupEditorFragment.SAVED_GROUPS";
private static final String SAVED_SELECTED = "com.xabber.android.ui.fragment.GroupEditorFragment.SAVED_SELECTED";
private static final String SAVED_ADD_GROUP_NAME = "com.xabber.android.ui.fragment.GroupEditorFragment.SAVED_ADD_GROUP_NAME";
private AccountJid account;
private UserJid user;
private GroupEditorAdapter groupEditorAdapter;
private Collection<String> groups;
private Collection<String> selected = new HashSet<>();
private EditText groupAddInput;
private CheckBox groupAddCheckBox;
private View footerView;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public GroupEditorFragment() {
}
public static GroupEditorFragment newInstance(AccountJid account, UserJid user) {
GroupEditorFragment fragment = new GroupEditorFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_ACCOUNT, account);
args.putParcelable(ARG_USER, user);
fragment.setArguments(args);
return fragment;
}
public static void hideKeyboard(Activity activity) {
// Check if no view has focus:
View view = activity.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
account = getArguments().getParcelable(ARG_ACCOUNT);
user = getArguments().getParcelable(ARG_USER);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setUpFooter();
groupEditorAdapter = new GroupEditorAdapter((ManagedActivity) getActivity(),
R.layout.item_group, new ArrayList<GroupEditorAdapter.Group>());
setListAdapter(groupEditorAdapter);
if (savedInstanceState != null) {
groups = savedInstanceState.getStringArrayList(SAVED_GROUPS);
selected = savedInstanceState.getStringArrayList(SAVED_SELECTED);
groupAddInput.setText(savedInstanceState.getString(SAVED_ADD_GROUP_NAME));
} else {
setAccountGroups();
if (user != null) {
selected = RosterManager.getInstance().getGroups(account, user);
}
}
}
protected void setAccountGroups() {
groups = RosterManager.getInstance().getGroups(account);
}
private void setUpFooter() {
footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.group_add_footer, null, false);
getListView().addFooterView(footerView);
groupAddInput = (EditText) footerView.findViewById(R.id.group_add_input);
groupAddInput.addTextChangedListener(this);
groupAddCheckBox = (CheckBox) footerView.findViewById(R.id.group_add_checkbox);
groupAddCheckBox.setVisibility(View.INVISIBLE);
groupAddCheckBox.setOnClickListener(this);
}
@Override
public void onResume() {
super.onResume();
updateGroups();
}
protected void updateGroups() {
ArrayList<String> list = new ArrayList<>(groups);
Collections.sort(list);
groupEditorAdapter.clear();
for (int position = 0; position < list.size(); position++) {
String groupName = list.get(position);
GroupEditorAdapter.Group group = new GroupEditorAdapter.Group(groupName, selected.contains(groupName));
groupEditorAdapter.add(group);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
selected = getSelected();
outState.putStringArrayList(SAVED_GROUPS, getGroups());
outState.putStringArrayList(SAVED_SELECTED, new ArrayList<>(selected));
outState.putString(SAVED_ADD_GROUP_NAME, groupAddInput.getText().toString());
}
@Override
public void onPause() {
super.onPause();
selected = getSelected();
if (account != null && user != null) {
try {
RosterManager.getInstance().setGroups(account, user, selected);
} catch (NetworkException e) {
Application.getInstance().onError(e);
}
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
CheckBox checkBox = (CheckBox) v.findViewById(R.id.group_item_selected_checkbox);
checkBox.toggle();
GroupEditorAdapter.Group group = groupEditorAdapter.getItem(position - getListView().getHeaderViewsCount());
group.setIsSelected(checkBox.isChecked());
}
protected ArrayList<String> getGroups() {
ArrayList<String> groups = new ArrayList<>();
for (int position = 0; position < groupEditorAdapter.getCount(); position++)
groups.add(groupEditorAdapter.getItem(position).getGroupName());
return groups;
}
public ArrayList<String> getSelected() {
ArrayList<String> selectedGroups = new ArrayList<>();
for (int position = 0; position < groupEditorAdapter.getCount(); position++) {
GroupEditorAdapter.Group item = groupEditorAdapter.getItem(position);
if (item.isSelected()) {
selectedGroups.add(item.getGroupName());
}
}
return selectedGroups;
}
@Override
public void afterTextChanged(Editable s) {
String groupName = groupAddInput.getText().toString().trim();
if (groupName.isEmpty() || getGroups().contains(groupName)) {
groupAddCheckBox.setVisibility(View.INVISIBLE);
} else {
groupAddCheckBox.setVisibility(View.VISIBLE);
}
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.group_add_checkbox) {
String groupName = groupAddInput.getText().toString().trim();
groupEditorAdapter.add(new GroupEditorAdapter.Group(groupName, true));
groupAddInput.getText().clear();
groupAddInput.clearFocus();
hideKeyboard(getActivity());
groupAddCheckBox.setChecked(false);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
protected AccountJid getAccount() {
return account;
}
protected void setAccount(AccountJid account) {
this.account = account;
}
protected UserJid getUser() {
return user;
}
protected void setUser(UserJid user) {
this.user = user;
}
protected View getFooterView() {
return footerView;
}
}