Navigation Menu

Skip to content

Commit

Permalink
Withings probe visualization.
Browse files Browse the repository at this point in the history
* Battery probe visualization.
* Card UI work
  • Loading branch information
audaciouscode committed Apr 26, 2017
1 parent 450f255 commit 97e8033
Show file tree
Hide file tree
Showing 16 changed files with 453 additions and 112 deletions.
Binary file added res/drawable-hdpi/ic_app_events.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-hdpi/ic_device_battery.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-mdpi/ic_app_events.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-mdpi/ic_device_battery.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xhdpi/ic_app_events.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xhdpi/ic_device_battery.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xxhdpi/ic_app_events.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xxhdpi/ic_device_battery.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xxxhdpi/ic_app_events.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xxxhdpi/ic_device_battery.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions res/layout/card_generator_app_event.xml
Expand Up @@ -18,10 +18,10 @@
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#607D8B"
android:background="#424242"
android:padding="8dp"
android:baselineAligned="false">
<ImageView android:src="@drawable/ic_screen_state"
<ImageView android:src="@drawable/ic_app_events"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="8dp" />
Expand Down
14 changes: 7 additions & 7 deletions res/layout/card_generator_device_battery.xml
Expand Up @@ -18,10 +18,10 @@
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#607D8B"
android:background="@color/generator_battery_header"
android:padding="8dp"
android:baselineAligned="false">
<ImageView android:src="@drawable/ic_screen_state"
<ImageView android:src="@drawable/ic_device_battery"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="8dp" />
Expand All @@ -45,12 +45,12 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView android:id="@+id/card_last_battery_level"
android:padding="0dp">
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/battery_level_chart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="16dp" />
android:layout_height="160dp"
android:layout_marginBottom="0dp"/>
</LinearLayout>
<TextView android:id="@+id/card_empty"
android:text="@string/message_generator_device_battery_empty"
Expand Down
109 changes: 106 additions & 3 deletions res/layout/card_generator_withings_device.xml
Expand Up @@ -40,10 +40,113 @@
android:textColor="@android:color/white"
android:layout_marginRight="8dp"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
<LinearLayout android:id="@+id/card_content"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:padding="8dp">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/chart_phone_calls"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginRight="16dp"/>
<LinearLayout android:orientation="vertical"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="120dp">
<View android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="40dp" />
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp">
<View android:layout_width="16dp"
android:layout_marginRight="4dp"
android:layout_height="16dp"
android:background="@color/generator_withings_intense_activities" />
<TextView android:text="@string/generator_withings_intense_activities_label"
android:layout_width="wrap_content"
android:textSize="12sp"
android:layout_height="16dp" />
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp">
<View android:layout_width="16dp"
android:layout_marginRight="4dp"
android:layout_height="16dp"
android:background="@color/generator_withings_moderate_activities" />
<TextView android:text="@string/generator_withings_moderate_activities_label"
android:layout_width="wrap_content"
android:textSize="12sp"
android:layout_height="16dp" />
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp">
<View android:layout_width="16dp"
android:layout_marginRight="4dp"
android:layout_height="16dp"
android:background="@color/generator_withings_soft_activities" />
<TextView android:text="@string/generator_withings_soft_activities_label"
android:layout_width="wrap_content"
android:textSize="12sp"
android:layout_height="16dp" />
</LinearLayout>
<View android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="40dp" />
</LinearLayout>
<LinearLayout android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="120dp"
android:layout_marginRight="8dp">
<View android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="40dp" />
<TextView android:text="@string/generator_withings_steps_label"
android:textStyle="bold"
android:textSize="12sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView android:id="@+id/field_steps"
android:textSize="13sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"/>
<TextView android:text="@string/generator_withings_distance_label"
android:textStyle="bold"
android:textSize="12sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView android:id="@+id/field_distance"
android:textSize="13sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"/>
<TextView android:text="@string/generator_withings_elevation_label"
android:textStyle="bold"
android:textSize="12sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView android:id="@+id/field_elevation"
android:textSize="13sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="40dp" />
</LinearLayout>
</LinearLayout>
<TextView android:id="@+id/card_empty"
android:text="@string/message_generator_withings_empty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="16dp" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</LinearLayout>
18 changes: 18 additions & 0 deletions res/values/generators.xml
Expand Up @@ -120,10 +120,28 @@

<!-- Withings Device Resources -->
<string name="generator_withings_device">Withings Device</string>
<string name="generator_withings_soft_activities_label">Soft Activities</string>
<string name="generator_withings_moderate_activities_label">Moderate Activities</string>
<string name="generator_withings_intense_activities_label">Intense Activities</string>
<color name="generator_withings_soft_activities">#757575</color>
<color name="generator_withings_moderate_activities">#039BE5</color>
<color name="generator_withings_intense_activities">#43A047</color>
<string name="message_generator_withings_empty">No activity data has been downloaded yet.</string>

<string name="generator_withings_steps_label">Steps</string>
<string name="generator_withings_steps_value">%1$d steps</string>

<string name="generator_withings_distance_label">Distance</string>
<string name="generator_withings_distance_value">%1$.2f km</string>

<string name="generator_withings_elevation_label">Elevation</string>
<string name="generator_withings_elevation_value">%1$.2f m</string>

<!-- Device Battery -->
<string name="generator_device_battery">Device Battery</string>
<string name="message_generator_device_battery_empty">No battery levels have been reported yet.</string>
<color name="generator_battery_plot">#66BB6A</color>
<color name="generator_battery_header">#1B5E20</color>

<!-- App Event History -->
<string name="generator_app_event">App Event History</string>
Expand Down
Expand Up @@ -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;
Expand All @@ -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;

/**
Expand Down Expand Up @@ -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);
Expand All @@ -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<Entry> 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);
Expand Down

0 comments on commit 97e8033

Please sign in to comment.