# extracted positioning into own fragment

This commit is contained in:
Lukas Niemeier committed 2013-04-11 00:10:13 +02:00
1 parent 7ae0f1bb3f
commit cbf97b4120
4 files changed
+309 -202

No files matched your search

@@ -40,7 +40,7 @@
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/InnerRelativeLayout"
android:id="@+id/innerFragmentHolder"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.618"
@@ -49,6 +49,7 @@
<!-- DISPLAY SECTION -->
<!--
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@@ -108,7 +109,7 @@
android:verticalSpacing="5dp"
android:layout_gravity="left"
/>
</LinearLayout>
</LinearLayout> -->
<!-- END DISPLAY SECTION -->
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dslv="http://schemas.android.com/apk**/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal" >
<TextView
android:id="@+id/textPositioningHeaderLeft"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="30dp"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:text="@string/positionings"
android:textSize="12pt"
android:textStyle="bold" />
<TextView
android:id="@+id/textPositioningHeaderRight"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:text="@string/availableFinishingCompetitors"
android:textSize="12pt"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal" >
<com.mobeta.android.dslv.DragSortListView
android:id="@+id/dragSortListPositioning"
android:layout_width="350dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:layout_marginLeft="10dp"
android:layout_marginRight="30dp"
android:verticalSpacing="5dp"
dslv:collapsed_height="2dp"
dslv:drag_enabled="true"
dslv:drag_scroll_start="0.33"
dslv:float_alpha="0.6"
dslv:max_drag_scroll_speed="0.5"
dslv:slide_shuffle_speed="0.3"
dslv:track_drag_sort="false"
dslv:use_default_controller="false" />
<ListView
android:id="@+id/gridViewPositioning"
android:layout_width="250dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:verticalSpacing="5dp" />
</LinearLayout>
</LinearLayout>
@@ -1,9 +1,6 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.app.AlertDialog;
import android.app.FragmentManager;
import android.content.DialogInterface;
@@ -12,26 +9,14 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorPositioningListAdapter;
import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorsAdapter;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortModeSelectionDialog;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
@@ -43,22 +28,6 @@ public class FinishingRaceFragment extends RaceFragment {
private ImageButton abortingFlagButton;
private ImageButton blueFlagButton;
private DragSortListView positioningListView;
private ListView competitorListView;
private DragSortController dragSortController;
private CompetitorsAdapter competitorsAdapter;
private CompetitorPositioningListAdapter positioningAdapter;
protected List<Competitor> competitors;
protected List<Pair<Competitor, MaxPointsReason>> positionedCompetitors;
private int dragStartMode = DragSortController.ON_DRAG;
private boolean removeEnabled = true;
private int removeMode = DragSortController.FLING_REMOVE;
private boolean sortEnabled = true;
private boolean dragEnabled = true;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.race_finishing_view, container, false);
@@ -74,54 +43,10 @@ public class FinishingRaceFragment extends RaceFragment {
blueFlagButton = (ImageButton) getView().findViewById(R.id.blueFlagButton);
abortingFlagButton = (ImageButton) getView().findViewById(R.id.abortingFlagButton);
competitors = new ArrayList<Competitor>();
Util.addAll(getRace().getCompetitors(), competitors);
competitorsAdapter = new CompetitorsAdapter(getActivity(), R.layout.welter_grid_competitor_cell, competitors);
PositioningFragment positioningFragment = new PositioningFragment();
positioningFragment.setArguments(PositioningFragment.createArguments(getRace()));
getFragmentManager().beginTransaction().add(R.id.innerFragmentHolder, positioningFragment, null).commit();
positionedCompetitors = initializeFinishPositioningList();
deletePositionedCompetitorsFromUnpositionedList();
positioningAdapter = new CompetitorPositioningListAdapter(getActivity(), R.layout.welter_positioning_item, positionedCompetitors);
positioningListView = (DragSortListView) getView().findViewById(R.id.listViewPositioningList);
positioningListView.setAdapter(positioningAdapter);
positioningListView.setDropListener(new DragSortListView.DropListener() {
@Override
public void drop(int from, int to) {
if (from != to) {
Pair<Competitor, MaxPointsReason> item = positioningAdapter.getItem(from);
setItemToNewPositioning(from, to, item);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
}
});
positioningListView.setRemoveListener(new DragSortListView.RemoveListener() {
@Override
public void remove(int toBeRemoved) {
Pair<Competitor, MaxPointsReason> item = positioningAdapter.getItem(toBeRemoved);
onCompetitorRemovedFromPositioningList(item);
}
});
positioningListView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
createMaxPointsReasonSelectionDialog(positionedCompetitors.get(position));
return true;
}
});
dragSortController = buildDragSortController(positioningListView);
positioningListView.setFloatViewManager(dragSortController);
positioningListView.setOnTouchListener(dragSortController);
positioningListView.setDragEnabled(dragEnabled);
competitorListView = (ListView) getView().findViewById(R.id.gridViewCompetitors);
competitorListView.setAdapter(competitorsAdapter);
blueFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showRemoveBlueFlagDialog();
@@ -135,131 +60,9 @@ public class FinishingRaceFragment extends RaceFragment {
ExLog.i(ExLog.FLAG_NOVEMBER, getRace().getId().toString(), getActivity());
}
});
competitorListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
Competitor competitor = (Competitor) competitorsAdapter.getItem(position);
ExLog.i("RaceFinishingFragment", "Grid is clicked at position " + position + " for competitor " + competitor.getName());
onCompetitorClickedOnGrid(competitor);
}
});
}
/**
* Creates a DragSortController and thereby defines the behaviour of the drag sort list
*/
public DragSortController buildDragSortController(DragSortListView dragSortListView) {
DragSortController controller = new DragSortController(dragSortListView);
controller.setDragHandleId(R.id.drag_handle);
controller.setFlingHandleId(R.id.drag_handle);
controller.setRemoveEnabled(removeEnabled);
controller.setSortEnabled(sortEnabled);
controller.setDragInitMode(dragStartMode);
controller.setRemoveMode(removeMode);
controller.setBackgroundColor(getActivity().getResources().getColor(R.color.welter_medium_blue));
return controller;
}
private void deletePositionedCompetitorsFromUnpositionedList() {
for (Pair<Competitor, MaxPointsReason> positionedItem : positionedCompetitors) {
competitors.remove(positionedItem.getA());
}
}
private List<Pair<Competitor, MaxPointsReason>> initializeFinishPositioningList() {
List<Pair<Competitor, MaxPointsReason>> positionings;
if (getRace().getState().getFinishPositioningList() != null) {
positionings = getRace().getState().getFinishPositioningList();
} else {
positionings = new ArrayList<Util.Pair<Competitor,MaxPointsReason>>();
}
return positionings;
}
private void setItemToNewPositioning(int from, int to, Pair<Competitor, MaxPointsReason> item) {
positioningAdapter.remove(item);
positioningAdapter.insert(item, to);
}
private void createMaxPointsReasonSelectionDialog(final Pair<Competitor, MaxPointsReason> item) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final CharSequence[] maxPointsReasons = getAllMaxPointsReasons();
builder.setTitle(R.string.change_course_element)
.setItems(maxPointsReasons, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int position) {
setMaxPointsReasonForItem(item, maxPointsReasons[position]);
}
});
builder.create();
builder.show();
}
private CharSequence[] getAllMaxPointsReasons() {
List<CharSequence> result = new ArrayList<CharSequence>();
for (MaxPointsReason reason : MaxPointsReason.values()) {
result.add(reason.name());
}
return result.toArray(new CharSequence[result.size()]);
}
protected void setMaxPointsReasonForItem(Pair<Competitor, MaxPointsReason> item, CharSequence maxPointsReasonName) {
MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName.toString());
Pair<Competitor, MaxPointsReason> newItem = new Pair<Competitor, MaxPointsReason>(item.getA(), maxPointsReason);
int currentIndexOfItem = positionedCompetitors.indexOf(item);
replaceItemInPositioningList(currentIndexOfItem, item, newItem);
if (!maxPointsReason.equals(MaxPointsReason.NONE)) {
setCompetitorToBottomOfPositioningList(newItem);
}
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
private void replaceItemInPositioningList(int currentIndexOfItem, Pair<Competitor, MaxPointsReason> item, Pair<Competitor, MaxPointsReason> newItem) {
positioningAdapter.remove(item);
positioningAdapter.insert(newItem, currentIndexOfItem);
}
private void setCompetitorToBottomOfPositioningList(Pair<Competitor, MaxPointsReason> item) {
int currentIndex = positionedCompetitors.indexOf(item);
int lastIndex = positionedCompetitors.size() - 1;
setItemToNewPositioning(currentIndex, lastIndex, item);
}
protected void onCompetitorClickedOnGrid(Competitor competitor) {
addNewCompetitorToPositioningList(competitor);
removeCompetitorFromGrid(competitor);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
protected void removeCompetitorFromGrid(Competitor competitor) {
competitors.remove(competitor);
competitorsAdapter.notifyDataSetChanged();
}
private void addNewCompetitorToPositioningList(Competitor competitor) {
positionedCompetitors.add(new Pair<Competitor, MaxPointsReason>(competitor, MaxPointsReason.NONE));
positioningAdapter.notifyDataSetChanged();
}
protected void onCompetitorRemovedFromPositioningList(Pair<Competitor, MaxPointsReason> item) {
addNewCompetitorToCompetitorList(item.getA());
removeCompetitorFromPositionings(item);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
private void addNewCompetitorToCompetitorList(Competitor competitor) {
competitors.add(competitor);
competitorsAdapter.notifyDataSetChanged();
}
protected void removeCompetitorFromPositionings(Pair<Competitor, MaxPointsReason> item) {
positionedCompetitors.remove(item);
positioningAdapter.notifyDataSetChanged();
}
protected void setCountdownLabels(long millisecondsSinceStart) {
setStarttimeCountupLabel(millisecondsSinceStart);
}
@@ -0,0 +1,235 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorPositioningListAdapter;
import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorsAdapter;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
public class PositioningFragment extends RaceFragment {
private DragSortListView positioningListView;
private ListView competitorListView;
private DragSortController dragSortController;
private CompetitorsAdapter competitorsAdapter;
private CompetitorPositioningListAdapter positioningAdapter;
protected List<Competitor> competitors;
protected List<Pair<Competitor, MaxPointsReason>> positionedCompetitors;
private int dragStartMode = DragSortController.ON_DRAG;
private boolean removeEnabled = true;
private int removeMode = DragSortController.FLING_REMOVE;
private boolean sortEnabled = true;
private boolean dragEnabled = true;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.race_positioning_view, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
competitors = new ArrayList<Competitor>();
Util.addAll(getRace().getCompetitors(), competitors);
competitorsAdapter = new CompetitorsAdapter(getActivity(), R.layout.welter_grid_competitor_cell, competitors);
positionedCompetitors = initializeFinishPositioningList();
deletePositionedCompetitorsFromUnpositionedList();
positioningAdapter = new CompetitorPositioningListAdapter(getActivity(), R.layout.welter_positioning_item, positionedCompetitors);
positioningListView = (DragSortListView) getView().findViewById(R.id.dragSortListPositioning);
positioningListView.setAdapter(positioningAdapter);
positioningListView.setDropListener(new DragSortListView.DropListener() {
@Override
public void drop(int from, int to) {
if (from != to) {
Pair<Competitor, MaxPointsReason> item = positioningAdapter.getItem(from);
setItemToNewPositioning(from, to, item);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
}
});
positioningListView.setRemoveListener(new DragSortListView.RemoveListener() {
@Override
public void remove(int toBeRemoved) {
Pair<Competitor, MaxPointsReason> item = positioningAdapter.getItem(toBeRemoved);
onCompetitorRemovedFromPositioningList(item);
}
});
positioningListView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
createMaxPointsReasonSelectionDialog(positionedCompetitors.get(position));
return true;
}
});
dragSortController = buildDragSortController(positioningListView);
positioningListView.setFloatViewManager(dragSortController);
positioningListView.setOnTouchListener(dragSortController);
positioningListView.setDragEnabled(dragEnabled);
competitorListView = (ListView) getView().findViewById(R.id.gridViewPositioning);
competitorListView.setAdapter(competitorsAdapter);
competitorListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
Competitor competitor = (Competitor) competitorsAdapter.getItem(position);
ExLog.i("RaceFinishingFragment", "Grid is clicked at position " + position + " for competitor " + competitor.getName());
onCompetitorClickedOnGrid(competitor);
}
});
}
/**
* Creates a DragSortController and thereby defines the behaviour of the drag sort list
*/
public DragSortController buildDragSortController(DragSortListView dragSortListView) {
DragSortController controller = new DragSortController(dragSortListView);
controller.setDragHandleId(R.id.drag_handle);
controller.setFlingHandleId(R.id.drag_handle);
controller.setRemoveEnabled(removeEnabled);
controller.setSortEnabled(sortEnabled);
controller.setDragInitMode(dragStartMode);
controller.setRemoveMode(removeMode);
controller.setBackgroundColor(getActivity().getResources().getColor(R.color.welter_medium_blue));
return controller;
}
private void deletePositionedCompetitorsFromUnpositionedList() {
for (Pair<Competitor, MaxPointsReason> positionedItem : positionedCompetitors) {
competitors.remove(positionedItem.getA());
}
}
private List<Pair<Competitor, MaxPointsReason>> initializeFinishPositioningList() {
List<Pair<Competitor, MaxPointsReason>> positionings;
if (getRace().getState().getFinishPositioningList() != null) {
positionings = getRace().getState().getFinishPositioningList();
} else {
positionings = new ArrayList<Util.Pair<Competitor,MaxPointsReason>>();
}
return positionings;
}
private void setItemToNewPositioning(int from, int to, Pair<Competitor, MaxPointsReason> item) {
positioningAdapter.remove(item);
positioningAdapter.insert(item, to);
}
private void createMaxPointsReasonSelectionDialog(final Pair<Competitor, MaxPointsReason> item) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final CharSequence[] maxPointsReasons = getAllMaxPointsReasons();
builder.setTitle(R.string.change_course_element)
.setItems(maxPointsReasons, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int position) {
setMaxPointsReasonForItem(item, maxPointsReasons[position]);
}
});
builder.create();
builder.show();
}
private CharSequence[] getAllMaxPointsReasons() {
List<CharSequence> result = new ArrayList<CharSequence>();
for (MaxPointsReason reason : MaxPointsReason.values()) {
result.add(reason.name());
}
return result.toArray(new CharSequence[result.size()]);
}
protected void setMaxPointsReasonForItem(Pair<Competitor, MaxPointsReason> item, CharSequence maxPointsReasonName) {
MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName.toString());
Pair<Competitor, MaxPointsReason> newItem = new Pair<Competitor, MaxPointsReason>(item.getA(), maxPointsReason);
int currentIndexOfItem = positionedCompetitors.indexOf(item);
replaceItemInPositioningList(currentIndexOfItem, item, newItem);
if (!maxPointsReason.equals(MaxPointsReason.NONE)) {
setCompetitorToBottomOfPositioningList(newItem);
}
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
private void replaceItemInPositioningList(int currentIndexOfItem, Pair<Competitor, MaxPointsReason> item, Pair<Competitor, MaxPointsReason> newItem) {
positioningAdapter.remove(item);
positioningAdapter.insert(newItem, currentIndexOfItem);
}
private void setCompetitorToBottomOfPositioningList(Pair<Competitor, MaxPointsReason> item) {
int currentIndex = positionedCompetitors.indexOf(item);
int lastIndex = positionedCompetitors.size() - 1;
setItemToNewPositioning(currentIndex, lastIndex, item);
}
protected void onCompetitorClickedOnGrid(Competitor competitor) {
addNewCompetitorToPositioningList(competitor);
removeCompetitorFromGrid(competitor);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
protected void removeCompetitorFromGrid(Competitor competitor) {
competitors.remove(competitor);
competitorsAdapter.notifyDataSetChanged();
}
private void addNewCompetitorToPositioningList(Competitor competitor) {
positionedCompetitors.add(new Pair<Competitor, MaxPointsReason>(competitor, MaxPointsReason.NONE));
positioningAdapter.notifyDataSetChanged();
}
protected void onCompetitorRemovedFromPositioningList(Pair<Competitor, MaxPointsReason> item) {
addNewCompetitorToCompetitorList(item.getA());
removeCompetitorFromPositionings(item);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
private void addNewCompetitorToCompetitorList(Competitor competitor) {
competitors.add(competitor);
competitorsAdapter.notifyDataSetChanged();
}
protected void removeCompetitorFromPositionings(Pair<Competitor, MaxPointsReason> item) {
positionedCompetitors.remove(item);
positioningAdapter.notifyDataSetChanged();
}
@Override
public void notifyTick() {
}
}