mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-29 21:32:57 +01:00
Add Activity list dashboard summary calculations
Accessible via FAB in Activity list Adds DebugActivity checkbox to show large date range
This commit is contained in:
parent
1959f1c579
commit
e848a7cb71
@ -37,6 +37,8 @@ import android.view.MenuItem;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
import android.widget.DatePicker;
|
import android.widget.DatePicker;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
@ -371,6 +373,20 @@ public class DebugActivity extends AbstractGBActivity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
CheckBox activity_list_debug_extra_time_range = findViewById(R.id.activity_list_debug_extra_time_range);
|
||||||
|
activity_list_debug_extra_time_range.setAllCaps(true);
|
||||||
|
boolean activity_list_debug_extra_time_range_value = GBApplication.getPrefs().getPreferences().getBoolean("activity_list_debug_extra_time_range", false);
|
||||||
|
activity_list_debug_extra_time_range.setChecked(activity_list_debug_extra_time_range_value);
|
||||||
|
|
||||||
|
activity_list_debug_extra_time_range.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
|
||||||
|
GBApplication.getPrefs().getPreferences().getBoolean("activity_list_debug_extra_time_range", false);
|
||||||
|
SharedPreferences.Editor editor = GBApplication.getPrefs().getPreferences().edit();
|
||||||
|
editor.putBoolean("activity_list_debug_extra_time_range", b).apply();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteWidgetsPrefs() {
|
private void deleteWidgetsPrefs() {
|
||||||
|
@ -661,6 +661,11 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Object o) {
|
protected void onPostExecute(Object o) {
|
||||||
super.onPostExecute(o);
|
super.onPostExecute(o);
|
||||||
|
@ -38,6 +38,7 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
|
|||||||
protected static final Logger LOG = LoggerFactory.getLogger(AbstractWeekChartFragment.class);
|
protected static final Logger LOG = LoggerFactory.getLogger(AbstractWeekChartFragment.class);
|
||||||
protected final int ANIM_TIME = 250;
|
protected final int ANIM_TIME = 250;
|
||||||
private final int SESSION_SUMMARY = ActivitySession.SESSION_SUMMARY;
|
private final int SESSION_SUMMARY = ActivitySession.SESSION_SUMMARY;
|
||||||
|
private final int SESSION_EMPTY = ActivitySession.SESSION_EMPTY;
|
||||||
ActivityUser activityUser = new ActivityUser();
|
ActivityUser activityUser = new ActivityUser();
|
||||||
int stepsGoal = activityUser.getStepsGoal();
|
int stepsGoal = activityUser.getStepsGoal();
|
||||||
int distanceGoalMeters = activityUser.getDistanceMeters();
|
int distanceGoalMeters = activityUser.getDistanceMeters();
|
||||||
@ -257,6 +258,11 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
|
|||||||
unit = "###.#km";
|
unit = "###.#km";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (distanceMeters > 999000) {
|
||||||
|
distanceFormatted = distanceMeters / 1000;
|
||||||
|
unit = "###km";
|
||||||
|
}
|
||||||
|
|
||||||
String units = GBApplication.getPrefs().getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, GBApplication.getContext().getString(R.string.p_unit_metric));
|
String units = GBApplication.getPrefs().getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, GBApplication.getContext().getString(R.string.p_unit_metric));
|
||||||
if (units.equals(GBApplication.getContext().getString(R.string.p_unit_imperial))) {
|
if (units.equals(GBApplication.getContext().getString(R.string.p_unit_imperial))) {
|
||||||
unit = "###ft";
|
unit = "###ft";
|
||||||
@ -265,6 +271,10 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
|
|||||||
distanceFormatted = distanceFeet * 0.0001893939f;
|
distanceFormatted = distanceFeet * 0.0001893939f;
|
||||||
unit = "###.#mi";
|
unit = "###.#mi";
|
||||||
}
|
}
|
||||||
|
if (distanceFeet > 5274721) {
|
||||||
|
distanceFormatted = distanceFeet * 0.0001893939f;
|
||||||
|
unit = "###mi";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DecimalFormat df = new DecimalFormat(unit);
|
DecimalFormat df = new DecimalFormat(unit);
|
||||||
return df.format(distanceFormatted);
|
return df.format(distanceFormatted);
|
||||||
@ -339,6 +349,12 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
|
|||||||
return sessionType == SESSION_SUMMARY;
|
return sessionType == SESSION_SUMMARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isEmptySession(ActivitySession item, int position) {
|
||||||
|
int sessionType = item.getSessionType();
|
||||||
|
return sessionType == SESSION_EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isEmptySummary(ActivitySession item) {
|
protected boolean isEmptySummary(ActivitySession item) {
|
||||||
return item.getIsEmptySummary();
|
return item.getIsEmptySummary();
|
||||||
|
@ -27,6 +27,8 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
import com.github.mikephil.charting.charts.Chart;
|
import com.github.mikephil.charting.charts.Chart;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
@ -48,7 +50,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
|||||||
|
|
||||||
public class ActivityListingChartFragment extends AbstractChartFragment {
|
public class ActivityListingChartFragment extends AbstractChartFragment {
|
||||||
protected static final Logger LOG = LoggerFactory.getLogger(ActivityListingChartFragment.class);
|
protected static final Logger LOG = LoggerFactory.getLogger(ActivityListingChartFragment.class);
|
||||||
int tsDateFrom;
|
int tsDateTo;
|
||||||
|
|
||||||
private View rootView;
|
private View rootView;
|
||||||
private ActivityListingAdapter stepListAdapter;
|
private ActivityListingAdapter stepListAdapter;
|
||||||
@ -65,7 +67,13 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
|
|||||||
stepsDateView = rootView.findViewById(R.id.stepsDateView);
|
stepsDateView = rootView.findViewById(R.id.stepsDateView);
|
||||||
FloatingActionButton fab;
|
FloatingActionButton fab;
|
||||||
fab = rootView.findViewById(R.id.fab);
|
fab = rootView.findViewById(R.id.fab);
|
||||||
fab.setVisibility(View.GONE);
|
fab.setVisibility(View.VISIBLE);
|
||||||
|
fab.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
showDashboard(tsDateTo, getChartsHost().getDevice());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
return rootView;
|
return rootView;
|
||||||
@ -103,7 +111,11 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
|
|||||||
if (stepSessions.toArray().length == 0) {
|
if (stepSessions.toArray().length == 0) {
|
||||||
isEmptySummary = true;
|
isEmptySummary = true;
|
||||||
}
|
}
|
||||||
stepSessions = stepAnalysis.calculateSummary(stepSessions, isEmptySummary);
|
ActivitySession stepSessionsSummary = stepAnalysis.calculateSummary(stepSessions, isEmptySummary);
|
||||||
|
stepSessions.add(0, stepSessionsSummary);
|
||||||
|
ActivitySession emptySession = new ActivitySession();
|
||||||
|
emptySession.setSessionType(ActivitySession.SESSION_EMPTY);
|
||||||
|
stepSessions.add(emptySession); //this is to have an empty item at the end to be able to use FAB without it blocking anything
|
||||||
ongoingSession = stepAnalysis.getOngoingSessions(stepSessions);
|
ongoingSession = stepAnalysis.getOngoingSessions(stepSessions);
|
||||||
}
|
}
|
||||||
return new MyChartsData(stepSessions, ongoingSession);
|
return new MyChartsData(stepSessions, ongoingSession);
|
||||||
@ -118,7 +130,7 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
|
|||||||
getChartsHost().enableSwipeRefresh(false); //disable pull to refresh as it collides with swipable view
|
getChartsHost().enableSwipeRefresh(false); //disable pull to refresh as it collides with swipable view
|
||||||
}
|
}
|
||||||
|
|
||||||
stepsDateView.setText(DateTimeUtils.formatDate(new Date(tsDateFrom * 1000L)));
|
stepsDateView.setText(DateTimeUtils.formatDate(new Date(tsDateTo * 1000L)));
|
||||||
if (GBApplication.getPrefs().getBoolean("charts_show_ongoing_activity", true)) {
|
if (GBApplication.getPrefs().getBoolean("charts_show_ongoing_activity", true)) {
|
||||||
if (mcd.getOngoingSession() != null) {
|
if (mcd.getOngoingSession() != null) {
|
||||||
showOngoingActivitySnackbar(mcd.getOngoingSession());
|
showOngoingActivitySnackbar(mcd.getOngoingSession());
|
||||||
@ -144,7 +156,7 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
|
|||||||
day.set(Calendar.SECOND, 0);
|
day.set(Calendar.SECOND, 0);
|
||||||
tsFrom = (int) (day.getTimeInMillis() / 1000);
|
tsFrom = (int) (day.getTimeInMillis() / 1000);
|
||||||
tsTo = tsFrom + 24 * 60 * 60 - 1;
|
tsTo = tsFrom + 24 * 60 * 60 - 1;
|
||||||
tsDateFrom = tsFrom;
|
tsDateTo = tsTo;
|
||||||
return getAllSamples(db, device, tsFrom, tsTo);
|
return getAllSamples(db, device, tsFrom, tsTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,6 +188,14 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
|
|||||||
snackbar.show();
|
snackbar.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showDashboard(int date, GBDevice device) {
|
||||||
|
|
||||||
|
FragmentManager fm = getActivity().getSupportFragmentManager();
|
||||||
|
ActivityListingDashboard editNameDialogFragment = ActivityListingDashboard.newInstance(date, device);
|
||||||
|
editNameDialogFragment.show(fm, "activity_list_total_dashboard");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static class MyChartsData extends ChartsData {
|
private static class MyChartsData extends ChartsData {
|
||||||
private final List<ActivitySession> stepSessions;
|
private final List<ActivitySession> stepSessions;
|
||||||
private final ActivitySession ongoingSession;
|
private final ActivitySession ongoingSession;
|
||||||
|
@ -0,0 +1,327 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.activities.charts;
|
||||||
|
|
||||||
|
import android.app.DatePickerDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.DatePicker;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.RelativeLayout;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.database.DBAccess;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.entities.AbstractActivitySample;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySession;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
|
||||||
|
|
||||||
|
public class ActivityListingDashboard extends DialogFragment {
|
||||||
|
protected static final Logger LOG = LoggerFactory.getLogger(AbstractWeekChartFragment.class);
|
||||||
|
GBDevice gbDevice;
|
||||||
|
ActivityListingAdapter stepListAdapter;
|
||||||
|
ActivitySession stepSessionsSummary;
|
||||||
|
private int timeFrom;
|
||||||
|
private int timeTo;
|
||||||
|
private View fragmentView;
|
||||||
|
|
||||||
|
public ActivityListingDashboard() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ActivityListingDashboard newInstance(int timestamp, GBDevice device) {
|
||||||
|
|
||||||
|
ActivityListingDashboard frag = new ActivityListingDashboard();
|
||||||
|
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putInt("time", timestamp);
|
||||||
|
args.putParcelable(GBDevice.EXTRA_DEVICE, device);
|
||||||
|
frag.setArguments(args);
|
||||||
|
return frag;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
return inflater.inflate(R.layout.activity_list_total_dashboard, container);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
|
||||||
|
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
int time = getArguments().getInt("time", 1);
|
||||||
|
Calendar day = Calendar.getInstance();
|
||||||
|
day.setTimeInMillis(time * 1000L);
|
||||||
|
day.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
|
day.set(Calendar.MINUTE, 59);
|
||||||
|
day.set(Calendar.SECOND, 59);
|
||||||
|
timeTo = (int) (day.getTimeInMillis() / 1000);
|
||||||
|
|
||||||
|
|
||||||
|
gbDevice = getArguments().getParcelable(GBDevice.EXTRA_DEVICE);
|
||||||
|
if (gbDevice == null) {
|
||||||
|
throw new IllegalArgumentException("Must provide a device when invoking this activity");
|
||||||
|
}
|
||||||
|
stepListAdapter = new ActivityListingAdapter(getContext());
|
||||||
|
fragmentView = view;
|
||||||
|
|
||||||
|
final TextView battery_status_date_from_text = (TextView) view.findViewById(R.id.battery_status_date_from_text);
|
||||||
|
final TextView battery_status_date_to_text = (TextView) view.findViewById(R.id.battery_status_date_to_text);
|
||||||
|
LinearLayout battery_status_date_to_layout = (LinearLayout) view.findViewById(R.id.battery_status_date_to_layout);
|
||||||
|
final SeekBar battery_status_time_span_seekbar = (SeekBar) view.findViewById(R.id.battery_status_time_span_seekbar);
|
||||||
|
|
||||||
|
boolean activity_list_debug_extra_time_range_value = GBApplication.getPrefs().getPreferences().getBoolean("activity_list_debug_extra_time_range", false);
|
||||||
|
|
||||||
|
if (!activity_list_debug_extra_time_range_value) {
|
||||||
|
battery_status_time_span_seekbar.setMax(3);
|
||||||
|
}
|
||||||
|
final TextView battery_status_time_span_text = (TextView) view.findViewById(R.id.battery_status_time_span_text);
|
||||||
|
|
||||||
|
battery_status_time_span_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
||||||
|
String text;
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
text = getString(R.string.calendar_day);
|
||||||
|
timeFrom = shiftDateBackDays(timeTo, 1);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
text = getString(R.string.calendar_week);
|
||||||
|
timeFrom = shiftDateBackDays(timeTo, 7);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
text = getString(R.string.calendar_two_weeks);
|
||||||
|
timeFrom = shiftDateBackDays(timeTo, 14);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
text = getString(R.string.calendar_month);
|
||||||
|
timeFrom = subtractMonths(timeTo, -1);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
text = getString(R.string.calendar_three_months);
|
||||||
|
timeFrom = subtractMonths(timeTo, -3);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
text = getString(R.string.calendar_six_months);
|
||||||
|
timeFrom = subtractMonths(timeTo, -6);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
text = getString(R.string.calendar_year);
|
||||||
|
timeFrom = subtractMonths(timeTo, -12);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
text = getString(R.string.calendar_two_weeks);
|
||||||
|
timeFrom = shiftDateBackDays(timeTo, 14);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
battery_status_time_span_text.setText(text);
|
||||||
|
battery_status_date_from_text.setText(DateTimeUtils.formatDate(new Date(timeFrom * 1000L)));
|
||||||
|
battery_status_date_to_text.setText(DateTimeUtils.formatDate(new Date(timeTo * 1000L)));
|
||||||
|
createRefreshTask("Visualizing data", getActivity()).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
battery_status_date_to_layout.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
final Calendar currentDate = Calendar.getInstance();
|
||||||
|
currentDate.setTimeInMillis(timeTo * 1000L);
|
||||||
|
|
||||||
|
new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
|
||||||
|
@Override
|
||||||
|
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
|
||||||
|
|
||||||
|
Calendar date = Calendar.getInstance();
|
||||||
|
date.set(year, monthOfYear, dayOfMonth);
|
||||||
|
int time = (int) (date.getTimeInMillis() / 1000);
|
||||||
|
Calendar day = Calendar.getInstance();
|
||||||
|
day.setTimeInMillis(time * 1000L);
|
||||||
|
day.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
|
day.set(Calendar.MINUTE, 59);
|
||||||
|
day.set(Calendar.SECOND, 59);
|
||||||
|
timeTo = (int) (day.getTimeInMillis() / 1000);
|
||||||
|
|
||||||
|
battery_status_date_to_text.setText(DateTimeUtils.formatDate(new Date(timeTo * 1000L)));
|
||||||
|
battery_status_time_span_seekbar.setProgress(0);
|
||||||
|
battery_status_time_span_seekbar.setProgress(1);
|
||||||
|
}
|
||||||
|
}, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
battery_status_time_span_seekbar.setProgress(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int subtractMonths(int timeTo, int month) {
|
||||||
|
Calendar day = Calendar.getInstance();
|
||||||
|
day.setTimeInMillis(timeTo * 1000L);
|
||||||
|
day.add(Calendar.MONTH, month);
|
||||||
|
return (int) (day.getTimeInMillis() / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int daysBetweenTimes(int time1, int time2) {
|
||||||
|
return (int) TimeUnit.MILLISECONDS.toDays((time2 - time1) * 1000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int shiftDateBackDays(int timeTo, int days) {
|
||||||
|
int time = timeTo - ((24 * 3600) - 1) * days;
|
||||||
|
Calendar day = Calendar.getInstance();
|
||||||
|
day.setTimeInMillis(time * 1000L);
|
||||||
|
day.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
day.set(Calendar.MINUTE, 0);
|
||||||
|
day.set(Calendar.SECOND, 0);
|
||||||
|
return (int) (day.getTimeInMillis() / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RefreshTask createRefreshTask(String task, Context context) {
|
||||||
|
return new RefreshTask(task, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ActivitySession get_data(GBDevice gbDevice, DBHandler db, int timeFrom, int timeTo) {
|
||||||
|
|
||||||
|
List<ActivitySession> stepSessions;
|
||||||
|
List<? extends ActivitySample> activitySamples = getAllSamples(db, gbDevice, timeFrom, timeTo);
|
||||||
|
StepAnalysis stepAnalysis = new StepAnalysis();
|
||||||
|
|
||||||
|
boolean isEmptySummary = false;
|
||||||
|
if (activitySamples != null) {
|
||||||
|
stepSessions = stepAnalysis.calculateStepSessions(activitySamples);
|
||||||
|
if (stepSessions.toArray().length == 0) {
|
||||||
|
isEmptySummary = true;
|
||||||
|
}
|
||||||
|
stepSessionsSummary = stepAnalysis.calculateSummary(stepSessions, isEmptySummary);
|
||||||
|
}
|
||||||
|
return stepSessionsSummary;
|
||||||
|
}
|
||||||
|
|
||||||
|
SampleProvider<? extends AbstractActivitySample> getProvider(DBHandler db, GBDevice device) {
|
||||||
|
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
|
||||||
|
return coordinator.getSampleProvider(device, db.getDaoSession());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<? extends ActivitySample> getAllSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) {
|
||||||
|
SampleProvider<? extends ActivitySample> provider = getProvider(db, device);
|
||||||
|
return provider.getAllActivitySamples(tsFrom, tsTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void indicate_progress(boolean inProgress) {
|
||||||
|
LinearLayout activity_list_dashboard_results_layout = fragmentView.findViewById(R.id.activity_list_dashboard_results_layout);
|
||||||
|
RelativeLayout activity_list_dashboard_loading_layout = fragmentView.findViewById(R.id.activity_list_dashboard_loading_layout);
|
||||||
|
if (inProgress) {
|
||||||
|
activity_list_dashboard_results_layout.setVisibility(View.GONE);
|
||||||
|
activity_list_dashboard_loading_layout.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
activity_list_dashboard_results_layout.setVisibility(View.VISIBLE);
|
||||||
|
activity_list_dashboard_loading_layout.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void populateData(ActivitySession item) {
|
||||||
|
TextView stepLabel = fragmentView.findViewById(R.id.line_layout_step_label);
|
||||||
|
TextView stepTotalLabel = fragmentView.findViewById(R.id.line_layout_total_step_label);
|
||||||
|
TextView distanceLabel = fragmentView.findViewById(R.id.line_layout_distance_label);
|
||||||
|
TextView durationLabel = fragmentView.findViewById(R.id.line_layout_duration_label);
|
||||||
|
TextView sessionCountLabel = fragmentView.findViewById(R.id.line_layout_count_label);
|
||||||
|
LinearLayout durationLayout = fragmentView.findViewById(R.id.line_layout_duration);
|
||||||
|
LinearLayout countLayout = fragmentView.findViewById(R.id.line_layout_count);
|
||||||
|
LinearLayout stepsLayout = fragmentView.findViewById(R.id.line_layout_step);
|
||||||
|
LinearLayout stepsTotalLayout = fragmentView.findViewById(R.id.line_layout_total_step);
|
||||||
|
LinearLayout distanceLayout = fragmentView.findViewById(R.id.line_layout_distance);
|
||||||
|
|
||||||
|
stepLabel.setText(stepListAdapter.getStepLabel(item));
|
||||||
|
stepTotalLabel.setText(stepListAdapter.getStepTotalLabel(item));
|
||||||
|
distanceLabel.setText(stepListAdapter.getDistanceLabel(item));
|
||||||
|
durationLabel.setText(stepListAdapter.getDurationLabel(item));
|
||||||
|
sessionCountLabel.setText(stepListAdapter.getSessionCountLabel(item));
|
||||||
|
|
||||||
|
if (!stepListAdapter.hasDistance(item)) {
|
||||||
|
distanceLayout.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
distanceLayout.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stepListAdapter.hasSteps(item)) {
|
||||||
|
stepsLayout.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
stepsLayout.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stepListAdapter.hasTotalSteps(item)) {
|
||||||
|
stepsTotalLayout.setVisibility(View.GONE);
|
||||||
|
countLayout.setVisibility(View.GONE);
|
||||||
|
durationLayout.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
stepsTotalLayout.setVisibility(View.VISIBLE);
|
||||||
|
countLayout.setVisibility(View.VISIBLE);
|
||||||
|
durationLayout.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RefreshTask extends DBAccess {
|
||||||
|
|
||||||
|
public RefreshTask(String task, Context context) {
|
||||||
|
super(task, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doInBackground(DBHandler db) {
|
||||||
|
stepSessionsSummary = get_data(gbDevice, db, timeFrom, timeTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute() {
|
||||||
|
indicate_progress(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Object o) {
|
||||||
|
super.onPostExecute(o);
|
||||||
|
FragmentActivity activity = getActivity();
|
||||||
|
if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
|
||||||
|
populateData(stepSessionsSummary);
|
||||||
|
indicate_progress(false);
|
||||||
|
} else {
|
||||||
|
LOG.info("Not filling data because activity is not available anymore");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,6 +35,7 @@ public class StepAnalysis {
|
|||||||
private int totalDailySteps = 0;
|
private int totalDailySteps = 0;
|
||||||
|
|
||||||
public List<ActivitySession> calculateStepSessions(List<? extends ActivitySample> samples) {
|
public List<ActivitySession> calculateStepSessions(List<? extends ActivitySample> samples) {
|
||||||
|
LOG.debug("get all samples activitysessions: " + samples.toArray().length);
|
||||||
List<ActivitySession> result = new ArrayList<>();
|
List<ActivitySession> result = new ArrayList<>();
|
||||||
ActivityUser activityUser = new ActivityUser();
|
ActivityUser activityUser = new ActivityUser();
|
||||||
double STEP_LENGTH_M;
|
double STEP_LENGTH_M;
|
||||||
@ -154,7 +155,7 @@ public class StepAnalysis {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ActivitySession> calculateSummary(List<ActivitySession> sessions, boolean empty) {
|
public ActivitySession calculateSummary(List<ActivitySession> sessions, boolean empty) {
|
||||||
|
|
||||||
Date startTime = null;
|
Date startTime = null;
|
||||||
Date endTime = null;
|
Date endTime = null;
|
||||||
@ -164,7 +165,7 @@ public class StepAnalysis {
|
|||||||
int distanceSum = 0;
|
int distanceSum = 0;
|
||||||
float intensitySum = 0;
|
float intensitySum = 0;
|
||||||
int sessionCount;
|
int sessionCount;
|
||||||
int durationSum = 0;
|
long durationSum = 0;
|
||||||
|
|
||||||
for (ActivitySession session : sessions) {
|
for (ActivitySession session : sessions) {
|
||||||
startTime = session.getStartTime();
|
startTime = session.getStartTime();
|
||||||
@ -192,11 +193,7 @@ public class StepAnalysis {
|
|||||||
|
|
||||||
|
|
||||||
stepSessionSummary.setTotalDaySteps(totalDailySteps);
|
stepSessionSummary.setTotalDaySteps(totalDailySteps);
|
||||||
|
return stepSessionSummary;
|
||||||
List<ActivitySession> newList = new ArrayList<>();
|
|
||||||
newList.add(stepSessionSummary);
|
|
||||||
newList.addAll(sessions);
|
|
||||||
return newList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActivitySession getOngoingSessions(List<ActivitySession> sessions) {
|
public ActivitySession getOngoingSessions(List<ActivitySession> sessions) {
|
||||||
|
@ -76,6 +76,8 @@ public abstract class AbstractActivityListingAdapter<T> extends ArrayAdapter<T>
|
|||||||
|
|
||||||
if (isSummary(item, position)) {
|
if (isSummary(item, position)) {
|
||||||
view = fill_dashboard(item, position, view, parent, context);
|
view = fill_dashboard(item, position, view, parent, context);
|
||||||
|
} else if (isEmptySession(item, position)) {
|
||||||
|
view = fill_empty(item, position, view, parent);
|
||||||
} else {
|
} else {
|
||||||
view = fill_item(item, position, view, parent);
|
view = fill_item(item, position, view, parent);
|
||||||
}
|
}
|
||||||
@ -174,6 +176,14 @@ public abstract class AbstractActivityListingAdapter<T> extends ArrayAdapter<T>
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private View fill_empty(T item, int position, View view, ViewGroup parent) {
|
||||||
|
view = null;
|
||||||
|
LayoutInflater inflater = (LayoutInflater) context
|
||||||
|
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
view = inflater.inflate(R.layout.activity_list_item, parent, false);
|
||||||
|
view.setVisibility(View.GONE);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract View fill_dashboard(T item, int position, View view, ViewGroup parent, Context context);
|
protected abstract View fill_dashboard(T item, int position, View view, ViewGroup parent, Context context);
|
||||||
|
|
||||||
@ -215,6 +225,8 @@ public abstract class AbstractActivityListingAdapter<T> extends ArrayAdapter<T>
|
|||||||
|
|
||||||
protected abstract boolean isSummary(T item, int position);
|
protected abstract boolean isSummary(T item, int position);
|
||||||
|
|
||||||
|
protected abstract boolean isEmptySession(T item, int position);
|
||||||
|
|
||||||
protected abstract boolean isEmptySummary(T item);
|
protected abstract boolean isEmptySummary(T item);
|
||||||
|
|
||||||
protected abstract String getStepTotalLabel(T item);
|
protected abstract String getStepTotalLabel(T item);
|
||||||
|
@ -397,6 +397,9 @@ public class ActivitySummariesAdapter extends AbstractActivityListingAdapter<Bas
|
|||||||
return position == 0;
|
return position == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isEmptySession(BaseActivitySummary item, int position) { return false; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isEmptySummary(BaseActivitySummary item) {
|
protected boolean isEmptySummary(BaseActivitySummary item) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -39,6 +39,7 @@ public abstract class DBAccess extends AsyncTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void doInBackground(DBHandler handler);
|
protected abstract void doInBackground(DBHandler handler);
|
||||||
|
protected abstract void onPreExecute();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object doInBackground(Object[] params) {
|
protected Object doInBackground(Object[] params) {
|
||||||
@ -57,6 +58,8 @@ public abstract class DBAccess extends AsyncTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected void displayError(Throwable error) {
|
protected void displayError(Throwable error) {
|
||||||
GB.toast(getContext(), getContext().getString(R.string.dbaccess_error_executing, error.getMessage()), Toast.LENGTH_LONG, GB.ERROR, error);
|
GB.toast(getContext(), getContext().getString(R.string.dbaccess_error_executing, error.getMessage()), Toast.LENGTH_LONG, GB.ERROR, error);
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ public class ActivitySession {
|
|||||||
public static int SESSION_NORMAL = 1;
|
public static int SESSION_NORMAL = 1;
|
||||||
public static int SESSION_SUMMARY = 2;
|
public static int SESSION_SUMMARY = 2;
|
||||||
public static int SESSION_ONGOING = 3;
|
public static int SESSION_ONGOING = 3;
|
||||||
|
public static int SESSION_EMPTY = 4;
|
||||||
|
|
||||||
private final Date startTime;
|
private final Date startTime;
|
||||||
private final Date endTime;
|
private final Date endTime;
|
||||||
@ -37,6 +38,16 @@ public class ActivitySession {
|
|||||||
this.activityKind = activityKind;
|
this.activityKind = activityKind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ActivitySession(){
|
||||||
|
this.startTime = null;
|
||||||
|
this.endTime = null;
|
||||||
|
this.activeSteps=0;
|
||||||
|
this.heartRateAverage = 0;
|
||||||
|
this.intensity = 0;
|
||||||
|
this.distance = 0;
|
||||||
|
this.activityKind = 0;
|
||||||
|
};
|
||||||
|
|
||||||
public Date getStartTime() {
|
public Date getStartTime() {
|
||||||
return startTime;
|
return startTime;
|
||||||
}
|
}
|
||||||
|
4
app/src/main/res/drawable/ic_insights.xml
Normal file
4
app/src/main/res/drawable/ic_insights.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorControlNormal">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M21 8c-1.45 0-2.26 1.44-1.93 2.51l-3.55 3.56c-0.3-0.09-0.74-0.09-1.04 0l-2.55-2.55C12.27 10.45 11.46 9 10 9c-1.45 0-2.27 1.44-1.93 2.52l-4.56 4.55C2.44 15.74 1 16.55 1 18c0 1.1 0.9 2 2 2 1.45 0 2.26-1.44 1.93-2.51l4.55-4.56c0.3 0.09 0.74 0.09 1.04 0l2.55 2.55C12.73 16.55 13.54 18 15 18c1.45 0 2.27-1.44 1.93-2.52l3.56-3.55C21.56 12.26 23 11.45 23 10c0-1.1-0.9-2-2-2z"/>
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M15 9l0.94-2.07L18 6l-2.06-0.93L15 3l-0.92 2.07L12 6l2.08 0.93zM3.5 11L4 9l2-0.5L4 8 3.5 6 3 8 1 8.5 3 9z"/>
|
||||||
|
</vector>
|
@ -84,167 +84,7 @@
|
|||||||
android:layout_height="350dp" />
|
android:layout_height="350dp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<include layout="@layout/layout_widget_duration_selector" />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/battery_status_time_span_seekbar"
|
|
||||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layoutDirection="rtl"
|
|
||||||
android:max="5"
|
|
||||||
android:progress="1" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="0dp"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:baselineAligned="false"
|
|
||||||
android:gravity="bottom|center"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center|top"
|
|
||||||
android:layout_marginStart="1dp"
|
|
||||||
android:layout_marginEnd="1dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center|top"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="19dp"
|
|
||||||
android:layout_height="19dp"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:contentDescription="@string/icon_placeholder"
|
|
||||||
android:scaleX="-1"
|
|
||||||
app:srcCompat="@drawable/ic_calendar_to" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="2"
|
|
||||||
android:scrollHorizontally="false"
|
|
||||||
android:text="@string/activity_filter_date_from"
|
|
||||||
android:textAllCaps="true"
|
|
||||||
android:textColor="@color/accent"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/battery_status_date_from_text"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:fontFamily="sans-serif-black"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:scrollHorizontally="false"
|
|
||||||
android:text="@string/lorem_ipsum"
|
|
||||||
android:textSize="12sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center|top"
|
|
||||||
android:layout_marginStart="1dp"
|
|
||||||
android:layout_marginEnd="1dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center|top"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="19dp"
|
|
||||||
android:layout_height="19dp"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:contentDescription="@string/candidate_item_device_image"
|
|
||||||
app:srcCompat="@drawable/ic_date_range" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="2"
|
|
||||||
android:scrollHorizontally="false"
|
|
||||||
android:text="@string/activity_detail_duration_label"
|
|
||||||
android:textAllCaps="true"
|
|
||||||
android:textColor="@color/accent"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/battery_status_time_span_text"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:fontFamily="sans-serif-black"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:scrollHorizontally="false"
|
|
||||||
android:text="@string/lorem_ipsum"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/battery_status_date_to_layout"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center|top"
|
|
||||||
android:layout_marginStart="1dp"
|
|
||||||
android:layout_marginEnd="1dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center|top"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="19dp"
|
|
||||||
android:layout_height="19dp"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:contentDescription="@string/candidate_item_device_image"
|
|
||||||
app:srcCompat="@drawable/ic_calendar_to" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="2"
|
|
||||||
android:scrollHorizontally="false"
|
|
||||||
android:text="@string/activity_filter_date_to"
|
|
||||||
android:textAllCaps="true"
|
|
||||||
android:textColor="@color/accent"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/battery_status_date_to_text"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:fontFamily="sans-serif-black"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:scrollHorizontally="false"
|
|
||||||
android:text="@string/lorem_ipsum"
|
|
||||||
android:textColor="@color/accent"
|
|
||||||
android:textSize="12sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:grid="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
@ -13,8 +14,7 @@
|
|||||||
android:layout_alignParentStart="true"
|
android:layout_alignParentStart="true"
|
||||||
android:layout_alignParentTop="true">
|
android:layout_alignParentTop="true">
|
||||||
|
|
||||||
<androidx.gridlayout.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.gridlayout.widget.GridLayout
|
||||||
xmlns:grid="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
@ -195,7 +195,22 @@
|
|||||||
grid:layout_gravity="fill_horizontal"
|
grid:layout_gravity="fill_horizontal"
|
||||||
android:text="Delete app Widgets Preferences" />
|
android:text="Delete app Widgets Preferences" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/activity_list_debug_extra_time_range"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="4dp"
|
||||||
|
android:layout_marginTop="7dp"
|
||||||
|
android:background="@color/accent"
|
||||||
|
android:buttonTint="@color/btn_dark"
|
||||||
|
android:padding="4dp"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:text="Activity summary extra date range (takes long to generate when used)"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textStyle="bold"
|
||||||
|
grid:layout_columnSpan="2" />
|
||||||
</androidx.gridlayout.widget.GridLayout>
|
</androidx.gridlayout.widget.GridLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
87
app/src/main/res/layout/activity_list_total_dashboard.xml
Normal file
87
app/src/main/res/layout/activity_list_total_dashboard.xml
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/activity_battery_info_master_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="0dp"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:gravity="center|center_vertical"
|
||||||
|
android:minWidth="1000dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/activity_list_dashboard_loading_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="100dp"
|
||||||
|
android:layout_marginStart="35dp"
|
||||||
|
android:layout_marginTop="35dp"
|
||||||
|
app:srcCompat="@drawable/gadgetbridge_img" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:layout_width="171dp"
|
||||||
|
android:layout_height="171dp"
|
||||||
|
android:indeterminate="true" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/activity_list_dashboard_results_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:layout_marginBottom="30dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:baselineAligned="false"
|
||||||
|
android:gravity="bottom|center"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<include layout="@layout/layout_widget_active_steps" />
|
||||||
|
|
||||||
|
<include layout="@layout/layout_widget_distance" />
|
||||||
|
|
||||||
|
<include layout="@layout/layout_widget_duration" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:baselineAligned="false"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<include layout="@layout/layout_widget_total_steps" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
app:srcCompat="@drawable/gadgetbridge_img" />
|
||||||
|
|
||||||
|
<include layout="@layout/layout_widget_activities_count" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<include
|
||||||
|
layout="@layout/layout_widget_duration_selector"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -22,9 +22,8 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/stepsDateView"
|
android:layout_below="@id/stepsDateView"
|
||||||
android:layout_alignParentBottom="false"
|
android:layout_alignParentBottom="false"
|
||||||
|
android:layout_marginBottom="0dp"
|
||||||
android:layout_marginTop="0dp">
|
android:layout_marginTop="0dp">
|
||||||
|
|
||||||
|
|
||||||
</ListView>
|
</ListView>
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
@ -37,8 +36,8 @@
|
|||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="9dp"
|
||||||
app:srcCompat="@drawable/ic_show_chart" />
|
app:srcCompat="@drawable/ic_insights" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
161
app/src/main/res/layout/layout_widget_duration_selector.xml
Normal file
161
app/src/main/res/layout/layout_widget_duration_selector.xml
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/battery_status_time_span_seekbar"
|
||||||
|
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layoutDirection="rtl"
|
||||||
|
android:max="6"
|
||||||
|
android:progress="1" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="0dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:baselineAligned="false"
|
||||||
|
android:gravity="bottom|center"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center|top"
|
||||||
|
android:layout_marginStart="1dp"
|
||||||
|
android:layout_marginEnd="1dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center|top"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="19dp"
|
||||||
|
android:layout_height="19dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:contentDescription="@string/icon_placeholder"
|
||||||
|
android:scaleX="-1"
|
||||||
|
app:srcCompat="@drawable/ic_calendar_to" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:scrollHorizontally="false"
|
||||||
|
android:text="@string/activity_filter_date_from"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:textColor="@color/accent"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/battery_status_date_from_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:fontFamily="sans-serif-black"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:scrollHorizontally="false"
|
||||||
|
android:text="@string/lorem_ipsum"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center|top"
|
||||||
|
android:layout_marginStart="1dp"
|
||||||
|
android:layout_marginEnd="1dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center|top"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="19dp"
|
||||||
|
android:layout_height="19dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:contentDescription="@string/candidate_item_device_image"
|
||||||
|
app:srcCompat="@drawable/ic_date_range" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:scrollHorizontally="false"
|
||||||
|
android:text="@string/activity_detail_duration_label"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:textColor="@color/accent"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/battery_status_time_span_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:fontFamily="sans-serif-black"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:scrollHorizontally="false"
|
||||||
|
android:text="@string/lorem_ipsum"
|
||||||
|
android:textSize="18sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/battery_status_date_to_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center|top"
|
||||||
|
android:layout_marginStart="1dp"
|
||||||
|
android:layout_marginEnd="1dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center|top"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="19dp"
|
||||||
|
android:layout_height="19dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:contentDescription="@string/candidate_item_device_image"
|
||||||
|
app:srcCompat="@drawable/ic_calendar_to" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:scrollHorizontally="false"
|
||||||
|
android:text="@string/activity_filter_date_to"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:textColor="@color/accent"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/battery_status_date_to_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:fontFamily="sans-serif-black"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:scrollHorizontally="false"
|
||||||
|
android:text="@string/lorem_ipsum"
|
||||||
|
android:textColor="@color/accent"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -32,7 +32,8 @@
|
|||||||
<string name="calendar_week">Week</string>
|
<string name="calendar_week">Week</string>
|
||||||
<string name="calendar_two_weeks">Two weeks</string>
|
<string name="calendar_two_weeks">Two weeks</string>
|
||||||
<string name="calendar_month">Month</string>
|
<string name="calendar_month">Month</string>
|
||||||
<string name="calendar_six_months">Six months</string>
|
<string name="calendar_three_months">3 months</string>
|
||||||
|
<string name="calendar_six_months">6 months</string>
|
||||||
<string name="calendar_year">Year</string>
|
<string name="calendar_year">Year</string>
|
||||||
<!-- Strings related to Debug Activity -->
|
<!-- Strings related to Debug Activity -->
|
||||||
<string name="title_activity_debug">Debug</string>
|
<string name="title_activity_debug">Debug</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user