From 9b30369a88834a2597284152fd5341d576adfec1 Mon Sep 17 00:00:00 2001 From: vanous Date: Mon, 24 Aug 2020 00:09:10 +0200 Subject: [PATCH] Add edit Sport Summary Name. Add filtering by this name. --- .../activities/AbstractListActivity.java | 4 + .../activities/ActivitySummariesActivity.java | 35 ++++++--- .../activities/ActivitySummariesFilter.java | 68 ++++++++++++----- .../activities/ActivitySummaryDetail.java | 76 +++++++++++++++---- .../adapter/AbstractItemAdapter.java | 4 + .../adapter/ActivitySummariesAdapter.java | 40 +++++----- .../model/ActivitySummaryItems.java | 5 +- .../res/layout/activity_summary_details.xml | 45 +++++++++-- .../main/res/layout/sport_activity_filter.xml | 35 +++++++++ app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/styles.xml | 16 ++++ 11 files changed, 259 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractListActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractListActivity.java index 15148f081..12797490b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractListActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractListActivity.java @@ -47,6 +47,10 @@ public abstract class AbstractListActivity extends AbstractGBActivity { this.itemAdapter.setDateToFilter(date); } + public void setNameContainsFilter(String name){ + this.itemAdapter.setNameContainsFilter(name); + } + public AbstractItemAdapter getItemAdapter() { return itemAdapter; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java index 4deff97d9..518c5bb30 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java @@ -84,7 +84,11 @@ public class ActivitySummariesActivity extends AbstractListActivity. */ package nodomain.freeyourgadget.gadgetbridge.activities; -import android.app.Activity; import android.app.DatePickerDialog; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Color; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.util.TypedValue; import android.view.MenuItem; import android.view.View; @@ -30,8 +31,8 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; +import android.widget.EditText; import android.widget.LinearLayout; -import android.widget.ScrollView; import android.widget.Spinner; import android.widget.TextView; @@ -48,7 +49,6 @@ import java.util.Objects; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; @@ -59,6 +59,7 @@ public class ActivitySummariesFilter extends AbstractGBActivity { int activityFilter = 0; long dateFromFilter = 0; long dateToFilter = 0; + String nameContainsFilter; HashMap activityKindMap = new HashMap<>(1); int BACKGROUND_COLOR; @@ -78,12 +79,14 @@ public class ActivitySummariesFilter extends AbstractGBActivity { activityFilter = bundle.getInt("activityFilter", 0); dateFromFilter = bundle.getLong("dateFromFilter", 0); dateToFilter = bundle.getLong("dateToFilter", 0); + nameContainsFilter = bundle.getString("nameContainsFilter"); Context appContext = this.getApplicationContext(); if (appContext instanceof GBApplication) { setContentView(R.layout.sport_activity_filter); } - BACKGROUND_COLOR = GBApplication.getBackgroundColor(appContext);; + BACKGROUND_COLOR = GBApplication.getBackgroundColor(appContext); + ; //get spinner ready - assign data, set selected item... final Spinner filterKindSpinner = findViewById(R.id.select_kind); @@ -98,19 +101,39 @@ public class ActivitySummariesFilter extends AbstractGBActivity { final TextView filterfromlabel = findViewById(R.id.textViewFromData); final LinearLayout filterto = findViewById(R.id.filterto); final TextView filtertolabel = findViewById(R.id.textViewToData); - + final EditText nameContainsFilterdata = findViewById(R.id.textViewNameData); + nameContainsFilterdata.setBackgroundDrawable(null); final Button reset_filter_button = findViewById(R.id.reset_filter_button); final Button apply_filter_button = findViewById(R.id.apply_filter_button); apply_filter_button.setBackgroundColor(this.getResources().getColor(R.color.accent)); + nameContainsFilterdata.addTextChangedListener(new TextWatcher() { + + public void afterTextChanged(Editable s) { + + } + + public void beforeTextChanged(CharSequence s, int start, + int count, int after) { + } + + public void onTextChanged(CharSequence s, int start, + int before, int count) { + nameContainsFilter = s.toString(); + update_filter_fields(); + } + }); + + reset_filter_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { activityFilter = 0; dateFromFilter = 0; dateToFilter = 0; + nameContainsFilter = ""; filterKindSpinner.setSelection(0); update_filter_fields(); } @@ -119,10 +142,16 @@ public class ActivitySummariesFilter extends AbstractGBActivity { apply_filter_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + String text = nameContainsFilterdata.getText().toString(); + if (text != null && text.length() > 0) { + nameContainsFilter = text; + } + Intent intent = new Intent(); intent.putExtra("activityFilter", activityFilter); intent.putExtra("dateFromFilter", dateFromFilter); intent.putExtra("dateToFilter", dateToFilter); + intent.putExtra("nameContainsFilter", nameContainsFilter); setResult(1, intent); finish(); } @@ -167,6 +196,7 @@ public class ActivitySummariesFilter extends AbstractGBActivity { TextView filterDateFromDataView = findViewById(R.id.textViewFromData); TextView filterDateToDataView = findViewById(R.id.textViewToData); Button reset_filter_button = findViewById(R.id.reset_filter_button); + final EditText nameContainsFilterdata = findViewById(R.id.textViewNameData); if (dateFromFilter > 0) { filterDateFromDataView.setText(DateTimeUtils.formatDate(new Date(dateFromFilter))); @@ -187,8 +217,10 @@ public class ActivitySummariesFilter extends AbstractGBActivity { filterDateFromDataView.setBackgroundColor(BACKGROUND_COLOR); filterDateToDataView.setBackgroundColor(BACKGROUND_COLOR); } - - if (dateToFilter != 0 || dateFromFilter != 0 || activityFilter != 0) { + if (nameContainsFilter != null && !nameContainsFilter.equals(nameContainsFilterdata.getText().toString())) { + nameContainsFilterdata.setText(nameContainsFilter); + } + if (dateToFilter != 0 || dateFromFilter != 0 || activityFilter != 0 || nameContainsFilterdata.length() > 0) { reset_filter_button.setBackgroundColor(this.getResources().getColor(R.color.accent)); } else { @@ -220,6 +252,17 @@ public class ActivitySummariesFilter extends AbstractGBActivity { }, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show(); } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + // back button + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + public class CustomOnItemSelectedListener implements AdapterView.OnItemSelectedListener { public void onItemSelected(AdapterView parent, View view, int pos, long id) { @@ -234,15 +277,4 @@ public class ActivitySummariesFilter extends AbstractGBActivity { } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - // back button - finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummaryDetail.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummaryDetail.java index 588c1e137..a8193ab0d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummaryDetail.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummaryDetail.java @@ -18,11 +18,14 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.annotation.SuppressLint; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.graphics.Typeface; import android.os.Bundle; +import android.text.InputType; import android.util.TypedValue; import android.view.Gravity; import android.view.MenuItem; @@ -30,6 +33,7 @@ import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; +import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TableLayout; @@ -49,6 +53,7 @@ import java.util.Date; import java.util.Iterator; import java.util.concurrent.TimeUnit; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; @@ -62,7 +67,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.SwipeEvents; public class ActivitySummaryDetail extends AbstractGBActivity { private static final Logger LOG = LoggerFactory.getLogger(ActivitySummaryDetail.class); - + private GBDevice gbDevice; private boolean show_raw_data = false; BaseActivitySummary currentItem = null; @@ -73,15 +78,20 @@ public class ActivitySummaryDetail extends AbstractGBActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_summary_details); + final Context appContext = this.getApplicationContext(); + if (appContext instanceof GBApplication) { + setContentView(R.layout.activity_summary_details); + } + Intent intent = getIntent(); - GBDevice gbDevice = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE); + gbDevice = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE); final int filter = intent.getIntExtra("filter", 0); final int position = intent.getIntExtra("position", 0); final long dateFromFilter = intent.getLongExtra("dateFromFilter", 0); final long dateToFilter = intent.getLongExtra("dateToFilter", 0); + final String nameContainsFilter = intent.getStringExtra("nameContainsFilter"); - final ActivitySummaryItems items = new ActivitySummaryItems(this, gbDevice, filter, dateFromFilter, dateToFilter); + final ActivitySummaryItems items = new ActivitySummaryItems(this, gbDevice, filter, dateFromFilter, dateToFilter, nameContainsFilter); final LinearLayout layout = findViewById(R.id.activity_summary_detail_relative_layout); alternateColor = getAlternateColor(this); @@ -113,10 +123,11 @@ public class ActivitySummaryDetail extends AbstractGBActivity { makeSummaryContent(currentItem); layout.startAnimation(animFadeRight); - }else{ + } else { layout.startAnimation(animBounceRight); } } + @Override public void onSwipeLeft() { currentItem = items.getPrevItem(); @@ -124,7 +135,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity { makeSummaryHeader(currentItem); makeSummaryContent(currentItem); layout.startAnimation(animFadeLeft); - }else{ + } else { layout.startAnimation(animBounceLeft); } } @@ -141,7 +152,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity { ImageView activity_icon = findViewById(R.id.item_image); activity_icon.setOnLongClickListener(new View.OnLongClickListener() { public boolean onLongClick(View v) { - show_raw_data=!show_raw_data; + show_raw_data = !show_raw_data; if (currentItem != null) { makeSummaryHeader(currentItem); makeSummaryContent(currentItem); @@ -150,10 +161,45 @@ public class ActivitySummaryDetail extends AbstractGBActivity { } }); + ImageView activity_summary_detail_edit_name_image = findViewById(R.id.activity_summary_detail_edit_name); + activity_summary_detail_edit_name_image.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final EditText input = new EditText(ActivitySummaryDetail.this); + input.setInputType(InputType.TYPE_CLASS_TEXT); + String name = currentItem.getName(); + input.setText((name != null) ? name : ""); + + new AlertDialog.Builder(ActivitySummaryDetail.this) // TODO: very raw at this point, make better drawable layout, already started here: R.style.GadgetbridgeTheme_DialogTheme) + .setView(input) + .setCancelable(true) + .setTitle(ActivitySummaryDetail.this.getString(R.string.activity_summary_edit_name_title)) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + String name = input.getText().toString(); + currentItem.setName(name); + currentItem.update(); + makeSummaryHeader(currentItem); + makeSummaryContent(currentItem); + + } + }) + .setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // do nothing + } + }) + .show(); + } + }); + } - private void makeSummaryHeader(BaseActivitySummary item){ + private void makeSummaryHeader(BaseActivitySummary item) { //make view of data from main part of item final String gpxTrack = item.getGpxTrack(); Button show_track_btn = findViewById(R.id.showTrack); @@ -172,6 +218,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity { }); } String activitykindname = ActivityKind.asString(item.getActivityKind(), getApplicationContext()); + String activityname = item.getName(); Date starttime = item.getStartTime(); Date endtime = item.getEndTime(); String starttimeS = DateTimeUtils.formatDateTime(starttime); @@ -183,6 +230,10 @@ public class ActivitySummaryDetail extends AbstractGBActivity { TextView activity_kind = findViewById(R.id.activitykind); activity_kind.setText(activitykindname); + + TextView activity_name = findViewById(R.id.activityname); + activity_name.setText(activityname); + TextView start_time = findViewById(R.id.starttime); start_time.setText(starttimeS); TextView end_time = findViewById(R.id.endtime); @@ -239,7 +290,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity { unit = "km_h"; break; case "seconds_m": - value = value * (1000/60); + value = value * (1000 / 60); unit = "minutes_km"; break; case "seconds_km": @@ -277,8 +328,6 @@ public class ActivitySummaryDetail extends AbstractGBActivity { } - - public static int getAlternateColor(Context context) { TypedValue typedValue = new TypedValue(); Resources.Theme theme = context.getTheme(); @@ -289,10 +338,10 @@ public class ActivitySummaryDetail extends AbstractGBActivity { private String getStringResourceByName(String aString) { String packageName = getPackageName(); int resId = getResources().getIdentifier(aString, "string", packageName); - if (resId==0){ + if (resId == 0) { //LOG.warn("SportsActivity " + "Missing string in strings:" + aString); return aString; - }else{ + } else { return getString(resId); } } @@ -308,4 +357,5 @@ public class ActivitySummaryDetail extends AbstractGBActivity { return super.onOptionsItemSelected(item); } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AbstractItemAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AbstractItemAdapter.java index 4fc1b6342..3a4a2ec24 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AbstractItemAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AbstractItemAdapter.java @@ -71,6 +71,10 @@ public abstract class AbstractItemAdapter extends ArrayAdapter { this.setDateToFilter(date); } + public void setNameContainsFilter(String name){ + this.setNameContainsFilter(name); + } + @Override public View getView(int position, View view, ViewGroup parent) { T item = getItem(position); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java index 7dedab03d..f69897d32 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java @@ -40,13 +40,15 @@ public class ActivitySummariesAdapter extends AbstractItemAdapter 0) { + qb.where( + BaseActivitySummaryDao.Properties.Name.like("%" + nameContainsFilter + "%")); + } List allSummaries = qb.build().list(); setItems(allSummaries, true); @@ -91,18 +97,26 @@ public class ActivitySummariesAdapter extends AbstractItemAdapter 0) { - return name; + if (name == null) name=""; + String gpxTrack = item.getGpxTrack(); + String hasGps = " "; + if (gpxTrack != null) { + hasGps=" 🛰️ "; } + return ActivityKind.asString(item.getActivityKind(), getContext())+ hasGps + name; + } + + @Override + protected String getDetails(BaseActivitySummary item) { + Date startTime = item.getStartTime(); Long duration = (item.getEndTime().getTime() - item.getStartTime().getTime()); @@ -111,21 +125,9 @@ public class ActivitySummariesAdapter extends AbstractItemAdapter - + + + + + + + + + + + + + + + + + + Unknown activity Sport Activities Sport Activity Detail + Edit name Biking Treadmill Exercise @@ -982,8 +983,10 @@ To Reset Filter Filter + Name Apply Filter Statistics + Breaststroke Freestyle diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0153f73a3..affcab699 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -66,4 +66,20 @@ @drawable/splash + +