cleanup of competitors loading and more logging

This commit is contained in:
Lukas Niemeier committed 2013-07-31 02:57:35 +02:00
1 parent 9a137cd423
commit 24d945548f
8 files changed
+94 -56

No files matched your search

@@ -207,6 +207,7 @@ public class OnlineDataManager extends DataManager {
return new DataLoaderCallbacks<Collection<Competitor>>(callback, new LoaderCreator<Collection<Competitor>>() {
@Override
public Loader<DataLoaderResult<Collection<Competitor>>> create(int id, Bundle args) throws Exception {
ExLog.i(TAG, String.format("Creating Competitor-OnlineDataLoader %d", id));
SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE;
JsonDeserializer<Competitor> competitorDeserializer = new CompetitorDeserializer(domainFactory);
DataParser<Collection<Competitor>> parser = new CompetitorsDataParser(competitorDeserializer);
@@ -14,6 +14,16 @@ public class CompetitorsDataHandler extends DataHandler<Collection<Competitor>>
super(manager);
race = managedRace;
}
@Override
public boolean hasCachedResults() {
return race.getCompetitors() != null;
}
@Override
public Collection<Competitor> getCachedResults() {
return race.getCompetitors();
}
@Override
public void onResult(Collection<Competitor> data) {
@@ -33,19 +33,27 @@ public class OnlineDataLoader<T> extends AsyncTaskLoader<DataLoaderResult<T>> {
this.httpRequest = request;
this.dataParser = dataParser;
this.dataHandler = dataHandler;
ExLog.i(TAG, String.format("Loader created: %d", this.hashCode()));
}
@Override
protected void onStartLoading() {
if (dataHandler.hasCachedResults()) {
ExLog.i(TAG, "Using cached results...");
ExLog.i(TAG, String.format("Using cached results... (%d)", this.hashCode()));
deliverResult(new DataLoaderResult<T>(dataHandler.getCachedResults()));
} else {
ExLog.i(TAG, "No cached results. Forcing load now.");
ExLog.i(TAG, String.format("No cached results. Forcing load now (%d)", this.hashCode()));
forceLoad();
}
}
@Override
protected void onForceLoad() {
ExLog.i(TAG, String.format("Forcing load (%d)", this.hashCode()));
super.onForceLoad();
}
@Override
public void deliverResult(DataLoaderResult<T> result) {
if (result.isSuccessful()) {
@@ -88,7 +88,6 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener
}
private void showCourseAreaListFragment(Serializable eventId) {
Toast.makeText(LoginActivity.this, eventId.toString(), Toast.LENGTH_LONG).show();
addCourseAreaListFragment(eventId);
}
@@ -137,7 +136,6 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener
return;
}
Toast.makeText(LoginActivity.this, selectedCourseArea.getId().toString(), Toast.LENGTH_LONG).show();
Intent message = new Intent(LoginActivity.this, RacingActivity.class);
message.putExtra(AppConstants.COURSE_AREA_UUID_KEY, selectedCourseArea.getId());
fadeActivity(message);
@@ -29,9 +29,9 @@ public class RaceInfoFragmentChooser {
private RaceFragment createInfoFragment(Class<? extends RaceFragment> fragmentClass, ManagedRace managedRace) {
try {
ExLog.i(TAG, String.format("Fragment %s is chosen.", fragmentClass.getName()));
RaceFragment fragment = fragmentClass.newInstance();
fragment.setArguments(RaceFragment.createArguments(managedRace));
ExLog.i(TAG, String.format("Fragment %s may be choosen", fragmentClass.getName()));
return fragment;
} catch (Exception e) {
ExLog.e(TAG, String.format("Exception while instantiating race info fragment:\n%s", e.toString()));
@@ -238,7 +238,7 @@ public class ESSCourseDesignDialogFragment extends RaceDialogFragment {
dataManager.getMarksLoader(getRace(), new LoadClient<Collection<Mark>>() {
@Override
public void onLoadFailed(Exception reason) {
Toast.makeText(getActivity(), reason.toString(), Toast.LENGTH_LONG).show();
Toast.makeText(getActivity(), String.format("Marks: %s",reason.toString()), Toast.LENGTH_LONG).show();
}
@Override
@@ -438,9 +438,6 @@ public class ESSCourseDesignDialogFragment extends RaceDialogFragment {
builder.setTitle(R.string.pick_a_rounding_direction).setItems(R.array.rounding_directions,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int position) {
// for i18n we expect following order in array: 1. Port, 2. Starboard, 3. Gate
// String[] directions =
// getActivity().getResources().getStringArray(R.array.rounding_directions);
RoundingDirection pickedDirection = RoundingDirection.relevantValues()[position];
onRoundingDirectionPicked(courseElement, pickedDirection);
}
@@ -9,6 +9,7 @@ import java.util.List;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Loader;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -19,6 +20,7 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;
@@ -42,24 +44,29 @@ public class PositioningFragment extends RaceDialogFragment {
private DragSortListView positioningListView;
private ListView competitorListView;
private DragSortController dragSortController;
private CompetitorsAdapter competitorsAdapter;
private CompetitorPositioningListAdapter positioningAdapter;
protected List<Competitor> competitors;
protected List<Triple<Serializable, String, MaxPointsReason>> positionedCompetitors;
protected Comparator<Named> competitorComparator;
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 void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private boolean isDialog() {
return getDialog() != null;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (isDialog()) {
@@ -67,11 +74,11 @@ public class PositioningFragment extends RaceDialogFragment {
}
return inflater.inflate(R.layout.race_positioning_view, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (isDialog()) {
Button okButton = (Button) getView().findViewById(R.id.buttonPositionOk);
okButton.setVisibility(Button.VISIBLE);
@@ -83,19 +90,20 @@ public class PositioningFragment extends RaceDialogFragment {
}
});
}
competitors = new ArrayList<Competitor>();
Util.addAll(getRace().getCompetitors(), competitors);
competitorComparator = new NaturalNamedComparator();
Collections.sort(competitors, competitorComparator);
competitorsAdapter = new CompetitorsAdapter(getActivity(), R.layout.welter_grid_competitor_cell, competitors);
loadCompetitors();
positionedCompetitors = initializeFinishPositioningList();
deletePositionedCompetitorsFromUnpositionedList();
positioningAdapter = new CompetitorPositioningListAdapter(getActivity(), R.layout.welter_positioning_item, positionedCompetitors);
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() {
@@ -109,9 +117,9 @@ public class PositioningFragment extends RaceDialogFragment {
}
}
});
positioningListView.setRemoveListener(new DragSortListView.RemoveListener() {
@Override
public void remove(int toBeRemoved) {
Triple<Serializable, String, MaxPointsReason> item = positioningAdapter.getItem(toBeRemoved);
@@ -125,9 +133,9 @@ public class PositioningFragment extends RaceDialogFragment {
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);
@@ -140,18 +148,13 @@ public class PositioningFragment extends RaceDialogFragment {
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());
ExLog.i("RaceFinishingFragment", "Grid is clicked at position " + position + " for competitor "
+ competitor.getName());
onCompetitorClickedOnGrid(competitor);
}
});
}
@Override
public void onResume() {
super.onResume();
onLoadCompetitorsSucceeded(getRace().getCompetitors());
}
/**
* Creates a DragSortController and thereby defines the behaviour of the drag sort list
*/
@@ -168,38 +171,55 @@ public class PositioningFragment extends RaceDialogFragment {
}
private void loadCompetitors() {
getActivity().setProgressBarIndeterminateVisibility(true);
ReadonlyDataManager dataManager = OnlineDataManager.create(getActivity());
getLoaderManager().restartLoader(0, null,
Loader<?> competitorLoaders = getLoaderManager().initLoader(0, null,
dataManager.getCompetitorsLoader(getRace(), new LoadClient<Collection<Competitor>>() {
@Override
public void onLoadFailed(Exception reason) {
onLoadCompetitorsSucceeded(getRace().getCompetitors());
getActivity().setProgressBarIndeterminateVisibility(false);
Toast.makeText(getActivity(), String.format("Competitors: %s", reason.toString()),
Toast.LENGTH_LONG).show();
}
@Override
public void onLoadSucceded(Collection<Competitor> data) {
getActivity().setProgressBarIndeterminateVisibility(false);
onLoadCompetitorsSucceeded(data);
}
}));
// Force load to get non-cached remote competitors...
competitorLoaders.forceLoad();
}
protected void onLoadCompetitorsSucceeded(Collection<Competitor> data) {
competitors.clear();
competitors.addAll(data);
Collections.sort(competitors, competitorComparator);
deleteObsoleteCompetitorsFromPositionedList(data);
deletePositionedCompetitorsFromUnpositionedList();
competitorsAdapter.notifyDataSetChanged();
}
private void deleteObsoleteCompetitorsFromPositionedList(Collection<Competitor> validCompetitors) {
List<Triple<Serializable, String, MaxPointsReason>> toBeDeleted = new ArrayList<Util.Triple<Serializable, String, MaxPointsReason>>();
for (Triple<Serializable, String, MaxPointsReason> positionedItem : positionedCompetitors) {
if (!validCompetitors.contains(DomainFactoryImpl.INSTANCE.getExistingCompetitorById(positionedItem.getA()))) {
toBeDeleted.add(positionedItem);
}
}
positionedCompetitors.removeAll(toBeDeleted);
}
private void deletePositionedCompetitorsFromUnpositionedList() {
for (Triple<Serializable, String, MaxPointsReason> positionedItem : positionedCompetitors) {
Competitor competitor = DomainFactoryImpl.INSTANCE.getExistingCompetitorById(positionedItem.getA());
competitors.remove(competitor);
}
}
private List<Triple<Serializable, String, MaxPointsReason>> initializeFinishPositioningList() {
List<Triple<Serializable, String, MaxPointsReason>> positionings;
if (getRace().getState().getFinishPositioningList() != null) {
@@ -209,7 +229,7 @@ public class PositioningFragment extends RaceDialogFragment {
}
return positionings;
}
private void setItemToNewPositioning(int from, int to, Triple<Serializable, String, MaxPointsReason> item) {
positioningAdapter.remove(item);
positioningAdapter.insert(item, to);
@@ -218,16 +238,16 @@ public class PositioningFragment extends RaceDialogFragment {
private void createMaxPointsReasonSelectionDialog(final Triple<Serializable, String, MaxPointsReason> item) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final CharSequence[] maxPointsReasons = getAllMaxPointsReasons();
builder.setTitle(R.string.select_penalty_reason)
.setItems(maxPointsReasons, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int position) {
setMaxPointsReasonForItem(item, maxPointsReasons[position]);
}
});
builder.setTitle(R.string.select_penalty_reason).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()) {
@@ -236,19 +256,22 @@ public class PositioningFragment extends RaceDialogFragment {
return result.toArray(new CharSequence[result.size()]);
}
protected void setMaxPointsReasonForItem(Triple<Serializable, String, MaxPointsReason> item, CharSequence maxPointsReasonName) {
protected void setMaxPointsReasonForItem(Triple<Serializable, String, MaxPointsReason> item,
CharSequence maxPointsReasonName) {
MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName.toString());
Triple<Serializable, String, MaxPointsReason> newItem = new Triple<Serializable, String, MaxPointsReason>(item.getA(), item.getB(), maxPointsReason);
Triple<Serializable, String, MaxPointsReason> newItem = new Triple<Serializable, String, MaxPointsReason>(
item.getA(), item.getB(), 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, Triple<Serializable, String, MaxPointsReason> item, Triple<Serializable, String, MaxPointsReason> newItem) {
private void replaceItemInPositioningList(int currentIndexOfItem,
Triple<Serializable, String, MaxPointsReason> item, Triple<Serializable, String, MaxPointsReason> newItem) {
positioningAdapter.remove(item);
positioningAdapter.insert(newItem, currentIndexOfItem);
}
@@ -272,24 +295,25 @@ public class PositioningFragment extends RaceDialogFragment {
}
private void addNewCompetitorToPositioningList(Competitor competitor) {
positionedCompetitors.add(new Triple<Serializable, String, MaxPointsReason>(competitor.getId(), competitor.getName(), MaxPointsReason.NONE));
positionedCompetitors.add(new Triple<Serializable, String, MaxPointsReason>(competitor.getId(), competitor
.getName(), MaxPointsReason.NONE));
positioningAdapter.notifyDataSetChanged();
}
protected void onCompetitorRemovedFromPositioningList(Triple<Serializable, String, MaxPointsReason> item) {
Competitor competitor = DomainFactoryImpl.INSTANCE.getExistingCompetitorById(item.getA());
addNewCompetitorToCompetitorList(competitor);
removeCompetitorFromPositionings(item);
getRace().getState().setFinishPositioningListChanged(positionedCompetitors);
}
private void addNewCompetitorToCompetitorList(Competitor competitor) {
competitors.add(competitor);
Collections.sort(competitors, competitorComparator);
competitorsAdapter.notifyDataSetChanged();
}
protected void removeCompetitorFromPositionings(Triple<Serializable, String, MaxPointsReason> item) {
positionedCompetitors.remove(item);
positioningAdapter.notifyDataSetChanged();
@@ -1,14 +1,14 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
public class EssFinishedRaceFragment extends FinishedRaceFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {