From c9e31bf9f015d39b106d1235dd068640862876e7 Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Tue, 30 Oct 2018 15:39:54 +0100 Subject: [PATCH] Created foreground service --- .idea/assetWizardSettings.xml | 102 ++++++++++ README.md | 1 + app/src/main/ic_launcher-web.png | Bin 0 -> 19763 bytes .../heartbeatstreamer/MainActivity.java | 97 ++++++---- .../heartrate/HeartRateService.java | 174 ++++++++++++++++-- .../res/drawable-hdpi/ic_notification.png | Bin 0 -> 322 bytes .../res/drawable-mdpi/ic_notification.png | Bin 0 -> 211 bytes .../res/drawable-xhdpi/ic_notification.png | Bin 0 -> 444 bytes .../res/drawable-xxhdpi/ic_notification.png | Bin 0 -> 721 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 0 -> 1052 bytes .../res/drawable/ic_launcher_foreground.xml | 83 +++++++++ app/src/main/res/layout/activity_main.xml | 35 +++- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 3 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 2407 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 1705 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 3250 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 4900 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9128 -> 6595 bytes app/src/main/res/values/strings.xml | 3 + 20 files changed, 445 insertions(+), 58 deletions(-) create mode 100644 .idea/assetWizardSettings.xml create mode 100644 README.md create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/res/drawable-hdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-mdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 0000000..741de99 --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,102 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c4c522 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Icon by [VideoPlasty](https://videoplasty.com/) Creative Commons BY-SA, trough [WikiMedia](https://commons.wikimedia.org/wiki/File:Heart_Rate_Monitor_Flat_Icon_Vector.svg) diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..90c9170d338eeec32309ab7be64ecd04b0366f31 GIT binary patch literal 19763 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 T{6TdV(6J1ju6{1-oD!M hrScanCtrl; AntPlusHeartRatePcc hrPcc; PccReleaseHandle releaseHandle; - String lastMsg = ""; + JSONObject lastMsg = null; public static boolean isRunning = false; + NotificationCompat.Builder builder; + NotificationManager notificationManager; + @Override public void onCreate() { - isRunning = true; + notificationManager = + (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE); + + setRunning(true); + requestAccessToPcc(); } + public void setRunning(boolean running) { + if(running == isRunning) { + return; + } + isRunning = running; + Intent i; + if(running) { + i = new Intent(BROADCAST_SERVICE_START); + } else { + i = new Intent(BROADCAST_SERVICE_STOPPED); + } + sendBroadcast(i); + } + /** * Start main thread, request location updates, start synchronization. * @@ -63,7 +103,32 @@ public class HeartRateService extends Service { */ @Override public int onStartCommand(Intent intent, int flags, int startId) { - Log.i(TAG, "Received start id " + startId + ": " + intent); + if (intent.getAction().equals(ACTION_START)) { + Log.i(TAG, "Received start id " + startId + ": " + intent); + Intent notificationIntent = new Intent(this, MainActivity.class); + notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TASK); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, + notificationIntent, 0); + + builder = new NotificationCompat.Builder(this) + .setContentText("Starting") + .setContentTitle("Heartbeat Streamer") + .setSmallIcon(R.drawable.ic_notification) + .setAutoCancel(false) + .setOngoing(true) + .setOnlyAlertOnce(false) + .setContentIntent(pendingIntent) + ; + + startForeground(NOTIFICATION_ID, + builder.build()); + + } else if (intent.getAction().equals(ACTION_STOP)) { + Log.i(TAG, "Received stop id " + startId + ": " + intent); + stopForeground(true); + stopSelf(); + } return START_STICKY; } @@ -93,24 +158,31 @@ public class HeartRateService extends Service { public void onResultReceived(AntPlusHeartRatePcc result, RequestAccessResult resultCode, DeviceState initialDeviceState) { // showDataDisplay("Connecting..."); + Intent i = new Intent(BROADCAST_MONITOR_CONNECT_RESULT); switch (resultCode) { case SUCCESS: + i.putExtra("msg", "Success"); connectHr(result); break; case CHANNEL_NOT_AVAILABLE: showNotification("Channel Not Available"); + i.putExtra("msg", "Channel Not Available"); break; case OTHER_FAILURE: showNotification("RequestAccess failed. See logcat for details."); + i.putExtra("msg", "RequestAccess failed. See logcat for details."); break; case USER_CANCELLED: showNotification("Cancelled. Do reset."); + i.putExtra("msg", "Cancelled. Do reset."); break; case UNRECOGNIZED: default: showNotification("Unknown error. Do reset."); + i.putExtra("msg", "unknown error. Do reset."); break; } + sendBroadcast(i); } }; @@ -138,30 +210,86 @@ public class HeartRateService extends Service { final String textHeartBeatEventTime = df.format(heartBeatEventTime) + ((AntPlusHeartRatePcc.DataState.INITIAL_VALUE.equals(dataState)) ? "*" : ""); - final String msg = String.format("{\"rate\":\"%s\", \"count\":\"%s\", \"time\":\"%s\"}", textHeartRate, textHeartBeatCount, textHeartBeatEventTime); + Intent intent = new Intent(BROADCAST_BEAT); + intent.putExtra("rate", textHeartRate); + intent.putExtra("count", textHeartBeatCount); + intent.putExtra("time", textHeartBeatEventTime); + sendBroadcast(intent); - if(msg.contentEquals(lastMsg)) { - Log.i(TAG, "Skip duplicate"); - return; + builder.setContentText(textHeartRate + " bpm"); + notificationManager.notify(NOTIFICATION_ID, builder.build()); + + JSONObject jObjectData = new JSONObject(); + // final String msg = String.format("{\"rate\":\"%s\", \"count\":\"%s\", \"time\":\"%s\"}", textHeartRate, textHeartBeatCount, textHeartBeatEventTime); + final String msg; + try { + jObjectData.put("rate", textHeartRate); + jObjectData.put("count", textHeartBeatCount); + jObjectData.put("time", textHeartBeatEventTime); + jObjectData.put("timestamp", DateFormat.getDateTimeInstance().format(new Date())); + jObjectData.put("token", getToken()); + + msg = jObjectData.toString(); + + + if(lastMsg != null && lastMsg.getString("time").equals(jObjectData.getString("time"))) { + Log.i(TAG, "Skip duplicate"); + return; + } + lastMsg = jObjectData; + + sendResult(jObjectData.toString()); + + } catch (JSONException e) { + e.printStackTrace(); } - lastMsg = msg; - - sendResult(msg); } }); } - private void sendResult(String msg) { - Log.d(TAG, "Send: " + msg); - final String m = msg; + String token = null; + /** + * Get the token for use with the syncing. + * @return + */ + public String getToken() { + if(token != null) { + return token; + } + + String json = null; + try { + InputStream is = getAssets().open("token.json"); + int size = is.available(); + byte[] buffer = new byte[size]; + is.read(buffer); + is.close(); + json = new String(buffer, "UTF-8"); + } catch (IOException ex) { + ex.printStackTrace(); + return null; + } + try { + JSONObject jsonObject = new JSONObject(json); + token = jsonObject.getString("token'"); + } catch (JSONException e) { + e.printStackTrace(); + return null; + } + return token; + } + + + private void sendResult(final String m) { + Log.d(TAG, "Send: " + m); Future fws = AsyncHttpClient.getDefaultInstance().websocket("ws://heartbeat.rubenvandeven.com:8888/ws", "my-protocol", new AsyncHttpClient.WebSocketConnectCallback() { @Override public void onCompleted(Exception ex, final WebSocket webSocket) { if (ex != null) { ex.printStackTrace(); - // TODO: retry in 30s - ie. after internet loss + // TODO: store for later sync return; } webSocket.send(m); @@ -188,9 +316,20 @@ public class HeartRateService extends Service { * wait to reconnect to dead HR-monitor */ protected void waitAndReconnect() { - //TODO: Log.d(TAG, "Wait & reconnect"); - requestAccessToPcc(); + + if(hrPcc != null) { + hrPcc.subscribeHeartRateDataEvent(null); + } + + new android.os.Handler().postDelayed( + new Runnable() { + public void run() { + Log.i(TAG, "Attempt reconnect"); + requestAccessToPcc(); + } + }, + 20000); // 20 sec delay for connection } /** @@ -201,6 +340,7 @@ public class HeartRateService extends Service { if(hrPcc != null) { hrPcc.subscribeHeartRateDataEvent(null); } + sendBroadcast( new Intent(BROADCAST_MONITOR_CONNECT_ATTEMPT) ); releaseHandle = AntPlusHeartRatePcc.requestAccess(this, 4818, 0, resultReceiver, stateChangeReceiver); } @@ -216,7 +356,7 @@ public class HeartRateService extends Service { { releaseHandle.close(); } - isRunning = false; + setRunning(false); super.onDestroy(); } diff --git a/app/src/main/res/drawable-hdpi/ic_notification.png b/app/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5a42c538cdd0d07083108b652f2893c4d4cf22 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$UKzz{u(8;uunKD>*@eb#a17Pg9@) zm)pSy?EnA&50~`mo5=pC_sga;0v)m(D^{{R>U7ZY$v(b;;iHd2o|~{ZQ&O15Y{`!5 z#t7k#;EPvg2Hketc|qWnqi}vpB;S&|4L7(?y>kwF%y;Cs!@Nb)l0_PJ@SRNj6tIos zisN60GmN~lX)9th1-zLIg$4Xsld={1l&&UCVB8h)K}6wM)2cw$Me)nCM7rTG^&i07&$P=HcsqS|ibZn#4dm-M{kYEJ{g>+_+=;o7N RvcRxm@O1TaS?83{1OPs&cYpu@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_notification.png b/app/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..47643ecb5b608cf4c836c0265902c48484b8c915 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjvpiiKLn>}1CrGd^P7s;E`tSe$ z_v}ZMt{7;DwO6nSvEjk?AYD=Y;K?d7n>migXHJ+L5<15H9%J~c)I$z JtaD0e0stgkMn3=m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_notification.png b/app/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..67add5dce992c967f9d76fd82203758d3c694836 GIT binary patch literal 444 zcmV;t0Ym(&kPQSVbv_dWNVGo91>o-;QTQWQl|6h%=KMJWKeTrOPh8<@jrId9+% zM@wlzV*$qY;}xEi%HqfIBf$85?8AGkF81PM_=2a{;nClX^;SEIj}ot9!adx$QpgQt zFo_em;L(49TUL7tmn3e(V`qE{zc5~i#dqPQ#0{8r`aAIqpRi8eWwFT`^N=qio)LV; zVN+)Revjh~wp#CQ?V2V&!d}VFCN`UlIKQ)&FC(7QxGeECHvVRT71-nBB5pWywsA<} z7Ardu$%5%mIdkH&(MmZ>F?pZBw8@;0VZRO3;I5Bp_XeRoh&vMR;egdQiJxA#j+D{7 zeTF2%2YBvd?O&Hw72cT|HznXva{t@#KjI6oq&oOp+)G#YlM6L@3G=;(=1i zXDLF;_s2xMxqdrq>N@Rxj@w+#ar*!2S7-0LTX)Wyz1BJV*3}6igb+dqA%qY@2qAC5fRmLCe}a~lf770~8ykQvHHdQ=&*EdO&r^c77&r+d~n+D*A6F2j4>yU5D)jwcbW%--Up*!(FxVAmU6 z56s+I39sXpz%FU`%yI+ydOUu@;Wi$E@8e1A?F6l~8|?4- ztQBv?=1O*am{2jd+;)-MSzmEj;JfDH!;0}4+~Z09$$xpnL-AS_y3(2zh}B??xKuH> z%{}2_>mutfSMglJ-&U~xG!ds*qD!7vhc9>t5B{Ztt34*nufiEA@orRDp&} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notification.png b/app/src/main/res/drawable-xxxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..9e85725ae872151635904a9c32d278b1cc3733b1 GIT binary patch literal 1052 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V1DfB;uunK>+P&akB~r_V{?tp zP6;asy6v;#h!V%?d0JJS9+Mq-eErz(#c4K1gtj;5*)XI+exGvb$IEL6|j ztd!B5qj-DE(PjS=?LJoRy?w?aR%V}k%>&!#_lnc@{g3?jywA|EMZk$e5jQd8;rHL| zmsrc013bm=7}sxlFH2S}Df+*(t;8C)xp&xgeS7$;>xEG4ds7Y1FCkyt zzc`(3W6Y~pZJOPiJ^#h>44b?B5<$AJMBcUqUT&@^Thd&8uJc{Sy32wMLG86V;lG2o z%$l$IOL0}8v_X$1cTw*7tt;ktnAPt3w0coD-z|ByEK%8>Ygaxry_gx*7I1Bmk!bsQ z{{v?-&7!w0sbPO7xm^3c+Am$NZ7-8~H!bh;NX^J&OPIPM+PBd6rrbsKz^3Ns{E7Di zW~B=ym{$2qURjy?V)|7hmD0nm{w~`Ej?BH7@=xQU^u^4#FRng$&7CvPU#vFJyZOb& z7d>@iD;6a9pES;VJZn~?SnU*r9hQqGFACSvxG2`$@maCbhGh@`NwlIHs^K*wW|xG07#@p4CkieA>G3$iWTaJ+8AN*WKI` z{W0!%^5<6$XXi92{F>F$^IWiQlh0%6T@8j=nHk6KYa7&xTUD$(p!0ouL|c?W@wdxA zga{zr)MqZjUEd0rOnpIs2K$vVP}$mUaPi OJ%gvKpUXO@geCyJo9gNS literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f69184 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 98182a1..665a21d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,46 @@ - - \ No newline at end of file + + + + +