From 97e8033918eb462a5e8627a102b57fc6b6e1342d Mon Sep 17 00:00:00 2001 From: "Chris J. Karr" Date: Wed, 26 Apr 2017 00:14:56 -0500 Subject: [PATCH] Withings probe visualization. * Battery probe visualization. * Card UI work --- res/drawable-hdpi/ic_app_events.png | Bin 0 -> 1505 bytes res/drawable-hdpi/ic_device_battery.png | Bin 0 -> 1378 bytes res/drawable-mdpi/ic_app_events.png | Bin 0 -> 1304 bytes res/drawable-mdpi/ic_device_battery.png | Bin 0 -> 1265 bytes res/drawable-xhdpi/ic_app_events.png | Bin 0 -> 1696 bytes res/drawable-xhdpi/ic_device_battery.png | Bin 0 -> 1481 bytes res/drawable-xxhdpi/ic_app_events.png | Bin 0 -> 2094 bytes res/drawable-xxhdpi/ic_device_battery.png | Bin 0 -> 1728 bytes res/drawable-xxxhdpi/ic_app_events.png | Bin 0 -> 2274 bytes res/drawable-xxxhdpi/ic_device_battery.png | Bin 0 -> 1869 bytes res/layout/card_generator_app_event.xml | 4 +- res/layout/card_generator_device_battery.xml | 14 +- res/layout/card_generator_withings_device.xml | 109 +++++- res/values/generators.xml | 18 + .../generators/device/Battery.java | 103 +++++- .../generators/wearables/WithingsDevice.java | 317 ++++++++++++------ 16 files changed, 453 insertions(+), 112 deletions(-) create mode 100755 res/drawable-hdpi/ic_app_events.png create mode 100755 res/drawable-hdpi/ic_device_battery.png create mode 100755 res/drawable-mdpi/ic_app_events.png create mode 100755 res/drawable-mdpi/ic_device_battery.png create mode 100755 res/drawable-xhdpi/ic_app_events.png create mode 100755 res/drawable-xhdpi/ic_device_battery.png create mode 100755 res/drawable-xxhdpi/ic_app_events.png create mode 100755 res/drawable-xxhdpi/ic_device_battery.png create mode 100755 res/drawable-xxxhdpi/ic_app_events.png create mode 100755 res/drawable-xxxhdpi/ic_device_battery.png diff --git a/res/drawable-hdpi/ic_app_events.png b/res/drawable-hdpi/ic_app_events.png new file mode 100755 index 0000000000000000000000000000000000000000..508e84542ff3f2bf151d58e9289968bad84ce2e0 GIT binary patch literal 1505 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFl%InM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWnQpS7v4w)UrJkXw zrG=4+j)IYap_#scrM{twu7RPIfu)s!p#l^r0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*nV6WA zUs__T1av9H3%LbwWAlok!2}F2{ffi_eM3D1ke6TzeSPsO&CP|YE-nd5MYtEM!Nnn! z1*!T$sm1xFMajU3OH&3}Rbb^@l$uzQUlfv`p92fUfQY#ZiqFjoo3sy}I{#PUg`r0B z({zPbTNm)Hi(!n~BNCz~cp=kp8QUEzeMf&)v5BqbKF3O$%`0^UWqZ_G4ouSP5AQNe z+`zSI!L6i!^&4JYVCWNVvTN)}@v${eJF!kd`?SVUea(4So6$CkF;(z>+p+Dn!m+E#Lfx9q z@wZ|Za{OK@rNL&J5dLGS=e6>n4F5vOnPDmi>{cWfXA8Z!8#wFu4t`sv#Sf;KG@X7R zwcMKdU4!feuC$%$^#^kW*s|3;KS;}Hc2C)5sIweRz(_++Z+|v}L+= zaAKzfSMS0uA-mIS*7ZJ)`6=MTc|N{DZej1QoSP@sPmW=&W&G@Pn`QGUj$e6qpT0_| zm6zB!`NN;NQOVU$LLR*}`=K{efmKdR?LXJMje9HX+1X#%?mw`-;qKzOi@n2-JM8=1 z#`N3~ zw;+L|(I48Urq8|cblL*>H$GezTTkmc9!pOW*7@yv!TrMfE9(yZcmBV0fiWW+!;Ow@ Uf0*h-et-&HPgg&ebxsLQ04^#mng9R* literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_device_battery.png b/res/drawable-hdpi/ic_device_battery.png new file mode 100755 index 0000000000000000000000000000000000000000..000f85c49252bd5ef5900e2d54a40e331331f722 GIT binary patch literal 1378 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 A<^TWy literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_device_battery.png b/res/drawable-xxhdpi/ic_device_battery.png new file mode 100755 index 0000000000000000000000000000000000000000..f8a2355c57046b737d42ee292b983e9f6620a60c GIT binary patch literal 1728 zcmaJ?X;2eq7>-(ka#XD?m$Y4j7C~}sBDo;YkOKk+LqJ6b2R6x)1V}bbHYG$Dg=hz_ zj!IzwDI)fOij_-&0wN*>DuT|`q99a9fhtidR6N>ZHwf4tr8~3xeeXB#^Ssyd&F+^( zhB`ZVIN)$NXHghmimhR`cPSqGZh2G_iY@M_AQp{A646vh597EBLe=ExYiIa$t95Q2k%Koc7y(7-4Jm^3L`1KY$Q%J_Ib9 zUXjR_@`bapFpEP_p{R~cCa0#Rl2U0TM6V=+EEbDQp^~XoBIZFfq-jyeMARC*<{0>} zL9SQpP&J|jY>bc$F`^s-mg(yfG`e|OtzouJSi{IBNJj=q6kADij$-luyJ|G^-Ud_( zzsdJMi48GnI+!el4Tw=M#|D?^WecTa^Yk!;BKjBvNtx@SM1`P;L51i59?#Y_2C!ZX z$<4@DIh3dFoi z8B2z28}GlyJ$Hm@$hMsqFJ{ckAJ$@;*JI*d#@#8w?hHx9=f;@&two!&#ZjIey~BsO zdy7|Yuas^I7dh7ej_|(DylP6RlS}xj7dh?EPXsSpeXB}B>y%aa2-G12$CSMyH{Op= z|DNgzne1t5cs97JH(+$=*SetQs}GtCErWjsv>1BEhX5zuI**Eo^c$;%l$nvx`HR>2b}vJjCZXV}TkXvn=9P~03u23d|Ktrr)k(Me zpG{|TPmPgGYw!h6J+1a_vLh^7V$UVwjgP>x9m>`WiXaO;SFd1>^w-C^FYOBtXx+1E zGV%SW+-Qd`i<24G6H%&iSw78fWq_R(q-*2|=NfJ1>1r3+m^1TE_<3s~x2?aZuey*i z=22fBcvNF~X-wEElbmDbjxRbvs2wi9?Bwd?yZx`T2TRDZf$;?Ue7ewY07oBgEeXA& zJ2Vw&vbvuVyL)4u@>FNIZh<3sG}5rb$gUlNng(W!L=x&p_hJ~2Ib+K zm+Xq}$@8}4(3SOmmOt!%x9dIw=Dw0Vp?8@^Ye(V2@t;#Al2guC_6889>V%_F4PBNI zzAF0jo30zeBQ5&{{f|pZi;5@SzMq$p?1lf0x8{2#}7ui@0P5EtD2q{h%G}|wBr0W^PW}T>8BI@!)TMu z)_PXO&}c(k{ISSm>A~3})kzle3sO{WU)#0U nBk>)kXQtb2ey5%P()%J#8FZk+Ec6_({ZmAONdEUB30eODWGtRA literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_app_events.png b/res/drawable-xxxhdpi/ic_app_events.png new file mode 100755 index 0000000000000000000000000000000000000000..99432559133e801f2a86ee01b1ade7c29d017f0e GIT binary patch literal 2274 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 - diff --git a/res/layout/card_generator_device_battery.xml b/res/layout/card_generator_device_battery.xml index 3244646..7239d93 100755 --- a/res/layout/card_generator_device_battery.xml +++ b/res/layout/card_generator_device_battery.xml @@ -18,10 +18,10 @@ - @@ -45,12 +45,12 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="8dp"> - + + android:layout_height="160dp" + android:layout_marginBottom="0dp"/> - + android:layout_height="wrap_content" + android:padding="8dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/res/values/generators.xml b/res/values/generators.xml index 0d0357e..20e06bd 100755 --- a/res/values/generators.xml +++ b/res/values/generators.xml @@ -120,10 +120,28 @@ Withings Device + Soft Activities + Moderate Activities + Intense Activities + #757575 + #039BE5 + #43A047 + No activity data has been downloaded yet. + + Steps + %1$d steps + + Distance + %1$.2f km + + Elevation + %1$.2f m Device Battery No battery levels have been reported yet. + #66BB6A + #1B5E20 App Event History diff --git a/src/com/audacious_software/passive_data_kit/generators/device/Battery.java b/src/com/audacious_software/passive_data_kit/generators/device/Battery.java index c99b1c1..4d91714 100755 --- a/src/com/audacious_software/passive_data_kit/generators/device/Battery.java +++ b/src/com/audacious_software/passive_data_kit/generators/device/Battery.java @@ -10,6 +10,8 @@ import android.database.sqlite.SQLiteDatabase; import android.os.BatteryManager; import android.os.Bundle; +import android.support.v4.content.ContextCompat; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,9 +23,19 @@ import com.audacious_software.passive_data_kit.generators.Generator; import com.audacious_software.passive_data_kit.generators.Generators; import com.audacious_software.pdk.passivedatakit.R; +import com.github.mikephil.charting.charts.LineChart; +import com.github.mikephil.charting.components.AxisBase; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.formatter.IAxisValueFormatter; import java.io.File; +import java.text.DateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -253,12 +265,20 @@ public static void bindViewHolder(DataPointViewHolder holder) { Battery generator = Battery.getInstance(context); - Cursor c = generator.mDatabase.query(Battery.TABLE_HISTORY, null, null, null, null, null, Battery.HISTORY_OBSERVED + " DESC"); + long now = System.currentTimeMillis(); + long start = now - (24 * 60 * 60 * 1000); + + String where = Battery.HISTORY_OBSERVED + " >= ?"; + String[] args = { "" + start }; + + Cursor c = generator.mDatabase.query(Battery.TABLE_HISTORY, null, where, args, null, null, Battery.HISTORY_OBSERVED + " DESC"); View cardContent = holder.itemView.findViewById(R.id.card_content); View cardEmpty = holder.itemView.findViewById(R.id.card_empty); TextView dateLabel = (TextView) holder.itemView.findViewById(R.id.generator_data_point_date); + Log.e("SLEEP-SIGHT", "BATT VALUES COUNT 1: " + c.getCount()); + if (c.moveToNext()) { cardContent.setVisibility(View.VISIBLE); cardEmpty.setVisibility(View.GONE); @@ -267,8 +287,85 @@ public static void bindViewHolder(DataPointViewHolder holder) { dateLabel.setText(Generator.formatTimestamp(context, timestamp)); - TextView lastLevel = (TextView) holder.itemView.findViewById(R.id.card_last_battery_level); - lastLevel.setText("TODO: LEVEL " + c.getInt(c.getColumnIndex(Battery.HISTORY_LEVEL))); + c.moveToPrevious(); + + final LineChart chart = (LineChart) holder.itemView.findViewById(R.id.battery_level_chart); + chart.setViewPortOffsets(0,0,0,0); + chart.setHighlightPerDragEnabled(false); + chart.setHighlightPerTapEnabled(false); + chart.setBackgroundColor(ContextCompat.getColor(context, android.R.color.black)); + chart.setPinchZoom(false); + + final DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context); + + final XAxis xAxis = chart.getXAxis(); + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); + xAxis.setTextSize(10f); + xAxis.setDrawAxisLine(true); + xAxis.setDrawGridLines(true); + xAxis.setCenterAxisLabels(true); + xAxis.setDrawLabels(true); + xAxis.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + xAxis.setGranularityEnabled(true); + xAxis.setGranularity(1); + xAxis.setAxisMinimum(start); + xAxis.setAxisMaximum(now); + xAxis.setValueFormatter(new IAxisValueFormatter() { + @Override + public String getFormattedValue(float value, AxisBase axis) { + Date date = new Date((long) value); + + return timeFormat.format(date); + } + }); + + YAxis leftAxis = chart.getAxisLeft(); + leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); + leftAxis.setDrawGridLines(true); + leftAxis.setDrawAxisLine(true); + leftAxis.setGranularityEnabled(true); + leftAxis.setAxisMaximum(110); + leftAxis.setAxisMinimum(-10); + leftAxis.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + + YAxis rightAxis = chart.getAxisRight(); + rightAxis.setEnabled(false); + + chart.getLegend().setEnabled(false); + chart.getDescription().setEnabled(false); + + ArrayList values = new ArrayList<>(); + + long lastLevel = -1; + + while (c.moveToNext()) { + long when = c.getLong(c.getColumnIndex(Battery.HISTORY_OBSERVED)); + long level = c.getLong(c.getColumnIndex(Battery.HISTORY_LEVEL)); + + if (level != lastLevel) { + values.add(0, new Entry(when, level)); + lastLevel = level; + + Log.e("SLEEP-SIGHT", "VALUE: " + level + " -- " + (when - start)); + } + } + + Log.e("SLEEP-SIGHT", "BATT VALUES COUNT 2: " + values.size()); + + LineDataSet set = new LineDataSet(values, "Battery"); + set.setAxisDependency(YAxis.AxisDependency.LEFT); + set.setLineWidth(2.0f); + set.setDrawCircles(false); + set.setFillAlpha(192); + set.setDrawFilled(false); + set.setDrawValues(true); + set.setColor(ContextCompat.getColor(context, R.color.generator_battery_plot)); + set.setDrawCircleHole(false); + set.setDrawValues(false); + set.setMode(LineDataSet.Mode.LINEAR); + + chart.setVisibleYRange(0, 120, YAxis.AxisDependency.LEFT); + chart.setData(new LineData(set)); } else { cardContent.setVisibility(View.GONE); cardEmpty.setVisibility(View.VISIBLE); diff --git a/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java b/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java index 8aaab44..7f47926 100755 --- a/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java +++ b/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java @@ -4,7 +4,9 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.graphics.Typeface; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -16,6 +18,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import com.audacious_software.passive_data_kit.PassiveDataKit; import com.audacious_software.passive_data_kit.activities.generators.DataPointViewHolder; @@ -24,6 +27,13 @@ import com.audacious_software.passive_data_kit.generators.Generators; import com.audacious_software.passive_data_kit.generators.diagnostics.AppEvent; import com.audacious_software.pdk.passivedatakit.R; +import com.github.mikephil.charting.charts.PieChart; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.PieData; +import com.github.mikephil.charting.data.PieDataSet; +import com.github.mikephil.charting.data.PieEntry; +import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.utils.ViewPortHandler; import org.json.JSONArray; import org.json.JSONException; @@ -39,6 +49,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -155,7 +166,7 @@ public class WithingsDevice extends Generator { private static final String LAST_DATA_FETCH = "com.audacious_software.passive_data_kit.generators.wearables.WithingsDevice.LAST_DATA_FETCH"; private static final String DATA_FETCH_INTERVAL = "com.audacious_software.passive_data_kit.generators.wearables.WithingsDevice.DATA_FETCH_INTERVAL"; - private static final long DATA_FETCH_INTERVAL_DEFAULT = (60 * 60 * 1000); + private static final long DATA_FETCH_INTERVAL_DEFAULT = (15 * 60 * 1000); // (60 * 60 * 1000); private static final String ACTIVITY_MEASURES_ENABLED = "com.audacious_software.passive_data_kit.generators.wearables.WithingsDevice.ACTIVITY_MEASURES_ENABLED"; private static final boolean ACTIVITY_MEASURES_ENABLED_DEFAULT = true; @@ -256,26 +267,32 @@ public void run() { @Override public void run() { if (prefs.getBoolean(WithingsDevice.ACTIVITY_MEASURES_ENABLED, WithingsDevice.ACTIVITY_MEASURES_ENABLED_DEFAULT)) { + Log.e("SLEEP-SIGHT", "FETCH ACTIVITY MEASURES"); me.fetchActivityMeasures(); } if (prefs.getBoolean(WithingsDevice.BODY_MEASURES_ENABLED, WithingsDevice.BODY_MEASURES_ENABLED_DEFAULT)) { + Log.e("SLEEP-SIGHT", "FETCH BODY MEASURES"); me.fetchBodyMeasures(); } if (prefs.getBoolean(WithingsDevice.INTRADAY_ACTIVITY_ENABLED, WithingsDevice.INTRADAY_ACTIVITY_ENABLED_DEFAULT)) { + Log.e("SLEEP-SIGHT", "FETCH INTRADAY ACTIVITY"); me.fetchIntradayActivities(); } if (prefs.getBoolean(WithingsDevice.SLEEP_MEASURES_ENABLED, WithingsDevice.SLEEP_MEASURES_ENABLED_DEFAULT)) { + Log.e("SLEEP-SIGHT", "FETCH SLEEP MEASURES"); me.fetchSleepMeasures(); } if (prefs.getBoolean(WithingsDevice.SLEEP_SUMMARY_ENABLED, WithingsDevice.SLEEP_SUMMARY_ENABLED_DEFAULT)) { + Log.e("SLEEP-SIGHT", "FETCH SLEEP SUMMARY"); me.fetchSleepSummary(); } if (prefs.getBoolean(WithingsDevice.WORKOUTS_ENABLED, WithingsDevice.WORKOUTS_ENABLED_DEFAULT)) { + Log.e("SLEEP-SIGHT", "FETCH WORKOUTS"); me.fetchWorkouts(); } } @@ -552,6 +569,12 @@ private void fetchActivityMeasures() { private void fetchBodyMeasures() { JSONObject response = this.queryApi(WithingsDevice.API_ACTION_BODY_MEASURES_URL); + try { + Log.e("SLEEP-SIGHT", "BODY JSON: " + response.toString(2)); + } catch (JSONException e) { + e.printStackTrace(); + } + if (response != null) { try { if (response.getInt("status") == 0) { @@ -699,6 +722,12 @@ private void fetchIntradayActivities() { private void fetchSleepMeasures() { JSONObject response = this.queryApi(WithingsDevice.API_ACTION_SLEEP_MEASURES_URL); + try { + Log.e("SLEEP-SIGHT", "SLEEP JSON: " + response.toString(2)); + } catch (JSONException e) { + e.printStackTrace(); + } + if (response != null) { try { if (response.getInt("status") == 0) { @@ -767,6 +796,12 @@ private void fetchSleepMeasures() { private void fetchSleepSummary() { JSONObject response = this.queryApi(WithingsDevice.API_ACTION_SLEEP_SUMMARY_URL); + try { + Log.e("SLEEP-SIGHT", "SLEEP SUMMARY JSON: " + response.toString(2)); + } catch (JSONException e) { + e.printStackTrace(); + } + if (response != null) { try { if (response.getInt("status") == 0) { @@ -882,133 +917,135 @@ public static ArrayList diagnostics(final Context context) { ArrayList actions = new ArrayList<>(); - actions.add(new DiagnosticAction(context.getString(R.string.diagnostic_withings_auth_required_title), context.getString(R.string.diagnostic_withings_auth_required), new Runnable() { + if (me.approvalGranted() == false) { + actions.add(new DiagnosticAction(context.getString(R.string.diagnostic_withings_auth_required_title), context.getString(R.string.diagnostic_withings_auth_required), new Runnable() { - @Override - public void run() { - Runnable r = new Runnable() { - @Override - public void run() { - try { - String requestUrl = "https://oauth.withings.com/account/request_token"; + @Override + public void run() { + Runnable r = new Runnable() { + @Override + public void run() { + try { + String requestUrl = "https://oauth.withings.com/account/request_token"; - Uri apiUri = Uri.parse(requestUrl); + Uri apiUri = Uri.parse(requestUrl); - Uri.Builder builder = new Uri.Builder(); - builder.scheme(apiUri.getScheme()); - builder.authority(apiUri.getAuthority()); - builder.path(apiUri.getPath()); + Uri.Builder builder = new Uri.Builder(); + builder.scheme(apiUri.getScheme()); + builder.authority(apiUri.getAuthority()); + builder.path(apiUri.getPath()); - String signature = "GET&" + URLEncoder.encode(builder.build().toString(), "UTF-8"); + String signature = "GET&" + URLEncoder.encode(builder.build().toString(), "UTF-8"); - String callbackUrl = me.getProperty(WithingsDevice.OPTION_OAUTH_CALLBACK_URL); - String apiKey = me.getProperty(WithingsDevice.OPTION_OAUTH_CONSUMER_KEY); - String apiSecret = me.getProperty(WithingsDevice.OPTION_OAUTH_CONSUMER_SECRET); + String callbackUrl = me.getProperty(WithingsDevice.OPTION_OAUTH_CALLBACK_URL); + String apiKey = me.getProperty(WithingsDevice.OPTION_OAUTH_CONSUMER_KEY); + String apiSecret = me.getProperty(WithingsDevice.OPTION_OAUTH_CONSUMER_SECRET); - String nonce = UUID.randomUUID().toString(); + String nonce = UUID.randomUUID().toString(); - builder.appendQueryParameter("oauth_callback", callbackUrl); - builder.appendQueryParameter("oauth_consumer_key", apiKey); - builder.appendQueryParameter("oauth_nonce", nonce); - builder.appendQueryParameter("oauth_signature_method", "HMAC-SHA1"); - builder.appendQueryParameter("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)); - builder.appendQueryParameter("oauth_version", "1.0"); + builder.appendQueryParameter("oauth_callback", callbackUrl); + builder.appendQueryParameter("oauth_consumer_key", apiKey); + builder.appendQueryParameter("oauth_nonce", nonce); + builder.appendQueryParameter("oauth_signature_method", "HMAC-SHA1"); + builder.appendQueryParameter("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)); + builder.appendQueryParameter("oauth_version", "1.0"); - Uri baseUri = builder.build(); + Uri baseUri = builder.build(); - signature += "&" + URLEncoder.encode(baseUri.getEncodedQuery(), "UTF-8"); + signature += "&" + URLEncoder.encode(baseUri.getEncodedQuery(), "UTF-8"); - String key = apiSecret + "&"; + String key = apiSecret + "&"; - SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSHA1"); - Mac mac = Mac.getInstance("HmacSHA1"); - mac.init(secret); + SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(secret); - byte[] bytes = mac.doFinal(signature.getBytes()); + byte[] bytes = mac.doFinal(signature.getBytes()); - signature = Base64.encodeToString(bytes, Base64.DEFAULT).trim(); + signature = Base64.encodeToString(bytes, Base64.DEFAULT).trim(); - builder.appendQueryParameter("oauth_signature", signature); + builder.appendQueryParameter("oauth_signature", signature); - Uri uri = builder.build(); + Uri uri = builder.build(); - OkHttpClient client = new OkHttpClient(); + OkHttpClient client = new OkHttpClient(); - Request request = new Request.Builder() - .url(uri.toString()) - .build(); + Request request = new Request.Builder() + .url(uri.toString()) + .build(); - Response response = client.newCall(request).execute(); + Response response = client.newCall(request).execute(); - String responseBody = response.body().string(); + String responseBody = response.body().string(); - StringTokenizer st = new StringTokenizer(responseBody, "&"); + StringTokenizer st = new StringTokenizer(responseBody, "&"); - String requestToken = null; - String requestSecret = null; + String requestToken = null; + String requestSecret = null; - while (st.hasMoreTokens()) { - String authToken = st.nextToken(); + while (st.hasMoreTokens()) { + String authToken = st.nextToken(); - if (authToken.startsWith("oauth_token=")) { - requestToken = authToken.replace("oauth_token=", ""); - } else if (authToken.startsWith("oauth_token_secret=")) { - requestSecret = authToken.replace("oauth_token_secret=", ""); + if (authToken.startsWith("oauth_token=")) { + requestToken = authToken.replace("oauth_token=", ""); + } else if (authToken.startsWith("oauth_token_secret=")) { + requestSecret = authToken.replace("oauth_token_secret=", ""); + } } - } - key = apiSecret + "&" + requestSecret; + key = apiSecret + "&" + requestSecret; - me.setProperty(WithingsDevice.OPTION_OAUTH_REQUEST_SECRET, requestSecret); + me.setProperty(WithingsDevice.OPTION_OAUTH_REQUEST_SECRET, requestSecret); - builder = new Uri.Builder(); - builder.scheme("https"); - builder.authority("oauth.withings.com"); - builder.path("/account/authorize"); + builder = new Uri.Builder(); + builder.scheme("https"); + builder.authority("oauth.withings.com"); + builder.path("/account/authorize"); - signature = "GET&" + URLEncoder.encode(builder.build().toString(), "UTF-8"); + signature = "GET&" + URLEncoder.encode(builder.build().toString(), "UTF-8"); - nonce = UUID.randomUUID().toString(); + nonce = UUID.randomUUID().toString(); - builder.appendQueryParameter("oauth_consumer_key", apiKey); - builder.appendQueryParameter("oauth_nonce", nonce); - builder.appendQueryParameter("oauth_signature_method", "HMAC-SHA1"); - builder.appendQueryParameter("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)); - builder.appendQueryParameter("oauth_token", requestToken); - builder.appendQueryParameter("oauth_version", "1.0"); + builder.appendQueryParameter("oauth_consumer_key", apiKey); + builder.appendQueryParameter("oauth_nonce", nonce); + builder.appendQueryParameter("oauth_signature_method", "HMAC-SHA1"); + builder.appendQueryParameter("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)); + builder.appendQueryParameter("oauth_token", requestToken); + builder.appendQueryParameter("oauth_version", "1.0"); - baseUri = builder.build(); + baseUri = builder.build(); - signature += "&" + URLEncoder.encode(baseUri.getEncodedQuery(), "UTF-8"); + signature += "&" + URLEncoder.encode(baseUri.getEncodedQuery(), "UTF-8"); - secret = new SecretKeySpec(key.getBytes(), "HmacSHA1"); - mac = Mac.getInstance("HmacSHA1"); - mac.init(secret); + secret = new SecretKeySpec(key.getBytes(), "HmacSHA1"); + mac = Mac.getInstance("HmacSHA1"); + mac.init(secret); - bytes = mac.doFinal(signature.getBytes(Charset.forName("UTF-8"))); + bytes = mac.doFinal(signature.getBytes(Charset.forName("UTF-8"))); - signature = Base64.encodeToString(bytes, Base64.DEFAULT); + signature = Base64.encodeToString(bytes, Base64.DEFAULT); - builder.appendQueryParameter("oauth_signature", signature.trim()); + builder.appendQueryParameter("oauth_signature", signature.trim()); - Intent intent = new Intent(Intent.ACTION_VIEW, builder.build()); - context.startActivity(intent); - } catch (NoSuchAlgorithmException e) { - AppEvent.getInstance(context).logThrowable(e); - } catch (InvalidKeyException e) { - AppEvent.getInstance(context).logThrowable(e); - } catch (UnsupportedEncodingException e) { - AppEvent.getInstance(context).logThrowable(e); - } catch (IOException e) { - AppEvent.getInstance(context).logThrowable(e); + Intent intent = new Intent(Intent.ACTION_VIEW, builder.build()); + context.startActivity(intent); + } catch (NoSuchAlgorithmException e) { + AppEvent.getInstance(context).logThrowable(e); + } catch (InvalidKeyException e) { + AppEvent.getInstance(context).logThrowable(e); + } catch (UnsupportedEncodingException e) { + AppEvent.getInstance(context).logThrowable(e); + } catch (IOException e) { + AppEvent.getInstance(context).logThrowable(e); + } } - } - }; + }; - Thread t = new Thread(r); - t.start(); - } - })); + Thread t = new Thread(r); + t.start(); + } + })); + } return actions; } @@ -1105,26 +1142,112 @@ public void run() { } public static void bindViewHolder(DataPointViewHolder holder) { -/* final Context context = holder.itemView.getContext(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); long lastTimestamp = 0; - long lastDuration = 0; - String callType = null; - long totalIncoming = 0; - long totalOutgoing = 0; - long totalMissed = 0; - long total = 0; + double steps = 0; + double distance = 0; + double elevation = 0; + + double softActivity = 0; + double moderateActivity = 0; + double intenseActivity = 0; WithingsDevice generator = WithingsDevice.getInstance(holder.itemView.getContext()); + Cursor c = generator.mDatabase.query(WithingsDevice.TABLE_ACTIVITY_MEASURE_HISTORY, null, null, null, null, null, WithingsDevice.HISTORY_OBSERVED + " DESC"); + + if (c.moveToNext()) { + if (lastTimestamp == 0) { + lastTimestamp = c.getLong(c.getColumnIndex(WithingsDevice.HISTORY_OBSERVED)); + } + + steps = c.getDouble(c.getColumnIndex(WithingsDevice.ACTIVITY_MEASURE_STEPS)); + distance = c.getDouble(c.getColumnIndex(WithingsDevice.ACTIVITY_MEASURE_DISTANCE)); + elevation = c.getDouble(c.getColumnIndex(WithingsDevice.ACTIVITY_MEASURE_ELEVATION)); + + softActivity = c.getDouble(c.getColumnIndex(WithingsDevice.ACTIVITY_MEASURE_SOFT_ACTIVITY_DURATION)); + moderateActivity = c.getDouble(c.getColumnIndex(WithingsDevice.ACTIVITY_MEASURE_MODERATE_ACTIVITY_DURATION)); + intenseActivity = c.getDouble(c.getColumnIndex(WithingsDevice.ACTIVITY_MEASURE_INTENSE_ACTIVITY_DURATION)); + } + + c.close(); + View cardContent = holder.itemView.findViewById(R.id.card_content); View cardEmpty = holder.itemView.findViewById(R.id.card_empty); TextView dateLabel = (TextView) holder.itemView.findViewById(R.id.generator_data_point_date); -*/ + + if (lastTimestamp > 0) { + cardContent.setVisibility(View.VISIBLE); + cardEmpty.setVisibility(View.GONE); + + dateLabel.setText(Generator.formatTimestamp(context, lastTimestamp)); + + PieChart pieChart = (PieChart) holder.itemView.findViewById(R.id.chart_phone_calls); + pieChart.getLegend().setEnabled(false); + + pieChart.setEntryLabelColor(android.R.color.transparent); + pieChart.getDescription().setEnabled(false); + pieChart.setDrawHoleEnabled(false); + + List entries = new ArrayList<>(); + + if (softActivity > 0) { + entries.add(new PieEntry((long) softActivity, context.getString(R.string.generator_withings_soft_activities_label))); + } + + if (moderateActivity > 0) { + entries.add(new PieEntry((long) moderateActivity, context.getString(R.string.generator_withings_moderate_activities_label))); + } + + if (intenseActivity > 0) { + entries.add(new PieEntry((long) intenseActivity, context.getString(R.string.generator_withings_intense_activities_label))); + } + + PieDataSet set = new PieDataSet(entries, " "); + + int[] colors = { + R.color.generator_withings_soft_activities, + R.color.generator_withings_moderate_activities, + R.color.generator_withings_intense_activities + }; + + set.setColors(colors, context); + + PieData data = new PieData(set); + data.setValueTextSize(14); + data.setValueTypeface(Typeface.DEFAULT_BOLD); + data.setValueTextColor(0xffffffff); + + data.setValueFormatter(new IValueFormatter() { + @Override + public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { + return "" + ((Float) value).intValue(); + } + }); + + pieChart.setData(data); + pieChart.invalidate(); + + dateLabel.setText(Generator.formatTimestamp(context, lastTimestamp / 1000)); + + TextView stepsValue = (TextView) holder.itemView.findViewById(R.id.field_steps); + stepsValue.setText(context.getString(R.string.generator_withings_steps_value, (int) steps)); + + TextView distanceValue = (TextView) holder.itemView.findViewById(R.id.field_distance); + distanceValue.setText(context.getString(R.string.generator_withings_distance_value, (distance / 1000))); + + TextView elevationValue = (TextView) holder.itemView.findViewById(R.id.field_elevation); + elevationValue.setText(context.getString(R.string.generator_withings_elevation_value, elevation)); + } else { + cardContent.setVisibility(View.GONE); + cardEmpty.setVisibility(View.VISIBLE); + + dateLabel.setText(R.string.label_never_pdk); + } } @Override