package com.lateensoft.pathfinder.toolkit.views.character;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.*;
import com.lateensoft.pathfinder.toolkit.R;
import com.lateensoft.pathfinder.toolkit.adapters.SimpleSelectableListAdapter;
import com.lateensoft.pathfinder.toolkit.dao.DataAccessException;
import com.lateensoft.pathfinder.toolkit.db.dao.table.PartyDAO;
import com.lateensoft.pathfinder.toolkit.db.dao.table.PartyMemberIdDAO;
import com.lateensoft.pathfinder.toolkit.model.IdNamePair;
import com.lateensoft.pathfinder.toolkit.views.MultiSelectActionModeController;
import com.lateensoft.pathfinder.toolkit.views.picker.PickerUtil;
import java.util.Collections;
import java.util.List;
public class CharacterPartyMembershipFragment extends AbstractCharacterSheetFragment {
private static final String TAG = CharacterPartyMembershipFragment.class.getSimpleName();
public static final int GET_NEW_PARTIES_CODE = 33091;
private ListView partyListView;
private Button addButton;
private PartyDAO<Long> partyDao;
private PartyMemberIdDAO partyMemberDao;
private List<IdNamePair> parties;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
partyMemberDao = new PartyMemberIdDAO(getContext());
partyDao = new PartyDAO<Long>(getContext(), partyMemberDao);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
setRootView(inflater.inflate(R.layout.character_membership_fragment,
container, false));
addButton = (Button) getRootView().findViewById(R.id.button_add);
addButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showPartyPicker();
}
});
partyListView = (ListView) getRootView()
.findViewById(R.id.lv_parties);
partyListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
partyListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (!actionModeController.isActionModeStarted()) {
actionModeController.startActionModeWithInitialSelection(position);
return true;
}
return false;
}
});
partyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (actionModeController.isActionModeStarted()) {
actionModeController.toggleListItemSelection(position);
}
}
});
return getRootView();
}
private MultiSelectActionModeController actionModeController = new MultiSelectActionModeController() {
@Override public Activity getActivity() {
return CharacterPartyMembershipFragment.this.getActivity();
}
@Override public int getActionMenuResourceId() {
return R.menu.remove_action_mode_menu;
}
@Override public ListView getListView() {
return partyListView;
}
@Override public boolean onActionItemClicked(MultiSelectActionModeController controller, MenuItem item) {
if (item.getItemId() == R.id.mi_remove) {
showRemoveCharacterFromPartyDialog(getSelectedItems(parties));
controller.finishActionMode();
return true;
}
return false;
}
};
private void refreshPartiesListView() {
if (actionModeController.isActionModeStarted()) {
actionModeController.finishActionMode();
}
Collections.sort(parties);
SimpleSelectableListAdapter adapter = new SimpleSelectableListAdapter<IdNamePair>(getActivity(),
parties, new SimpleSelectableListAdapter.DisplayStringGetter<IdNamePair>() {
@Override public String getDisplayString(IdNamePair object) {
return object.getName();
}
});
adapter.setItemSelectionGetter(new SimpleSelectableListAdapter.ItemSelectionGetter() {
@Override public boolean isItemSelected(int position) {
return actionModeController.isListItemSelected(position);
}
});
partyListView.setAdapter(adapter);
}
public void showRemoveCharacterFromPartyDialog(final List<IdNamePair> parties) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(R.string.membership_remove_dialog_title)
.setMessage(String.format(getString(R.string.membership_remove_dialog_msg), parties.size()));
builder.setPositiveButton(R.string.ok_button_text, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
removeCharacterFromParties(parties);
}
}
})
.setNegativeButton(R.string.cancel_button_text, null)
.show();
}
private void removeCharacterFromParties(List<IdNamePair> parties) {
for (IdNamePair party : parties) {
try {
partyMemberDao.removeById(party.getId(), getCurrentCharacterID());
this.parties.remove(party);
} catch (DataAccessException e) {
Log.e(TAG, "Could not remove character " + getCurrentCharacterID() +
" from party " + party.getId(), e);
}
}
refreshPartiesListView();
}
public void showPartyPicker() {
List<IdNamePair> parties = partyDao.findAll();
parties.removeAll(this.parties);
PickerUtil.Builder builder = new PickerUtil.Builder(getActivity());
builder.setTitle(R.string.membership_party_picker_title)
.setSingleChoice(false)
.setPickableParties(parties);
Intent pickerIntent = builder.build();
startActivityForResult(pickerIntent, GET_NEW_PARTIES_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GET_NEW_PARTIES_CODE && resultCode == Activity.RESULT_OK &&
data != null) {
PickerUtil.ResultData resultData = new PickerUtil.ResultData(data);
List<IdNamePair> partiesToAdd = resultData.getParties();
if (partiesToAdd != null) {
addCharacterToParties(partiesToAdd);
}
}
}
private void addCharacterToParties(List<IdNamePair> partiesToAdd) {
for (IdNamePair party : partiesToAdd) {
try {
partyMemberDao.add(party.getId(), getCurrentCharacterID());
parties.add(party);
} catch (DataAccessException e) {
Log.e(TAG, "Failed to add character " + getCurrentCharacterID() +
" to party " + party, e);
}
}
refreshPartiesListView();
}
@Override
public void updateFragmentUI() {
refreshPartiesListView();
}
@Override
public String getFragmentTitle() {
return getString(R.string.tab_character_membership);
}
@Override
public void updateDatabase() {
// Done dynamically
}
@Override
public void loadFromDatabase() {
parties = partyDao.findAllWithMember(getCurrentCharacterID());
}
}