From 3babedf93618da6dcfb8bc347312edc0288c779c Mon Sep 17 00:00:00 2001 From: 0nse <0nse@users.noreply.github.com> Date: Mon, 29 Feb 2016 21:36:39 +0100 Subject: [PATCH 1/4] + Add Widget which allows quickly creating an alarm depending on the user's preferred sleep length (in hours). --- app/src/main/AndroidManifest.xml | 47 +++++--- .../gadgetbridge/SleepAlarmWidget.java | 112 ++++++++++++++++++ .../activities/SettingsActivity.java | 2 + .../charts/AbstractChartFragment.java | 2 - .../activities/charts/SleepChartFragment.java | 1 - .../charts/WeekStepsChartFragment.java | 1 - .../database/ActivityDatabaseHandler.java | 2 +- .../database/schema/ActivityDBUpdate_6.java | 5 - .../gadgetbridge/devices/miband/UserInfo.java | 4 +- .../externalevents/SMSReceiver.java | 2 - .../gadgetbridge/model/ActivityUser.java | 18 +++ .../service/DeviceSupportFactory.java | 3 - .../pebble/DatalogSessionHealthSleep.java | 1 - .../pebble/DatalogSessionHealthSteps.java | 2 - .../gadgetbridge/util/DeviceHelper.java | 1 - .../main/res/layout/sleep_alarm_widget.xml | 18 +++ app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-v14/dimens.xml | 10 ++ app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/xml/preferences.xml | 6 + .../main/res/xml/sleep_alarm_widget_info.xml | 9 ++ .../service/TestDeviceSupport.java | 1 - 23 files changed, 220 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java create mode 100644 app/src/main/res/layout/sleep_alarm_widget.xml create mode 100644 app/src/main/res/values-v14/dimens.xml create mode 100644 app/src/main/res/xml/sleep_alarm_widget_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b238d9869..49860022e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,7 +24,6 @@ - @@ -48,25 +47,26 @@ + android:parentActivityName=".activities.ControlCenter" /> + android:parentActivityName=".activities.SettingsActivity" /> + android:parentActivityName=".activities.ControlCenter" /> + android:parentActivityName=".activities.SettingsActivity" /> + @@ -87,7 +87,6 @@ - @@ -98,7 +97,6 @@ - @@ -109,7 +107,6 @@ - @@ -123,6 +120,7 @@ + @@ -142,7 +140,6 @@ - @@ -153,7 +150,6 @@ - @@ -164,7 +160,6 @@ - @@ -180,10 +175,11 @@ + + - + android:windowSoftInputMode="stateHidden" /> + android:parentActivityName=".activities.ControlCenter" /> @@ -236,16 +232,31 @@ + android:parentActivityName=".activities.ControlCenter" /> + android:parentActivityName=".activities.SettingsActivity" /> - + android:parentActivityName=".activities.ConfigureAlarms" /> + + + + + + + + + + + diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java new file mode 100644 index 000000000..cf950dd66 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java @@ -0,0 +1,112 @@ +package nodomain.freeyourgadget.gadgetbridge; + +import android.annotation.TargetApi; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.widget.RemoteViews; +import android.widget.Toast; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms; +import nodomain.freeyourgadget.gadgetbridge.impl.GBAlarm; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; +import nodomain.freeyourgadget.gadgetbridge.model.Alarm; + +/** + * Implementation of SleepAlarmWidget functionality. When pressing the widget, an alarm will be set + * to trigger after a predefined number of hours. A toast will confirm the user about this. The + * value is retrieved using ActivityUser.().getActivityUserSleepDuration(). + */ +public class SleepAlarmWidget extends AppWidgetProvider { + + /** + * This is our dedicated action to detect when the widget has been clicked. + */ + public static final String ACTION = + "nodomain.freeyourgadget.gadgetbridge.SLEEP_ALARM_WIDGET_CLICK"; + + static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, + int appWidgetId) { + + // Construct the RemoteViews object + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.sleep_alarm_widget); + + // Add our own click intent + Intent intent = new Intent(ACTION); + PendingIntent clickPI = PendingIntent.getBroadcast( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + views.setOnClickPendingIntent(R.id.sleepalarmwidget_text, clickPI); + + // Instruct the widget manager to update the widget + appWidgetManager.updateAppWidget(appWidgetId, views); + } + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // There may be multiple widgets active, so update all of them + for (int appWidgetId : appWidgetIds) { + updateAppWidget(context, appWidgetManager, appWidgetId); + } + } + + @Override + public void onEnabled(Context context) { + // Enter relevant functionality for when the first widget is created + } + + @Override + public void onDisabled(Context context) { + // Enter relevant functionality for when the last widget is disabled + } + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + if (ACTION.equals(intent.getAction())) { + int userSleepDuration = new ActivityUser().getActivityUserSleepDuration(); + // current timestamp + GregorianCalendar calendar = new GregorianCalendar(); + // add preferred sleep duration + calendar.add(Calendar.HOUR_OF_DAY, userSleepDuration); + + int hours = calendar.get(calendar.HOUR_OF_DAY); + int minutes = calendar.get(calendar.MINUTE); + + // overwrite the first alarm and activate it + GBAlarm alarm = new GBAlarm(0, true, true, Alarm.ALARM_ONCE, hours, minutes); + alarm.store(); + + setAlarmViaAlarmManager(context, calendar.getTimeInMillis()); + + Toast.makeText(context, + String.format(context.getString(R.string.appwidget_alarms_set), hours, minutes), + Toast.LENGTH_SHORT).show(); + } + } + + /** + * Use the Android alarm manager to create the alarm icon in the status bar. + * + * @param packageContext {@code Context}: A Context of the application package implementing this + * class. + * @param triggerTime {@code long}: time at which the underlying alarm is triggered in wall time + * milliseconds since the epoch + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void setAlarmViaAlarmManager(Context packageContext, long triggerTime) { + AlarmManager am = (AlarmManager) packageContext.getSystemService(Context.ALARM_SERVICE); + // TODO: launch the alarm configuration activity when clicking the alarm in the status bar + Intent intent = new Intent(packageContext, ConfigureAlarms.class); + PendingIntent pi = PendingIntent.getBroadcast(packageContext, 0, intent, + PendingIntent.FLAG_CANCEL_CURRENT); + am.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, pi), pi); + } +} + diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java index acf843044..596a5141b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java @@ -15,6 +15,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandPreferencesActi import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_GENDER; import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_HEIGHT_CM; +import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_SLEEP_DURATION; import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_WEIGHT_KG; import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_YEAR_OF_BIRTH; @@ -137,6 +138,7 @@ public class SettingsActivity extends AbstractSettingsActivity { PREF_USER_GENDER, PREF_USER_HEIGHT_CM, PREF_USER_WEIGHT_KG, + PREF_USER_SLEEP_DURATION, }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java index 886aa25ea..6ba3941f4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java @@ -12,7 +12,6 @@ import android.view.View; import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.charts.Chart; -import com.github.mikephil.charting.charts.CombinedChart; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarDataSet; @@ -29,7 +28,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashSet; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java index 17411ff6b..6b9a75619 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java @@ -8,7 +8,6 @@ import android.view.View; import android.view.ViewGroup; import com.github.mikephil.charting.animation.Easing; -import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.charts.Chart; import com.github.mikephil.charting.charts.CombinedChart; import com.github.mikephil.charting.charts.PieChart; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java index c3c565f78..927a499bf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java @@ -6,7 +6,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.charts.Chart; import com.github.mikephil.charting.charts.CombinedChart; import com.github.mikephil.charting.charts.PieChart; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java index 2df3759d6..c94327a70 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java @@ -22,12 +22,12 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; import nodomain.freeyourgadget.gadgetbridge.util.GB; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.DATABASE_NAME; +import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_CUSTOM_SHORT; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_INTENSITY; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_PROVIDER; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_STEPS; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_TIMESTAMP; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_TYPE; -import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_CUSTOM_SHORT; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.TABLE_GBACTIVITYSAMPLES; public class ActivityDatabaseHandler extends SQLiteOpenHelper implements DBHandler { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/ActivityDBUpdate_6.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/ActivityDBUpdate_6.java index c805e352b..483f556d3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/ActivityDBUpdate_6.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/ActivityDBUpdate_6.java @@ -2,15 +2,10 @@ package nodomain.freeyourgadget.gadgetbridge.database.schema; import android.database.sqlite.SQLiteDatabase; -import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.database.DBUpdateScript; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_CUSTOM_SHORT; -import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_PROVIDER; -import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_STEPS; -import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.KEY_TIMESTAMP; import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.TABLE_GBACTIVITYSAMPLES; -import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.TABLE_STEPS_PER_DAY; /** * Adds a column "customShort" to the table "GBActivitySamples" diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/UserInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/UserInfo.java index 9aa098bc8..5fa4be904 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/UserInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/UserInfo.java @@ -1,11 +1,11 @@ package nodomain.freeyourgadget.gadgetbridge.devices.miband; +import java.util.Arrays; + import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.DeviceInfo; import nodomain.freeyourgadget.gadgetbridge.util.CheckSums; -import java.util.Arrays; - public class UserInfo { private final String btAddress; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java index 664e44e9a..a2dd09a32 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java @@ -9,8 +9,6 @@ import android.os.PowerManager; import android.preference.PreferenceManager; import android.telephony.SmsMessage; -import java.util.ArrayList; - import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityUser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityUser.java index f2c87c499..3c58fc3a5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityUser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityUser.java @@ -16,17 +16,20 @@ public class ActivityUser { private Integer activityUserYearOfBirth; private Integer activityUserHeightCm; private Integer activityUserWeightKg; + private Integer activityUserSleepDuration; public static final int defaultUserGender = 0; public static final int defaultUserYearOfBirth = 0; public static final int defaultUserAge = 0; public static final int defaultUserHeightCm = 175; public static final int defaultUserWeightKg = 70; + public static final int defaultUserSleepDuration = 7; public static final String PREF_USER_YEAR_OF_BIRTH = "activity_user_year_of_birth"; public static final String PREF_USER_GENDER = "activity_user_gender"; public static final String PREF_USER_HEIGHT_CM = "activity_user_height_cm"; public static final String PREF_USER_WEIGHT_KG = "activity_user_weight_kg"; + public static final String PREF_USER_SLEEP_DURATION = "activity_user_sleep_duration"; public int getActivityUserWeightKg() { if(activityUserWeightKg == null) { @@ -56,6 +59,20 @@ public class ActivityUser { return activityUserHeightCm; } + /** + * @return the user defined sleep duration or the default value when none is set or the stored + * value is out of any logical bounds. + */ + public int getActivityUserSleepDuration() { + if(activityUserSleepDuration == null) { + fetchPreferences(); + } + if (activityUserSleepDuration < 1 || activityUserSleepDuration > 24) { + activityUserSleepDuration = defaultUserSleepDuration; + } + return activityUserSleepDuration; + } + public int getActivityUserAge() { int userYear = getActivityUserYearOfBirth(); int age = 25; @@ -74,5 +91,6 @@ public class ActivityUser { activityUserHeightCm = Integer.parseInt(prefs.getString(PREF_USER_HEIGHT_CM, Integer.toString(defaultUserHeightCm))); activityUserWeightKg = Integer.parseInt(prefs.getString(PREF_USER_WEIGHT_KG, Integer.toString(defaultUserWeightKg))); activityUserYearOfBirth = Integer.parseInt(prefs.getString(PREF_USER_YEAR_OF_BIRTH, Integer.toString(defaultUserYearOfBirth))); + activityUserSleepDuration = Integer.parseInt(prefs.getString(PREF_USER_SLEEP_DURATION, Integer.toString(defaultUserSleepDuration))); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java index 55765588d..6bc077896 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java @@ -1,7 +1,6 @@ package nodomain.freeyourgadget.gadgetbridge.service; import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; import android.content.Context; import android.widget.Toast; @@ -11,10 +10,8 @@ import java.util.EnumSet; import nodomain.freeyourgadget.gadgetbridge.GBException; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; -import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.MiBandSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.PebbleSupport; -import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.GB; public class DeviceSupportFactory { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java index a2ec192a4..8528287fd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java @@ -1,6 +1,5 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; -import android.database.sqlite.SQLiteDatabase; import android.widget.Toast; import org.slf4j.Logger; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java index 6ce8bd09c..5c68b15dd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java @@ -1,8 +1,6 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; -import android.database.sqlite.SQLiteDatabase; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java index ae7ee58ed..b3aad4b79 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java @@ -8,7 +8,6 @@ import android.preference.PreferenceManager; import android.widget.Toast; import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; diff --git a/app/src/main/res/layout/sleep_alarm_widget.xml b/app/src/main/res/layout/sleep_alarm_widget.xml new file mode 100644 index 000000000..b1b9c8c92 --- /dev/null +++ b/app/src/main/res/layout/sleep_alarm_widget.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8426034e8..757aa96c9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -200,4 +200,6 @@ Diese Firmware ist nicht mit dem Gerät kompatibel warte auf eingehende Verbindung Erneut installieren + Widget hinzufügen + Bevorzugte Schlafdauer in Stunden diff --git a/app/src/main/res/values-v14/dimens.xml b/app/src/main/res/values-v14/dimens.xml new file mode 100644 index 000000000..4db8c5906 --- /dev/null +++ b/app/src/main/res/values-v14/dimens.xml @@ -0,0 +1,10 @@ + + + + + 0dp + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 47c822467..fb6e23509 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,10 @@ 16dp 16dp + + + 8dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 149516920..eba0070c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,4 +225,9 @@ authenticating authentication required + Zzz + Add widget + Preferred sleep duration in hours + An alarm was set for %1$d:%2$d + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index cb2a8a6fb..60eb7c5fc 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -153,6 +153,12 @@ android:key="activity_user_weight_kg" android:maxLength="3" android:title="@string/activity_prefs_weight_kg" /> + + + \ No newline at end of file diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java index a3a8ff1f2..82932e230 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java @@ -10,7 +10,6 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.Alarm; -import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.ServiceCommand; From 6e7abecb17475877f952a8f4f197d4afe38b6506 Mon Sep 17 00:00:00 2001 From: 0nse <0nse@users.noreply.github.com> Date: Wed, 2 Mar 2016 00:01:41 +0100 Subject: [PATCH 2/4] / Use GB.toast instead of Android Toast. --- .../freeyourgadget/gadgetbridge/SleepAlarmWidget.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java index cf950dd66..3d5c2b9a8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java @@ -18,6 +18,7 @@ import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms; import nodomain.freeyourgadget.gadgetbridge.impl.GBAlarm; import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; import nodomain.freeyourgadget.gadgetbridge.model.Alarm; +import nodomain.freeyourgadget.gadgetbridge.util.GB; /** * Implementation of SleepAlarmWidget functionality. When pressing the widget, an alarm will be set @@ -85,9 +86,9 @@ public class SleepAlarmWidget extends AppWidgetProvider { setAlarmViaAlarmManager(context, calendar.getTimeInMillis()); - Toast.makeText(context, + GB.toast(context, String.format(context.getString(R.string.appwidget_alarms_set), hours, minutes), - Toast.LENGTH_SHORT).show(); + Toast.LENGTH_SHORT, GB.INFO); } } From 7651c080c2096f32b123cb4ecb51905bb4cedef2 Mon Sep 17 00:00:00 2001 From: 0nse <0nse@users.noreply.github.com> Date: Wed, 2 Mar 2016 00:05:58 +0100 Subject: [PATCH 3/4] / Only execute setAlarmViaAlarmManager when we are running Lollipop+. --- .../freeyourgadget/gadgetbridge/SleepAlarmWidget.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java index 3d5c2b9a8..e501de497 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java @@ -84,7 +84,9 @@ public class SleepAlarmWidget extends AppWidgetProvider { GBAlarm alarm = new GBAlarm(0, true, true, Alarm.ALARM_ONCE, hours, minutes); alarm.store(); - setAlarmViaAlarmManager(context, calendar.getTimeInMillis()); + if (GBApplication.isRunningLollipopOrLater()) { + setAlarmViaAlarmManager(context, calendar.getTimeInMillis()); + } GB.toast(context, String.format(context.getString(R.string.appwidget_alarms_set), hours, minutes), @@ -96,9 +98,9 @@ public class SleepAlarmWidget extends AppWidgetProvider { * Use the Android alarm manager to create the alarm icon in the status bar. * * @param packageContext {@code Context}: A Context of the application package implementing this - * class. - * @param triggerTime {@code long}: time at which the underlying alarm is triggered in wall time - * milliseconds since the epoch + * class. + * @param triggerTime {@code long}: time at which the underlying alarm is triggered in wall time + * milliseconds since the epoch */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void setAlarmViaAlarmManager(Context packageContext, long triggerTime) { From ba35679690c20c5ac098d13011f0cf9ed7130159 Mon Sep 17 00:00:00 2001 From: 0nse <0nse@users.noreply.github.com> Date: Wed, 2 Mar 2016 00:15:31 +0100 Subject: [PATCH 4/4] / Pad the alarm time with zeroes when toasting. --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eba0070c1..8ab859887 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -228,6 +228,6 @@ Zzz Add widget Preferred sleep duration in hours - An alarm was set for %1$d:%2$d + An alarm was set for %1$02d:%2$02d