optimized Tracking List for Phones

This commit is contained in:
Peter Siegmund
2015-10-29 10:57:10 +01:00
parent 6a49e59a58
commit d6bdc15793
34 changed files with 384 additions and 151 deletions
@@ -5,7 +5,7 @@
</item>
<item android:right="@dimen/default_margin_half">
<bitmap
android:src="@drawable/ic_delete_white_36dp"
android:src="@drawable/ic_delete_white_24dp"
android:gravity="right|center_vertical"/>
</item>
</layer-list>
@@ -5,7 +5,7 @@
</item>
<item android:right="@dimen/default_margin_half">
<bitmap
android:src="@drawable/ic_delete_black_36dp"
android:src="@drawable/ic_delete_black_24dp"
android:gravity="right|center_vertical"/>
</item>
</layer-list>
@@ -5,7 +5,7 @@
</item>
<item android:left="@dimen/default_margin_half">
<bitmap
android:src="@drawable/ic_delete_white_36dp"
android:src="@drawable/ic_delete_white_24dp"
android:gravity="left|center_vertical"/>
</item>
</layer-list>
@@ -5,7 +5,7 @@
</item>
<item android:left="@dimen/default_margin_half">
<bitmap
android:src="@drawable/ic_delete_black_36dp"
android:src="@drawable/ic_delete_black_24dp"
android:gravity="left|center_vertical"/>
</item>
</layer-list>
@@ -3,17 +3,16 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight">
android:layout_height="42dp">
<LinearLayout
android:id="@+id/container"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/default_padding"
android:paddingRight="@dimen/default_padding">
android:paddingLeft="@dimen/side_padding"
android:paddingRight="@dimen/side_padding">
<TextView
android:id="@+id/vessel_id"
@@ -13,20 +13,6 @@
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<RelativeLayout
android:id="@id/drag_handle"
android:layout_width="42dp"
android:layout_height="42dp"
android:layout_gravity="center_vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/dragster"
android:contentDescription="@string/drag_handle_description"/>
</RelativeLayout>
<TextView
android:id="@+id/position"
android:layout_width="0dp"
@@ -51,8 +37,7 @@
android:layout_gravity="center_vertical"
android:padding="5dp"
android:textAppearance="?textSmall"
tools:text="GDR001"
/>
tools:text="GDR001"/>
<TextView
android:id="@+id/competitor"
@@ -64,5 +49,19 @@
android:textAppearance="?textSmall"
tools:text="Cool Runnings"/>
</LinearLayout>
<RelativeLayout
android:id="@id/drag_handle"
android:layout_width="42dp"
android:layout_height="42dp"
android:layout_gravity="center_vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/dragster"
android:contentDescription="@string/drag_handle_description"/>
</RelativeLayout>
</LinearLayout>
</FrameLayout>
@@ -18,19 +18,19 @@
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_margin_half"
android:layout_marginLeft="@dimen/default_margin_half"
android:layout_weight="1"
android:gravity="center"
android:text="@string/positionings"
android:text="@string/availableFinishingCompetitors"
android:textAppearance="?textNormal"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/default_margin_half"
android:layout_marginRight="@dimen/default_margin_half"
android:layout_weight="1"
android:gravity="center"
android:text="@string/availableFinishingCompetitors"
android:text="@string/tracking_list"
android:textAppearance="?textNormal"/>
</LinearLayout>
@@ -52,7 +52,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/confirm_positionings"/>
android:text="@string/confirm_tracking_list"/>
</LinearLayout>
<LinearLayout
@@ -65,18 +65,18 @@
android:gravity="center"
android:orientation="horizontal">
<android.support.v7.widget.RecyclerView
android:id="@+id/list_positioning_chosen"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/default_margin_half"
android:layout_weight="1"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_positioning_all"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/default_margin_half"
android:layout_weight="1"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_positioning_chosen"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/default_margin_half"
android:layout_weight="1"/>
</LinearLayout>
</RelativeLayout>
@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true">
<RelativeLayout
android:id="@+id/tracking_header"
android:layout_width="match_parent"
android:layout_height="@dimen/selector_header_height"
android:background="?sap_gray"
android:clickable="false">
<LinearLayout
android:id="@+id/header_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/side_padding"
android:orientation="horizontal">
<ImageView
android:id="@+id/header_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="?chevron_left_24dp"/>
<TextView
android:id="@+id/header_caption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/tracking_list"
android:textAppearance="?textHeader"/>
</LinearLayout>
<View
android:id="@+id/line_top"
android:layout_width="match_parent"
android:layout_height="@dimen/unscheduled_header_line"
android:layout_alignParentBottom="true"
android:background="?black"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/bottom_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="?sap_gray_black_30"
android:clickable="false"
android:gravity="center"
android:orientation="horizontal">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/thin_line"
android:background="?attr/sap_gray"
android:layout_alignParentTop="true"/>
<Button
android:id="@+id/confirm"
style="?button"
android:layout_width="@dimen/default_button_width"
android:layout_height="@dimen/default_button_height"
android:layout_centerInParent="true"
android:layout_marginTop="@dimen/default_margin_half"
android:layout_marginBottom="@dimen/default_margin_half"
android:text="@string/confirm_tracking_list"
android:textSize="@dimen/textSize_18"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/bottom_bar"
android:layout_below="@+id/tracking_header"
android:background="?sap_gray_black_30"
android:paddingTop="@dimen/side_padding">
<RelativeLayout
android:id="@+id/panel_switcher"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true">
<ImageView
android:id="@+id/nav_prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="?button_prev"/>
<ImageView
android:id="@+id/nav_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="?button_next"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal">
<ImageView
android:id="@+id/panel_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
tools:src="@drawable/ic_dot"/>
<ImageView
android:id="@+id/panel_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:src="@drawable/ic_dot"/>
</LinearLayout>
</RelativeLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/panel_switcher"
android:paddingLeft="@dimen/side_padding"
android:paddingRight="@dimen/side_padding">
<android.support.v7.widget.RecyclerView
android:id="@+id/list_positioning_chosen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_positioning_all"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</FrameLayout>
</RelativeLayout>
</RelativeLayout>
@@ -97,9 +97,9 @@
<string name="retry">Wiederholen</string>
<string name="yes">Ja</string>
<string name="no">Nein</string>
<string name="positionings">Ergebnisliste</string>
<string name="set_positionings">Ergebnisliste füllen</string>
<string name="confirm_positionings">Ergebnisliste bestätigen</string>
<string name="tracking_list">Ergebnisliste</string>
<string name="set_tracking_list">Ergebnisliste füllen</string>
<string name="confirm_tracking_list">Ergebnisliste bestätigen</string>
<string name="availableFinishingCompetitors">Segler</string>
<string name="choose_blue_flag_finishing">Rennen beenden</string>
<string name="drag_handle_description">Cursor</string>
@@ -3,6 +3,7 @@
<item name="race_list_header" type="layout">@layout/race_list_header_small</item>
<item name="race_list_list" type="layout">@layout/race_list_list_top</item>
<item name="race_tracking_list" type="layout">@layout/race_tracking_list_large</item>
<item name="wind_view" type="layout">@layout/wind_view_xlarge</item>
</resources>
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="race_positioning" type="layout">@layout/race_tracking_list_small</item>
</resources>
@@ -9,6 +9,7 @@
<item name="race_main" type="layout">@layout/race_main_small</item>
<item name="race_panel_flags" type="layout">@layout/race_panel_flags_hor</item>
<item name="race_panel_setup" type="layout">@layout/race_panel_setup_hor</item>
<item name="race_tracking_list" type="layout">@layout/race_tracking_list_small</item>
<item name="race_schedule_course_marks" type="layout">@layout/race_schedule_course_marks_small</item>
<item name="race_time_picker" type="layout">@layout/race_time_picker_small</item>
<item name="toolbar_racing_activity" type="layout">@layout/toolbar</item>
@@ -108,7 +108,7 @@
<string name="retry">Retry</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="positionings">Positioning</string>
<string name="tracking_list">Tracking List</string>
<string name="availableFinishingCompetitors">Competitors</string>
<string name="choose_blue_flag_finishing">Finish race</string>
<string name="drag_handle_description">Drag handle</string>
@@ -182,8 +182,8 @@
<string name="start">Set start time</string>
<string name="nationality">Nationality</string>
<string name="number">Number</string>
<string name="set_positionings">Set positionings</string>
<string name="confirm_positionings">Confirm positionings</string>
<string name="set_tracking_list">Set tracking list</string>
<string name="confirm_tracking_list">Confirm tracking list</string>
<string name="snap">Snap</string>
<string name="logout_dialog_title">Are you sure want to logout?</string>
<string name="logout_dialog_message">Logging out stops automatic monitoring for all races.</string>
@@ -1,14 +1,18 @@
package com.sap.sailing.racecommittee.app.data;
import com.sap.sailing.domain.base.*;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import java.io.Serializable;
import java.util.Collection;
import java.util.Set;
import java.util.UUID;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
public interface DataStore {
@@ -1,6 +1,7 @@
package com.sap.sailing.racecommittee.app.domain.impl;
import android.text.TextUtils;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.SeriesBase;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
@@ -5,6 +5,7 @@ import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.racecommittee.app.R;
@@ -25,7 +25,7 @@ public class CompetitorAdapter extends RecyclerView.Adapter<CompetitorAdapter.Vi
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View layout = LayoutInflater.from(mContext).inflate(R.layout.race_positioning_competitor_item, parent, false);
View layout = LayoutInflater.from(mContext).inflate(R.layout.race_tracking_list_competitor_item, parent, false);
return new ViewHolder(layout);
}
@@ -50,7 +50,7 @@ public class FinishListAdapter extends BaseDraggableSwipeAdapter<FinishListAdapt
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View layout = LayoutInflater.from(mContext).inflate(R.layout.race_positioning_draggable_item, parent, false);
View layout = LayoutInflater.from(mContext).inflate(R.layout.race_tracking_list_draggable_item, parent, false);
return new ViewHolder(layout);
}
@@ -217,13 +217,14 @@ public class FinishListAdapter extends BaseDraggableSwipeAdapter<FinishListAdapt
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnLongClickListener(this);
container = ViewHelper.get(itemView, R.id.container);
dragHandle = ViewHelper.get(itemView, R.id.drag_handle);
position = ViewHelper.get(itemView, R.id.position);
vesselId = ViewHelper.get(itemView, R.id.vessel_id);
competitor = ViewHelper.get(itemView, R.id.competitor);
position = ViewHelper.get(itemView, R.id.position);
if (position != null) {
position.setOnLongClickListener(this);
}
}
@Override
@@ -7,7 +7,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
@@ -9,6 +9,7 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.racecommittee.app.R;
@@ -1,9 +1,14 @@
package com.sap.sailing.racecommittee.app.ui.fragments;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.view.View;
import android.widget.ImageView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.BroadcastManager;
@@ -14,6 +19,8 @@ import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.utils.BitmapHelper;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sailing.racecommittee.app.utils.TickListener;
import com.sap.sailing.racecommittee.app.utils.TickSingleton;
import com.sap.sse.common.TimePoint;
@@ -26,6 +33,10 @@ public abstract class RaceFragment extends LoggableFragment implements TickListe
protected ManagedRace managedRace;
protected AppPreferences preferences;
protected ArrayList<ImageView> mDots;
protected ArrayList<View> mPanels;
protected int mActivePage = 0;
public static Bundle createArguments(ManagedRace race) {
Bundle arguments = new Bundle();
arguments.putString(AppConstants.RACE_ID_KEY, race.getId());
@@ -136,4 +147,45 @@ public abstract class RaceFragment extends LoggableFragment implements TickListe
}
return frame;
}
protected void viewPanel(int direction) {
if (mDots.size() == 0) {
return;
}
// find next active page (with overflow)
mActivePage += direction;
if (mActivePage < 0) {
mActivePage = mDots.size() - 1;
}
if (mActivePage == mDots.size()) {
mActivePage = 0;
}
// ignore invisible dots
if (mDots.get(mActivePage).getVisibility() == View.GONE) {
viewPanel(direction);
}
// tint all dots gray
for (ImageView mDot : mDots) {
int tint = ThemeHelper.getColor(getActivity(), R.attr.sap_light_gray);
Drawable drawable = BitmapHelper.getTintedDrawable(getActivity(), R.drawable.ic_dot, tint);
mDot.setImageDrawable(drawable);
}
// tint current dot black
int tint = ThemeHelper.getColor(getActivity(), R.attr.black);
Drawable drawable = BitmapHelper.getTintedDrawable(getActivity(), R.drawable.ic_dot, tint);
mDots.get(mActivePage).setImageDrawable(drawable);
// hide all panels
for (View view : mPanels) {
view.setVisibility(View.GONE);
}
// show current panel
mPanels.get(mActivePage).setVisibility(View.VISIBLE);
}
}
@@ -19,10 +19,10 @@ import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.CourseFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PhotoListFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PositioningFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.LineStartModeFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PhotoListFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.StartProcedureFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.TrackingListFragment;
public class FinishedButtonFragment extends BasePanelFragment {
@@ -180,7 +180,7 @@ public class FinishedButtonFragment extends BasePanelFragment {
break;
case LEVEL_TOGGLED:
replaceFragment(PositioningFragment.newInstance(getRecentArguments()), R.id.finished_content);
replaceFragment(TrackingListFragment.newInstance(getRecentArguments()), getFrameId(getActivity(), R.id.finished_edit, R.id.finished_content));
break;
default:
@@ -7,7 +7,6 @@ import android.app.FragmentTransaction;
import android.support.annotation.IdRes;
import android.support.annotation.IntDef;
import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
@@ -18,6 +18,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator;
@@ -25,6 +26,7 @@ import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropM
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager;
import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager;
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl;
import com.sap.sailing.domain.base.Competitor;
@@ -44,14 +46,13 @@ import com.sap.sailing.racecommittee.app.ui.comparators.NaturalNamedComparator;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class PositioningFragment extends BaseFragment
implements CompetitorAdapter.CompetitorClick, FinishListAdapter.FinishEvents {
public class TrackingListFragment extends BaseFragment
implements CompetitorAdapter.CompetitorClick, FinishListAdapter.FinishEvents, View.OnClickListener {
private RecyclerViewDragDropManager mDragDropManager;
private RecyclerViewSwipeManager mSwipeManager;
private RecyclerViewTouchActionGuardManager mGuardManager;
private RecyclerView mFinishView;
private RecyclerView mCompetitorView;
private Button mConfirm;
private RecyclerView.Adapter<FinishListAdapter.ViewHolder> mFinishedAdapter;
@@ -61,19 +62,58 @@ public class PositioningFragment extends BaseFragment
private ArrayList<Competitor> mCompetitorData;
private long mId = 0;
public PositioningFragment() {
public TrackingListFragment() {
mCompetitorData = new ArrayList<>();
}
public static PositioningFragment newInstance(Bundle args) {
PositioningFragment fragment = new PositioningFragment();
public static TrackingListFragment newInstance(Bundle args) {
TrackingListFragment fragment = new TrackingListFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.race_positioning, container, false);
View layout = inflater.inflate(R.layout.race_tracking_list, container, false);
mDots = new ArrayList<>();
mPanels = new ArrayList<>();
ImageView dot;
dot = ViewHelper.get(layout, R.id.panel_1);
if (dot != null) {
mDots.add(dot);
}
dot = ViewHelper.get(layout, R.id.panel_2);
if (dot != null) {
mDots.add(dot);
}
dot = ViewHelper.get(layout, R.id.panel_3);
if (dot != null) {
mDots.add(dot);
}
ImageView btnPrev = ViewHelper.get(layout, R.id.nav_prev);
if (btnPrev != null) {
btnPrev.setOnClickListener(this);
}
ImageView btnNext = ViewHelper.get(layout, R.id.nav_next);
if (btnNext != null) {
btnNext.setOnClickListener(this);
}
View home = ViewHelper.get(layout, R.id.header_text);
if (home != null) {
home.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendIntent(AppConstants.INTENT_ACTION_CLEAR_TOGGLE);
sendIntent(AppConstants.INTENT_ACTION_SHOW_SUMMARY_CONTENT);
}
});
}
return layout;
}
@@ -85,6 +125,18 @@ public class PositioningFragment extends BaseFragment
loadCompetitors();
if (getView() != null) {
RecyclerView competitorView = (RecyclerView) getView().findViewById(R.id.list_positioning_all);
if (competitorView != null) {
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mCompetitorAdapter = new CompetitorAdapter(getActivity(), mCompetitorData);
mCompetitorAdapter.setListener(this);
competitorView.setLayoutManager(layoutManager);
competitorView.setAdapter(mCompetitorAdapter);
mPanels.add(competitorView);
}
mFinishView = (RecyclerView) getView().findViewById(R.id.list_positioning_chosen);
if (mFinishView != null) {
mGuardManager = new RecyclerViewTouchActionGuardManager();
@@ -116,20 +168,12 @@ public class PositioningFragment extends BaseFragment
mGuardManager.attachRecyclerView(mFinishView);
mDragDropManager.attachRecyclerView(mFinishView);
mSwipeManager.attachRecyclerView(mFinishView);
}
mCompetitorView = (RecyclerView) getView().findViewById(R.id.list_positioning_all);
if (mCompetitorView != null) {
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mCompetitorAdapter = new CompetitorAdapter(getActivity(), mCompetitorData);
mCompetitorAdapter.setListener(this);
mCompetitorView.setLayoutManager(layoutManager);
mCompetitorView.setAdapter(mCompetitorAdapter);
mPanels.add(mFinishView);
}
mConfirm = (Button) getView().findViewById(R.id.confirm);
if (mConfirm != null) {
mConfirm.setEnabled(mDots.size() == 0);
mConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -144,6 +188,7 @@ public class PositioningFragment extends BaseFragment
Util.addAll(getRace().getCompetitors(), mCompetitorData);
Collections.sort(mCompetitorData, new NaturalNamedComparator());
mCompetitorAdapter.notifyDataSetChanged();
viewPanel(0);
}
@Override
@@ -183,6 +228,7 @@ public class PositioningFragment extends BaseFragment
super.onDestroy();
}
private void loadCompetitors() {
// invalidate all competitors of this race
ReadonlyDataManager dataManager = OnlineDataManager.create(getActivity());
@@ -203,7 +249,9 @@ public class PositioningFragment extends BaseFragment
@Override
public void onLoadSucceeded(Collection<Competitor> data, boolean isCached) {
onLoadCompetitorsSucceeded(data);
if (isAdded()) {
onLoadCompetitorsSucceeded(data);
}
}
}));
@@ -346,8 +394,22 @@ public class PositioningFragment extends BaseFragment
private CompetitorResults getCompetitorResults() {
CompetitorResults result = new CompetitorResultsImpl();
for (CompetitorsWithIdImpl item : mFinishedData) {
result.add(new Util.Triple<Serializable, String, MaxPointsReason>(item.getKey(), item.getText(), item.getReason()));
result.add(new Util.Triple<>(item.getKey(), item.getText(), item.getReason()));
}
return result;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.nav_prev:
viewPanel(-1);
break;
case R.id.nav_next:
viewPanel(1);
break;
}
mConfirm.setEnabled(mActivePage != 0);
}
}
@@ -4,7 +4,6 @@ import java.util.ArrayList;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -20,18 +19,12 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.panels.MorePanelFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.BaseRaceInfoRaceFragment;
import com.sap.sailing.racecommittee.app.utils.BitmapHelper;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
public abstract class BaseStartphaseRaceFragment<ProcedureType extends RacingProcedure> extends BaseRaceInfoRaceFragment<ProcedureType>
implements View.OnClickListener {
private ArrayList<ImageView> mDots;
private ArrayList<View> mPanels;
private RaceStateListener mStateListener;
private int mActivePage = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.race_main, container, false);
@@ -135,42 +128,6 @@ public abstract class BaseStartphaseRaceFragment<ProcedureType extends RacingPro
}
}
private void viewPanel(int direction) {
// find next active page (with overflow)
mActivePage += direction;
if (mActivePage < 0) {
mActivePage = mDots.size() - 1;
}
if (mActivePage == mDots.size()) {
mActivePage = 0;
}
// ignore invisible dots
if (mDots.get(mActivePage).getVisibility() == View.GONE) {
viewPanel(direction);
}
// tint all dots gray
for (ImageView mDot : mDots) {
int tint = ThemeHelper.getColor(getActivity(), R.attr.sap_light_gray);
Drawable drawable = BitmapHelper.getTintedDrawable(getActivity(), R.drawable.ic_dot, tint);
mDot.setImageDrawable(drawable);
}
// tint current dot black
int tint = ThemeHelper.getColor(getActivity(), R.attr.black);
Drawable drawable = BitmapHelper.getTintedDrawable(getActivity(), R.drawable.ic_dot, tint);
mDots.get(mActivePage).setImageDrawable(drawable);
// hide all panels
for (View view : mPanels) {
view.setVisibility(View.GONE);
}
// show current panel
mPanels.get(mActivePage).setVisibility(View.VISIBLE);
}
private class RaceStateListener extends BaseRaceStateChangedListener {
@Override
@@ -10,7 +10,6 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.AttrRes;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
@@ -1,11 +1,5 @@
package com.sap.sailing.racecommittee.app.utils;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.Nullable;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
@@ -13,6 +7,13 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.Nullable;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
public class CameraHelper {
public static final int MEDIA_TYPE_IMAGE = 1;
@@ -1,14 +1,15 @@
package com.sap.sailing.racecommittee.app.utils;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.sap.sailing.racecommittee.app.R;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.sap.sailing.racecommittee.app.R;
public class MailHelper {
public static void send(String recipient, String subject, String text, Uri attachment, Context context) {
@@ -1,6 +1,7 @@
package com.sap.sailing.racecommittee.app.utils;
import android.content.Context;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
@@ -1,5 +1,7 @@
package com.sap.sailing.racecommittee.app.utils;
import java.lang.reflect.Field;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
@@ -12,14 +14,13 @@ import android.view.View;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TimePicker;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.R;
import java.lang.reflect.Field;
public class ThemeHelper {
private static final String TAG = ThemeHelper.class.getName();
@@ -4,6 +4,7 @@ import java.util.HashSet;
import java.util.Set;
import android.os.Handler;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
@@ -1,5 +1,10 @@
package com.sap.sailing.racecommittee.app.utils.autoupdate;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
@@ -7,6 +12,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.FileHandlerUtils;
import com.sap.sailing.racecommittee.app.AppPreferences;
@@ -14,11 +20,6 @@ import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.activities.PreferenceActivity;
import com.sap.sailing.racecommittee.app.ui.fragments.preference.GeneralPreferenceFragment;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class AutoUpdater {
private static final String TAG = AutoUpdater.class.getName();
@@ -1,16 +1,17 @@
package com.sap.sailing.racecommittee.app.domain.impl;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Test;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.SeriesBase;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sse.common.Util.Triple;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* This test verifies the algorithm used to escape and unescape SimpleRaceIdentifier components as used in
@@ -1,17 +1,19 @@
package com.sap.sailing.racecommittee.app.ui.activities;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import com.sap.sailing.racecommittee.app.R;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import com.sap.sailing.racecommittee.app.R;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class LoginActivityTest {