From e8c2580604c0638d3db98502fc7a811f3e5b74ba Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Tue, 12 Jul 2016 11:47:26 +0200 Subject: [PATCH 1/4] fixed inconsistence of NavDrawer vs. InMemoryDataStore data --- .../racecommittee/app/ui/activities/RacingActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index 8304f7d7a71..7de9bbb82ff 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -721,7 +721,9 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks if (lastSeenRaces != null && CollectionUtils.isEqualCollection(data, lastSeenRaces)) { ExLog.i(RacingActivity.this, TAG, "Same races are already loaded..."); } else { - lastSeenRaces = data; + // need to be a new instance, because of Activity restart after background kill + // more information see bug 3741 + lastSeenRaces = new ArrayList<>(data); registerOnService(data); mRaceList.setupOn(data); setupRegattaSpecificConfiguration(); From e58d7fa00016c71702cf13e65c5af2fbbad54776 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Tue, 12 Jul 2016 13:21:26 +0200 Subject: [PATCH 2/4] disable refresh button in NavDrawer while data loading (incl. refresh) and hide race list --- .../res/drawable-hdpi/ic_refresh_black_48dp.png | Bin 0 -> 818 bytes .../res/drawable-mdpi/ic_refresh_black_48dp.png | Bin 0 -> 597 bytes .../res/drawable-xhdpi/ic_refresh_black_48dp.png | Bin 0 -> 971 bytes .../drawable-xxhdpi/ic_refresh_black_48dp.png | Bin 0 -> 1347 bytes .../drawable-xxxhdpi/ic_refresh_black_48dp.png | Bin 0 -> 1688 bytes .../res/drawable/ic_refresh_48dp.xml | 10 ++++++++++ .../res/drawable/round_button.xml | 2 +- .../res/drawable/round_button_disabled.xml | 9 +++++++++ .../res/layout/race_list_header_content.xml | 2 +- .../app/ui/fragments/RaceListFragment.java | 11 ++++++++--- 10 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_refresh_black_48dp.png create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_refresh_black_48dp.png create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_refresh_black_48dp.png create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_refresh_black_48dp.png create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_refresh_black_48dp.png create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable/ic_refresh_48dp.xml create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button_disabled.xml diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_refresh_black_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_refresh_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b39b7c0ab76f70df89e052d71232571818e4f8 GIT binary patch literal 818 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#mH?j+S0Fv)Ku~qyHlU+zN`m}? z85APAw_kt%|MUIx(-SmUYD995|GwQW)9_t|L+A8mlYo$v*UMuJc;-K@SZ(95xw&BX zVu|$vlYROR?=Q)ivhary0|VnnPZ!6Kh{JEE-z;l#;AwO0ZqDi2v0%p))|d;su4Luj z|G&4&OTgyDnU+VH)d%Y{AEi&5IYY3;sg>*R-XlRjJy!`Rg^Pw>?rquHw&cp$HrKqX zIa~AJ$~JK?)0u32Gt0cMJ;A~4xYEi^)_b#UBqm%|58-V~wBfkmp~e$=UVvZTr0?=9 zpY(O=9P^@Q=_g&;P7kJEYy~J8xHQrlMnXL4oEosb4aV zr^7t>9!|aGUi4yt&>j8e`}%wwRc5Zo4l}%E`pk2BVY5owd7~9V4SW75T-os}^upnw z>WGb!Z_le)OvtLcpu^zlmKSh0E%sJ~-j?tuy%TNum$2n^9gxnMb|NxF;e+nsrwohB z4zulL^ZPXM>1Vc^^CRq}e$2TU=Sty1yR t;z>o?+kNvR%RU$VyV9MWzR>BvL;L|HoyfYQ|Kvd_-_zC4Wt~$(69D;JBgy~( literal 0 HcmV?d00001 diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_refresh_black_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_refresh_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e3154ec65226519eb16841263815904f71d55bae GIT binary patch literal 597 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s(*k@#T!Hi;1XkQXF`e9xt|Cf)7HV_}wAb0$BpW?85vE@r%S*%3hw zU$NyprdR*{7oIa`((jAz4>YswYkF^=Z}@PA!BA><-Qyy0=63(Z2e`A`dbgi`?BsBU zOvNtxF5Ya~-@9n`La*y5KCR#P zZD*Kdt^CU!smB8T^KAU>b$f4K-i)4U)92sc`AGcJJkg*ds_`p9iNn*?&t;ucLK6UP C$jAQx literal 0 HcmV?d00001 diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_refresh_black_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_refresh_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..88ba450d54623023e1619ead01760ee36aa358a0 GIT binary patch literal 971 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$K2l#}z0_mX$qMpuo2D;m}B*-tA zK_sMM_2tLk|6gC<9wSksQE^^JfaiTPOU~;Qg~P{x2Yim0e}8$2heO8V&66!=-!7PL z;#yIs_?n{oVOiEg(qO()) z{{O#QtbC?jM&cxg^EWrAzq@|#WUI<#&!CkVV4x7NcH^!@GmGbGn@bBTOB=2&i`@Pu zdtbZS@4%G#!fUK6Ut9CuK6~>xw}rTDodEB7&tge;?vB~Y&-Pz@+c~4=@I|J7y5Wz` z-J1B8LHEM@0tU9jH|#wa^&c2)*#FU$tK;{YsTU9bxOnT>m96vUy?4KvFFd_)O+&@W zBcDpOjOH)j-1GaHjP8Vge;03@t-hoC5J%(R`7)d{G@ixiGH-IQx6E3@cllcEqK5f@ zeow2Oazll)<4N7wmPM2H1hR;A)~ZeyWSMirQMYj`zfeX0sb%lIUJaDWnhI z?%>PcQ*^e7*X;K3wU5;cW=Xu^%Tc<)=<@lu`k{{<8yeQB3%va;Ho4+T&jmYH9)*>B z$sGRKKR86=4P(AC@i!((3Y*&pW((Yq_&syYswVZQt9E7`-DS#&H*d^Z9;51FtLz%N zsQcADBb7VRZ8ep%zkIiP_*G!?9jo-ed(UDh2w)9iOZwcyg$W(rzT?Z@$Z*s`zRD_-<%_}I)EkNdPalGX^#q#`2zbT z3|@aeuQ9zlM8!ns{d$X%ca_l%3=GVlJY5_^DsH`<{W|QCfk4CQxol!fq8b-Wda%Ywb#XwEWx~`yw&5m(%OyS>Vg)Qp@Iag($bB|iFwe!FC!?Jg*{msdT zBEK%XcaGox&$-0flvb{duU%@zT|V{Pu3B|OYO932=fZU3yj%{yvUJUN-&y=$Xx*}Z zd-va)Teo?H-KJjo(aB=|)-h;tsMDkgGv81A85*}d^ZTYy<&=+w&gXq+dUkuY%!*m^ z)-geI-9v8HI{_IHN^8^Ywq59n_U~TzfPKHK*sS8yOMdK3>CyUfsBXieiWbg1{*BHH z9&)koI3nxJXT4u%%fCi0Ls=2ImfQ9U&lfgu7AoHPcg{sD%II}#_xHUGPL*l4v5R}t zHw1L@B|QG+&?2_}%fIx7*UW-i7v7eiuoGBlUd8fuVl9J{m~Hxd!RO*39iC2%MgJXI za(?Y;e#b2EX<@P5)czd-=UD1Cme{#y`LVq z$?=|gptFSImtX39R>fa7W+$2i=C<9@;ZTg*|9835%-<<9rLWAK{cWaq&&+76gznW& z4Y&DA9n3RMG2|yseRx{tO(=sso2JvF1rnzx^j&9SnPBO4{NnQWK@OW;o^4V*)m8UM z%R61^;p-WjohS7;C_d3!^Mh|ub1V1Hr#@xRjAcWdJgzl(`_FQJHt~zBl-sAM8INXZ zY9H`)ZRq~Ie}nli=Q&TAKW+JNva!;2okz*mFON^p7qLF}N}=WX%E$W}YeU|6%uReE z|AFW6yuIxwPe0{nonhUFWKtg<-5DFYU46r+r)M`WHoEr#&ac6vg#kEI*y&+%u~6wKt-XatDnm{ Hr-UW|t?Vzu literal 0 HcmV?d00001 diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_refresh_black_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_refresh_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..29323c0c292a394d8ab444ae38b9eef19ffd0c04 GIT binary patch literal 1688 zcmdUw>pv3;7{@nb8#c?WX0$o(($U1+PBE8}yMvQUB^4sq5G!W0Q%SLnhGb|dEWirJWr0Vw<}x$r2qf`;BE(;{kF*e z*-+5djF4gBw$S1089>hFgl$5 z?F~I_;9VK?Ges}9!ROQZDeB zq99UFwgU_Mmt;$3kC-0C=2rYr9l*MOa=#b(KJade5BJfBs3LS#(eb*m+M}GK1(%x| zA8>Qo?|3#lW{R026VTc1h|lMU%oK3_bctwlp%?AaWK$3hzT;Ef%6yXST)D@fFe}6( zlpr0X&DiUKyY$cEZZ|c|7eA%o%p$a^mwKi2xG+mH!^{kGgCV8IhW*V1Amb%#uDFRF zFL~nuNrO4=U3&clU{kz#dQMh8MFF`f9x9cWIWD>puNoSb=~bSC&#CJa=htaDtF z50@{T3$g2Q;u*`s!W|dMIGy6W#y2k=?N>H1!{nZg5^-l!92MNkpSL2nC#C)F-c4Co zm#{h(?xfnf>;(%}Ygo2B5=w}1=0Ff{HQU?roki+szUK3&9bcwvNS~z48cTMbeepA~ z=B%0GkRUGrw3$3T{n((7~w zGi+Z*8@iuQITlv$ee5MXD-#QXoY_b+UUbq}@mdGjxow$iw-)GL6`1GzPz|cL25KD- ze#@zIs={gAbG(8i)AiLQft@$tVJ$jnT~tMKD_hQL{%E0Sh^yAja8TcYd_4c@#O>RWxM zIXk1>Q~xy!MCw63{ZPidD=Vs>fQ$i+Y|N6Y5{)u%Wo^fq#Ac~`J@r|(79(b;@HD8< zau+v;Q7Dbca5+HqTRGVMAo9|tDZaaee(~!it!aRvk7m%iCJsTS+jc&ePl6OcKK`O4 zQB@VFB~F}nym}6{a=!993h^i&<-z0w`e;c;ttR1~#! z2}Lxf1V3PlBW1*WiZncUA_QEg5(Ig4NHN86Pgf8jjWVm(oI5fMm3hK5sBOJKY#3YC z{*k1vQem3?f=;tl9Xe^#3LsgjIkS@Y`?LsxU}SJ7?bFZ~!HASIp7M?gOOPQu^cVTI zHQOm$F%*{iG-vgXb<(t-?P?b$%n@X)leNE3k1D@tK;mbt4(B5qQ_WK66VBm>OF8s(9kG;@gLTwEZThO~T7ei#HcD{DXB5eoM(&br@G~x_D!*OgI_99gFIw z-B_O?)E-?9yxANf$~$Wkl{8$axs+1n5qz)3{c$*wyk`vJB8&;Wy>oy2e@-5Vk3prP U=c4uG41fL?H-fh_*D;Lx565l70ssI2 literal 0 HcmV?d00001 diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/ic_refresh_48dp.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/ic_refresh_48dp.xml new file mode 100644 index 00000000000..f6d5d4662b2 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/ic_refresh_48dp.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button.xml index b696c73a7fc..d21a9a1a6c8 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button.xml @@ -8,7 +8,7 @@ - + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button_disabled.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button_disabled.xml new file mode 100644 index 00000000000..d84e0510cea --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/round_button_disabled.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_list_header_content.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_list_header_content.xml index b77bf67bbb8..30368b5a106 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_list_header_content.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_list_header_content.xml @@ -26,7 +26,7 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_margin="@dimen/default_margin" - android:src="@drawable/ic_refresh_white_48dp"/> + android:src="@drawable/ic_refresh_48dp"/> Date: Tue, 12 Jul 2016 16:41:02 +0200 Subject: [PATCH 3/4] don't reset header view in NavDrawer if convertView is same on notifyDataChanged call --- .../res/values/ids.xml | 2 +- .../racelist/ManagedRaceListAdapter.java | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/ids.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/ids.xml index 609954edf2e..7075169ba5b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/ids.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/ids.xml @@ -4,6 +4,6 @@ - + diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java index f030008387b..b09d1f37af7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java @@ -161,20 +161,20 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple if (type == ViewType.HEADER.index) { final RaceListDataTypeHeader header = (RaceListDataTypeHeader) raceListElement; String regatta = header.getRaceGroup().getDisplayName(); - if (TextUtils.isEmpty(regatta)) { - regatta = header.getRaceGroup().getName(); - } - boat_class.setText(regatta); - fleet_series.setText(RaceHelper.getSeriesName(header.getSeries(), "")); - if (fleet_series.getText().length() == 0) { - fleet_series.setVisibility(View.GONE); - } else { - fleet_series.setVisibility(View.VISIBLE); - } - protest_image.setImageDrawable(FlagsResources.getFlagDrawable(getContext(), Flags.BRAVO.name(), flag_size)); - if (protest_image.getTag(R.id.protest_flag_image_click_listener) == null || - protest_image.getTag(R.id.protest_flag_image_click_listener) != Boolean.TRUE) { - protest_image.setTag(R.id.protest_flag_image_click_listener, Boolean.TRUE); + String series = RaceHelper.getSeriesName(header.getSeries(), ""); + + if (!(regatta + series).equals(convertView.getTag(R.id.race_list_header))) { + if (TextUtils.isEmpty(regatta)) { + regatta = header.getRaceGroup().getName(); + } + boat_class.setText(regatta); + fleet_series.setText(series); + if (fleet_series.getText().length() == 0) { + fleet_series.setVisibility(View.GONE); + } else { + fleet_series.setVisibility(View.VISIBLE); + } + protest_image.setImageDrawable(FlagsResources.getFlagDrawable(getContext(), Flags.BRAVO.name(), flag_size)); protest_image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -184,6 +184,7 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple BroadcastManager.getInstance(getContext()).addIntent(intent); } }); + convertView.setTag(R.id.race_list_header, regatta + series); } } else if (type == ViewType.RACE.index) { final RaceListDataTypeRace race = (RaceListDataTypeRace) raceListElement; From 5d80ec70a5a1e400a169808b961a52f21ddefb46 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Thu, 14 Jul 2016 10:19:46 +0200 Subject: [PATCH 4/4] move race registration into ManagedRacesDataHandler und unregister to InMemoryDataStore --- .../racecommittee/app/AppConstants.java | 2 - .../racecommittee/app/data/DataManager.java | 1 + .../racecommittee/app/data/DataStore.java | 6 +- .../app/data/InMemoryDataStore.java | 54 +++++++++++++++++ .../handlers/ManagedRacesDataHandler.java | 1 + .../app/services/RaceStateService.java | 55 +++-------------- .../app/ui/activities/RacingActivity.java | 59 +++++-------------- 7 files changed, 86 insertions(+), 92 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java index 831ee923dfa..f3ea5d3fbfe 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java @@ -25,8 +25,6 @@ public class AppConstants { private final static String INTENT_ACTION = PACKAGE_NAME + ".action"; public final static String INTENT_ACTION_RESET = INTENT_ACTION + ".reset"; - public final static String INTENT_ACTION_REGISTER_RACE = INTENT_ACTION + ".registerRace"; - public final static String INTENT_ACTION_UNREGISTER_RACE = INTENT_ACTION + ".unregisterRace"; public final static String INTENT_ACTION_CLEAR_RACES = INTENT_ACTION + ".clearRaces"; public final static String INTENT_ACTION_CLEANUP_RACES = INTENT_ACTION + ".cleanupRaces"; public final static String INTENT_ACTION_ALARM_ACTION = INTENT_ACTION + ".alarmAction"; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java index 86500daef9c..632aa78a89e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java @@ -15,6 +15,7 @@ public abstract class DataManager implements ReadonlyDataManager { public static ReadonlyDataManager create(Context context) { DataStore dataStore = InMemoryDataStore.INSTANCE; + dataStore.setContext(context); if (AppPreferences.on(context).isOfflineMode()) { return new OfflineDataManager(context, dataStore, dataStore.getDomainFactory()); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index f980b97c709..e0ef6af9b3f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -5,6 +5,8 @@ import java.util.Collection; import java.util.Set; import java.util.UUID; +import android.content.Context; + import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; @@ -15,7 +17,8 @@ import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.racecommittee.app.domain.ManagedRace; public interface DataStore { - + + void setContext(Context context); void reset(); SharedDomainFactory getDomainFactory(); @@ -38,6 +41,7 @@ public interface DataStore { ManagedRace getRace(SimpleRaceLogIdentifier id); boolean hasRace(String id); boolean hasRace(SimpleRaceLogIdentifier id); + void registerRaces(Collection races); Collection getMarks(); Mark getMark(Serializable id); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index f213b524b75..aab0f9f124a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -8,6 +8,12 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; + import com.sap.sailing.android.shared.util.CollectionUtils; import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier; import com.sap.sailing.domain.abstractlog.race.impl.SimpleRaceLogIdentifierImpl; @@ -21,11 +27,13 @@ import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; import com.sap.sailing.racecommittee.app.domain.impl.FleetIdentifierImpl; +import com.sap.sailing.racecommittee.app.services.RaceStateService; import com.sap.sse.common.Util.Triple; public enum InMemoryDataStore implements DataStore { INSTANCE; + private Context mContext; private LinkedHashMap eventsById; private LinkedHashMap managedRaceById; private LinkedHashMap marksById; @@ -35,10 +43,22 @@ public enum InMemoryDataStore implements DataStore { private Serializable eventUUID; private UUID courseUUID; + private RaceStateService mService; + private boolean mBound; + InMemoryDataStore() { reset(); } + @Override + public void setContext(Context context) { + if (mContext == null) { + mContext = context.getApplicationContext(); + } + Intent intent = new Intent(mContext, RaceStateService.class); + mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); + } + @Override public void reset() { eventsById = new LinkedHashMap<>(); @@ -49,6 +69,11 @@ public enum InMemoryDataStore implements DataStore { eventUUID = null; courseUUID = null; + + if (mContext != null && mBound) { + mContext.unbindService(mConnection); + mBound = false; + } } @Override @@ -185,6 +210,7 @@ public enum InMemoryDataStore implements DataStore { @Override public void removeRace(ManagedRace race) { + unregisterRace(race); managedRaceById.remove(convertManagedRaceIdentifierToSimpleRaceLogIdentifier(race.getIdentifier())); } @@ -303,4 +329,32 @@ public enum InMemoryDataStore implements DataStore { courseUUID = uuid; } + public void registerRaces(Collection races) { + if (mBound) { + for (ManagedRace race : races) { + mService.registerRace(race); + } + } + } + + private void unregisterRace(ManagedRace race) { + if (mBound) { + mService.unregisterRace(race); + } + } + + private ServiceConnection mConnection = new ServiceConnection() { + + @Override + public void onServiceConnected(ComponentName className, IBinder service) { + RaceStateService.RaceStateServiceBinder binder = (RaceStateService.RaceStateServiceBinder) service; + mService = binder.getService(); + mBound = true; + } + + @Override + public void onServiceDisconnected(ComponentName name) { + mBound = false; + } + }; } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java index e1da6302d86..5f0927399b0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java @@ -39,6 +39,7 @@ public class ManagedRacesDataHandler extends DataHandler } manager.addRaces(data); calcRaceState(data); + manager.getDataStore().registerRaces(data); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java index 8ca593847b4..3096a5e2ee0 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java @@ -118,7 +118,7 @@ public class RaceStateService extends Service { } @Override - public IBinder onBind(Intent arg0) { + public IBinder onBind(Intent intent) { return mBinder; } @@ -167,7 +167,7 @@ public class RaceStateService extends Service { ExLog.i(this, TAG, "All races unregistered."); } - private void unregisterRace(ManagedRace race) { + public void unregisterRace(ManagedRace race) { poller.unregister(race); race.getState().getRaceLog().removeAllListeners(); @@ -183,6 +183,7 @@ public class RaceStateService extends Service { managedIntents.remove(race.getId()); ExLog.i(this, TAG, "Race " + race.getId() + " unregistered"); + updateNotification(); } private void unregisterRace(@Nullable String raceId) { @@ -212,16 +213,6 @@ public class RaceStateService extends Service { return; } - if (AppConstants.INTENT_ACTION_REGISTER_RACE.equals(action)) { - handleRegisterRace(intent); - return; - } - - if (AppConstants.INTENT_ACTION_UNREGISTER_RACE.equals(action)) { - handleUnregisterRace(intent); - return; - } - if (!serviceId.equals(intent.getSerializableExtra(EXTRAS_SERVICE_ID))) { ExLog.w(this, TAG, "Received event for different service version."); return; @@ -293,28 +284,6 @@ public class RaceStateService extends Service { return false; } - private void handleRegisterRace(Intent intent) { - ManagedRace race = getRaceFromIntent(intent); - if (race == null) { - ExLog.w(this, TAG, "Intent did not carry valid race information."); - return; - } - registerRace(race); - - updateNotification(); - } - - private void handleUnregisterRace(Intent intent) { - ManagedRace race = getRaceFromIntent(intent); - if (race == null) { - ExLog.w(this, TAG, "Intent did not carry valid race information"); - return; - } - unregisterRace(race); - - updateNotification(); - } - private void updateNotification() { int numRaces = managedIntents.keySet().size(); notificationManager.notify(NOTIFICATION_ID, notificationBuilder @@ -323,15 +292,7 @@ public class RaceStateService extends Service { startForeground(NOTIFICATION_ID, notificationBuilder.build()); } - private ManagedRace getRaceFromIntent(Intent intent) { - if (intent.getExtras() == null || !intent.getExtras().containsKey(AppConstants.RACE_ID_KEY)) { - return null; - } - String raceId = intent.getExtras().getString(AppConstants.RACE_ID_KEY); - return dataManager.getDataStore().getRace(raceId); - } - - private void registerRace(final ManagedRace race) { + public void registerRace(ManagedRace race) { ExLog.i(this, TAG, "Trying to register race " + race.getId()); if (!managedIntents.containsKey(race.getId())) { @@ -360,6 +321,8 @@ public class RaceStateService extends Service { unregisterRace(race.getId()); registerRace(race); } + + updateNotification(); } private PendingIntent createAlarmPendingIntent(ManagedRace managedRace, RaceStateEvent event) { @@ -372,7 +335,7 @@ public class RaceStateService extends Service { } @TargetApi(Build.VERSION_CODES.KITKAT) - public void setAlarm(ManagedRace race, RaceStateEvent event) { + /* package */ void setAlarm(ManagedRace race, RaceStateEvent event) { PendingIntent intent = createAlarmPendingIntent(race, event); managedIntents.get(race.getId()).add(Pair.create(intent, event.getEventName())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -383,7 +346,7 @@ public class RaceStateService extends Service { ExLog.i(this, TAG, "The alarm " + event.getEventName() + " will be fired at " + event.getTimePoint()); } - public void clearAlarmByName(ManagedRace race, RaceStateEvents stateEventName) { + /* package */ void clearAlarmByName(ManagedRace race, RaceStateEvents stateEventName) { List> intents = managedIntents.get(race.getId()); Pair toBeRemoved = null; for (Pair intentPair : intents) { @@ -400,7 +363,7 @@ public class RaceStateService extends Service { } } - public void clearAllAlarms(ManagedRace race) { + /* package */ void clearAllAlarms(ManagedRace race) { Serializable raceId = race.getId(); List> intents = managedIntents.get(raceId); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index 7de9bbb82ff..e6b107a73be 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -316,7 +316,7 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } } - public void onRaceItemClicked(ManagedRace managedRace) { + private void onRaceItemClicked(ManagedRace managedRace) { onRaceItemClicked(managedRace, false); } @@ -380,7 +380,7 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } } - public void onWindEntered(Wind windFix) { + private void onWindEntered(Wind windFix) { PanelButton windValue = (PanelButton) findViewById(R.id.button_wind); if (windFix != null) { if (windValue != null) { @@ -407,35 +407,7 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } } - private void registerOnService(final Collection races) { - // close current race, if no longer on server - if (!races.contains(mSelectedRace)) { - BroadcastManager.getInstance(this).addIntent(new Intent(AppConstants.INTENT_ACTION_SHOW_WELCOME)); - mSelectedRace = null; - } - - // since the service is the long-living component - // he should decide whether these races are already - // registered or not. - new Thread(new Runnable() { - @Override - public void run() { - // add all received races to the service - for (ManagedRace race : races) { - Intent registerIntent = new Intent(RacingActivity.this, RaceStateService.class); - registerIntent.setAction(AppConstants.INTENT_ACTION_REGISTER_RACE); - registerIntent.putExtra(AppConstants.RACE_ID_KEY, race.getId()); - RacingActivity.this.startService(registerIntent); - } - - Intent cleanupIntent = new Intent(RacingActivity.this, RaceStateService.class); - cleanupIntent.setAction(AppConstants.INTENT_ACTION_CLEANUP_RACES); - RacingActivity.this.startService(cleanupIntent); - } - }).start(); - } - - public void setProgressSpinnerVisibility(boolean visible) { + private void setProgressSpinnerVisibility(boolean visible) { if (mProgressSpinner != null) { if (visible) { mProgressSpinner.setVisibility(View.VISIBLE); @@ -459,7 +431,7 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } } - public void resetRace() { + private void resetRace() { AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppTheme_AlertDialog); builder.setTitle(getString(R.string.race_reset_confirmation_title)); builder.setMessage(getString(R.string.race_reset_message)); @@ -576,7 +548,7 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } } - public void processIntent(final Intent intent) { + private void processIntent(final Intent intent) { final Bundle args = new Bundle(); if (mSelectedRace != null) { args.putSerializable(AppConstants.RACE_ID_KEY, mSelectedRace.getId()); @@ -717,16 +689,17 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks @Override public void onLoadSucceeded(Collection data, boolean isCached) { - // Let's do the setup stuff only when the data is changed (or its the first time) - if (lastSeenRaces != null && CollectionUtils.isEqualCollection(data, lastSeenRaces)) { - ExLog.i(RacingActivity.this, TAG, "Same races are already loaded..."); - } else { - // need to be a new instance, because of Activity restart after background kill - // more information see bug 3741 - lastSeenRaces = new ArrayList<>(data); - registerOnService(data); - mRaceList.setupOn(data); - setupRegattaSpecificConfiguration(); + // need to be a new instance, because of Activity restart after background kill + // more information see bug 3741 + lastSeenRaces = new ArrayList<>(data); + mRaceList.setupOn(data); + setupRegattaSpecificConfiguration(); + if (!isCached) { + // close current race, if no longer on server + if (!data.contains(mSelectedRace)) { + BroadcastManager.getInstance(RacingActivity.this).addIntent(new Intent(AppConstants.INTENT_ACTION_SHOW_WELCOME)); + mSelectedRace = null; + } Toast.makeText(RacingActivity.this, String.format(getString(R.string.racing_load_success), data.size()), Toast.LENGTH_SHORT).show(); } setProgressSpinnerVisibility(false);