Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit c493df2

Browse files
committed
Merge branch 'bip-wip'
2 parents 4e496cf + 66bb0bd commit c493df2

File tree

62 files changed

+3165
-232
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+3165
-232
lines changed

GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package nodomain.freeyourgadget.gadgetbridge.daogen;
1717

18+
import java.util.Date;
19+
1820
import de.greenrobot.daogenerator.DaoGenerator;
1921
import de.greenrobot.daogenerator.Entity;
2022
import de.greenrobot.daogenerator.Index;
@@ -32,6 +34,7 @@ public class GBDaoGenerator {
3234
private static final String MAIN_PACKAGE = "nodomain.freeyourgadget.gadgetbridge";
3335
private static final String MODEL_PACKAGE = MAIN_PACKAGE + ".model";
3436
private static final String VALID_BY_DATE = MODEL_PACKAGE + ".ValidByDate";
37+
private static final String ACTIVITY_SUMMARY = MODEL_PACKAGE + ".ActivitySummary";
3538
private static final String OVERRIDE = "@Override";
3639
private static final String SAMPLE_RAW_INTENSITY = "rawIntensity";
3740
private static final String SAMPLE_STEPS = "steps";
@@ -42,7 +45,7 @@ public class GBDaoGenerator {
4245

4346

4447
public static void main(String[] args) throws Exception {
45-
Schema schema = new Schema(17, MAIN_PACKAGE + ".entities");
48+
Schema schema = new Schema(18, MAIN_PACKAGE + ".entities");
4649

4750
Entity userAttributes = addUserAttributes(schema);
4851
Entity user = addUserInfo(schema, userAttributes);
@@ -69,6 +72,8 @@ public static void main(String[] args) throws Exception {
6972

7073
addCalendarSyncState(schema, device);
7174

75+
addBipActivitySummary(schema, user, device);
76+
7277
new DaoGenerator().generateAll(schema, "app/src/main/java");
7378
}
7479

@@ -309,6 +314,31 @@ private static void addCalendarSyncState(Schema schema, Entity device) {
309314
calendarSyncState.addIntProperty("hash").notNull();
310315
}
311316

317+
private static void addBipActivitySummary(Schema schema, Entity user, Entity device) {
318+
Entity summary = addEntity(schema, "BaseActivitySummary");
319+
summary.implementsInterface(ACTIVITY_SUMMARY);
320+
summary.addIdProperty();
321+
322+
summary.setJavaDoc(
323+
"This class represents the summary of a user's activity event. I.e. a walk, hike, a bicycle tour, etc.");
324+
325+
summary.addStringProperty("name").codeBeforeGetter(OVERRIDE);
326+
summary.addDateProperty("startTime").notNull().codeBeforeGetter(OVERRIDE);
327+
summary.addDateProperty("endTime").notNull().codeBeforeGetter(OVERRIDE);
328+
summary.addIntProperty("activityKind").notNull().codeBeforeGetter(OVERRIDE);
329+
330+
summary.addIntProperty("baseLongitude").javaDocGetterAndSetter("Temporary, bip-specific");
331+
summary.addIntProperty("baseLatitude").javaDocGetterAndSetter("Temporary, bip-specific");
332+
summary.addIntProperty("baseAltitude").javaDocGetterAndSetter("Temporary, bip-specific");
333+
334+
summary.addStringProperty("gpxTrack").codeBeforeGetter(OVERRIDE);
335+
336+
Property deviceId = summary.addLongProperty("deviceId").notNull().codeBeforeGetter(OVERRIDE).getProperty();
337+
summary.addToOne(device, deviceId);
338+
Property userId = summary.addLongProperty("userId").notNull().codeBeforeGetter(OVERRIDE).getProperty();
339+
summary.addToOne(user, userId);
340+
}
341+
312342
private static Property findProperty(Entity entity, String propertyName) {
313343
for (Property prop : entity.getProperties()) {
314344
if (propertyName.equals(prop.getPropertyName())) {

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@
5959
android:name=".devices.miband.MiBandPreferencesActivity"
6060
android:label="@string/preferences_miband_settings"
6161
android:parentActivityName=".activities.SettingsActivity" />
62+
<activity
63+
android:name=".activities.ActivitySummariesActivity"
64+
android:label="@string/activity_summaries"
65+
android:parentActivityName=".activities.ControlCenterv2" />
6266
<activity
6367
android:launchMode="singleTop"
6468
android:name=".activities.appmanager.AppManagerActivity"
@@ -415,7 +419,7 @@
415419
android:grantUriPermissions="true">
416420
<meta-data
417421
android:name="android.support.FILE_PROVIDER_PATHS"
418-
android:resource="@xml/screenshot_provider_paths"/>
422+
android:resource="@xml/shared_paths" />
419423
</provider>
420424

421425
<receiver android:name=".SleepAlarmWidget">

app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import android.content.Context;
2626
import android.content.Intent;
2727
import android.content.SharedPreferences;
28+
import android.content.pm.ApplicationInfo;
29+
import android.content.pm.PackageInfo;
30+
import android.content.pm.PackageManager;
2831
import android.content.res.Configuration;
2932
import android.content.res.Resources;
3033
import android.database.Cursor;
@@ -607,4 +610,24 @@ public static GBApplication app() {
607610
public static Locale getLanguage() {
608611
return language;
609612
}
613+
614+
public String getVersion() {
615+
try {
616+
return getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA).versionName;
617+
} catch (PackageManager.NameNotFoundException e) {
618+
GB.log("Unable to determine Gadgetbridge's version", GB.WARN, e);
619+
return "0.0.0";
620+
}
621+
}
622+
623+
public String getNameAndVersion() {
624+
try {
625+
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getContext().getPackageName(), PackageManager.GET_META_DATA);
626+
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
627+
return String.format("%s %s", appInfo.name, packageInfo.versionName);
628+
} catch (PackageManager.NameNotFoundException e) {
629+
GB.log("Unable to determine Gadgetbridge's name/version", GB.WARN, e);
630+
return "Gadgetbridge";
631+
}
632+
}
610633
}

app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Logging.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public static String formatBytes(byte[] bytes) {
148148
}
149149
StringBuilder builder = new StringBuilder(bytes.length * 5);
150150
for (byte b : bytes) {
151-
builder.append(String.format("0x%2x", b));
151+
builder.append(String.format("0x%02x", b));
152152
builder.append(" ");
153153
}
154154
return builder.toString().trim();
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package nodomain.freeyourgadget.gadgetbridge.activities;
2+
3+
import android.os.Bundle;
4+
import android.support.v7.widget.Toolbar;
5+
import android.widget.ListView;
6+
import android.widget.Toast;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
12+
import nodomain.freeyourgadget.gadgetbridge.R;
13+
import nodomain.freeyourgadget.gadgetbridge.adapter.AbstractItemAdapter;
14+
import nodomain.freeyourgadget.gadgetbridge.adapter.ItemWithDetailsAdapter;
15+
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
16+
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
17+
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummaryDao;
18+
import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
19+
import nodomain.freeyourgadget.gadgetbridge.model.GenericItem;
20+
import nodomain.freeyourgadget.gadgetbridge.model.ItemWithDetails;
21+
import nodomain.freeyourgadget.gadgetbridge.util.GB;
22+
23+
public abstract class AbstractListActivity<T> extends AbstractGBActivity {
24+
private AbstractItemAdapter<T> itemAdapter;
25+
private ListView itemListView;
26+
27+
public void setItemAdapter(AbstractItemAdapter<T> itemAdapter) {
28+
this.itemAdapter = itemAdapter;
29+
itemListView.setAdapter(itemAdapter);
30+
}
31+
32+
protected void refresh() {
33+
this.itemAdapter.loadItems();
34+
}
35+
36+
public AbstractItemAdapter<T> getItemAdapter() {
37+
return itemAdapter;
38+
}
39+
40+
public ListView getItemListView() {
41+
return itemListView;
42+
}
43+
44+
@Override
45+
protected void onCreate(Bundle savedInstanceState) {
46+
super.onCreate(savedInstanceState);
47+
48+
setContentView(R.layout.activity_list);
49+
itemListView = (ListView) findViewById(R.id.itemListView);
50+
}
51+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package nodomain.freeyourgadget.gadgetbridge.activities;
2+
3+
import android.content.Intent;
4+
import android.os.Bundle;
5+
import android.view.ContextMenu;
6+
import android.view.MenuItem;
7+
import android.view.View;
8+
import android.widget.AdapterView;
9+
import android.widget.Toast;
10+
11+
import java.io.IOException;
12+
13+
import nodomain.freeyourgadget.gadgetbridge.adapter.ActivitySummariesAdapter;
14+
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
15+
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummary;
16+
import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils;
17+
import nodomain.freeyourgadget.gadgetbridge.util.GB;
18+
19+
public class ActivitySummariesActivity extends AbstractListActivity<BaseActivitySummary> {
20+
21+
private int selectedIndex;
22+
23+
@Override
24+
protected void onCreate(Bundle savedInstanceState) {
25+
super.onCreate(savedInstanceState);
26+
setItemAdapter(new ActivitySummariesAdapter(this));
27+
28+
getItemListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
29+
@Override
30+
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
31+
Object item = parent.getItemAtPosition(position);
32+
if (item != null) {
33+
ActivitySummary summary = (ActivitySummary) item;
34+
String gpxTrack = summary.getGpxTrack();
35+
if (gpxTrack != null) {
36+
showTrack(gpxTrack);
37+
}
38+
}
39+
}
40+
});
41+
42+
43+
getItemListView().setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
44+
@Override
45+
public void onCreateContextMenu(ContextMenu menu, View v, final ContextMenu.ContextMenuInfo menuInfo) {
46+
MenuItem delete = menu.add("Delete");
47+
delete.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
48+
@Override
49+
public boolean onMenuItemClick(MenuItem item) {
50+
deleteItemAt(selectedIndex);
51+
return true;
52+
}
53+
});
54+
}
55+
});
56+
57+
getItemListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
58+
@Override
59+
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
60+
selectedIndex = position;
61+
return getItemListView().showContextMenu();
62+
}
63+
});
64+
}
65+
66+
private void deleteItemAt(int position) {
67+
BaseActivitySummary item = getItemAdapter().getItem(position);
68+
if (item != null) {
69+
item.delete();
70+
getItemAdapter().remove(item);
71+
refresh();
72+
}
73+
}
74+
75+
private void showTrack(String gpxTrack) {
76+
try {
77+
AndroidUtils.viewFile(gpxTrack, Intent.ACTION_VIEW, this);
78+
} catch (IOException e) {
79+
GB.toast(this, "Unable to display GPX track: " + e.getMessage(), Toast.LENGTH_LONG, GB.ERROR, e);
80+
}
81+
}
82+
}

app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/HeartRateUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,8 @@ public class HeartRateUtils {
2727
* Value is in minutes
2828
*/
2929
public static final int MAX_HR_MEASUREMENTS_GAP_MINUTES = 10;
30+
31+
public static boolean isValidHeartRateValue(int value) {
32+
return value > HeartRateUtils.MIN_HEART_RATE_VALUE && value < HeartRateUtils.MAX_HEART_RATE_VALUE;
33+
}
3034
}

app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
7171
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
7272

73+
import static nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils.isValidHeartRateValue;
74+
7375
/**
7476
* A base class fragment to be used with ChartsActivity. The fragment can supply
7577
* a title to be displayed in the activity by returning non-null in #getTitle()
@@ -439,6 +441,7 @@ protected DefaultChartsData<LineData> refresh(GBDevice gbDevice, List<? extends
439441
List<Entry> notWornEntries = new ArrayList<>(numEntries);
440442
boolean hr = supportsHeartrate(gbDevice);
441443
List<Entry> heartrateEntries = hr ? new ArrayList<Entry>(numEntries) : null;
444+
List<Integer> colors = new ArrayList<>(numEntries); // this is kinda inefficient...
442445
int lastHrSampleIndex = -1;
443446

444447
for (int i = 0; i < numEntries; i++) {
@@ -509,7 +512,7 @@ protected DefaultChartsData<LineData> refresh(GBDevice gbDevice, List<? extends
509512
}
510513
activityEntries.add(createLineEntry(value, ts));
511514
}
512-
if (hr && sample.getKind() != ActivityKind.TYPE_NOT_WORN && isValidHeartRateValue(sample.getHeartRate())) {
515+
if (hr && sample.getKind() != ActivityKind.TYPE_NOT_WORN && HeartRateUtils.isValidHeartRateValue(sample.getHeartRate())) {
513516
if (lastHrSampleIndex > -1 && ts - lastHrSampleIndex > 1800*HeartRateUtils.MAX_HR_MEASUREMENTS_GAP_MINUTES) {
514517
heartrateEntries.add(createLineEntry(0, lastHrSampleIndex + 1));
515518
heartrateEntries.add(createLineEntry(0, ts - 1));
@@ -574,10 +577,6 @@ protected DefaultChartsData<LineData> refresh(GBDevice gbDevice, List<? extends
574577
return new DefaultChartsData(lineData, xValueFormatter);
575578
}
576579

577-
protected boolean isValidHeartRateValue(int value) {
578-
return value > HeartRateUtils.MIN_HEART_RATE_VALUE && value < HeartRateUtils.MAX_HEART_RATE_VALUE;
579-
}
580-
581580
/**
582581
* Implement this to supply the samples to be displayed.
583582
*

app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public void onReceive(Context context, Intent intent) {
168168
private void addSample(ActivitySample sample) {
169169
int heartRate = sample.getHeartRate();
170170
int timestamp = tsTranslation.shorten(sample.getTimestamp());
171-
if (isValidHeartRateValue(heartRate)) {
171+
if (HeartRateUtils.isValidHeartRateValue(heartRate)) {
172172
setCurrentHeartRate(heartRate, timestamp);
173173
}
174174
int steps = sample.getSteps();

0 commit comments

Comments
 (0)