From 6eeb5f962f7187d6b55464978d89b5ebf4d27fbd Mon Sep 17 00:00:00 2001 From: OliE Date: Sat, 4 Mar 2017 13:41:08 +0100 Subject: [PATCH] refactored app settings to support preference headers. add a customizable weight reminder --- android_app/app/src/main/AndroidManifest.xml | 11 +- .../openscale/gui/ReminderBootReceiver.java | 72 ++++++ .../openscale/gui/SettingsActivity.java | 159 +----------- .../gui/preferences/BluetoothPreferences.java | 103 ++++++++ .../gui/preferences/GraphPreferences.java | 30 +++ .../preferences/MeasurementPreferences.java | 30 +++ .../gui/preferences/ReminderPreferences.java | 230 ++++++++++++++++++ .../gui/preferences/TimePreferenceDialog.java | 116 +++++++++ .../gui/preferences/UsersPreferences.java | 121 +++++++++ .../app/src/main/res/values-de/strings.xml | 6 + .../app/src/main/res/values-ja/strings.xml | 6 + .../app/src/main/res/values/strings.xml | 7 + .../{btdevtypes.xml => type_btdevices.xml} | 4 +- .../app/src/main/res/values/type_weekdays.xml | 24 ++ .../main/res/xml/bluetooth_preferences.xml | 7 + .../src/main/res/xml/graph_preferences.xml | 4 + .../src/main/res/xml/header_preferences.xml | 18 ++ .../main/res/xml/measurement_preferences.xml | 8 + .../app/src/main/res/xml/preferences.xml | 26 -- .../src/main/res/xml/reminder_preferences.xml | 27 ++ .../src/main/res/xml/users_preferences.xml | 4 + 21 files changed, 835 insertions(+), 178 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/ReminderBootReceiver.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/GraphPreferences.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/ReminderPreferences.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/TimePreferenceDialog.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java rename android_app/app/src/main/res/values/{btdevtypes.xml => type_btdevices.xml} (78%) create mode 100644 android_app/app/src/main/res/values/type_weekdays.xml create mode 100644 android_app/app/src/main/res/xml/bluetooth_preferences.xml create mode 100644 android_app/app/src/main/res/xml/graph_preferences.xml create mode 100644 android_app/app/src/main/res/xml/header_preferences.xml create mode 100644 android_app/app/src/main/res/xml/measurement_preferences.xml delete mode 100644 android_app/app/src/main/res/xml/preferences.xml create mode 100644 android_app/app/src/main/res/xml/reminder_preferences.xml create mode 100644 android_app/app/src/main/res/xml/users_preferences.xml diff --git a/android_app/app/src/main/AndroidManifest.xml b/android_app/app/src/main/AndroidManifest.xml index 4a721b13..c19207b5 100644 --- a/android_app/app/src/main/AndroidManifest.xml +++ b/android_app/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -17,7 +18,7 @@ android:label="@string/app_name" android:theme="@style/AppTheme" > @@ -25,9 +26,15 @@ - + + + + + + + diff --git a/android_app/app/src/main/java/com/health/openscale/gui/ReminderBootReceiver.java b/android_app/app/src/main/java/com/health/openscale/gui/ReminderBootReceiver.java new file mode 100644 index 00000000..f71b1c8e --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/ReminderBootReceiver.java @@ -0,0 +1,72 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ + +package com.health.openscale.gui; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.support.v4.app.NotificationCompat; + +import com.health.openscale.R; +import com.health.openscale.gui.preferences.ReminderPreferences; + +import static android.content.Context.NOTIFICATION_SERVICE; + +public class ReminderBootReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + if (intent.hasExtra("alarmIntent")) { + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + String notifyText = prefs.getString("reminderNotifyText", context.getResources().getString(R.string.default_value_reminder_notify_text)); + + NotificationCompat.Builder mBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_launcher) + .setContentTitle("openScale") + .setContentText(notifyText) + .setAutoCancel(true); + + Intent notifyIntent = new Intent(context, MainActivity.class); + + PendingIntent notifyPendingIntent = + PendingIntent.getActivity( + context, + 0, + notifyIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + + mBuilder.setContentIntent(notifyPendingIntent); + + NotificationManager mNotifyMgr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); + mNotifyMgr.notify(0x01, mBuilder.build()); + } + + if (intent.getAction() != null) { + if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { + ReminderPreferences.scheduleAlarms(context); + } + } + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java index 314a08ab..ccb75b72 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java @@ -15,165 +15,28 @@ */ package com.health.openscale.gui; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.os.Bundle; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.MultiSelectListPreference; -import android.preference.Preference; import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.preference.PreferenceGroup; -import android.preference.PreferenceManager; import com.health.openscale.R; -import com.health.openscale.core.OpenScale; -import com.health.openscale.core.ScaleUser; import java.util.ArrayList; +import java.util.List; -public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { +public class SettingsActivity extends PreferenceActivity { + private static List fragments = new ArrayList(); -@Override -protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.preferences); - initSummary(getPreferenceScreen()); - - updateUserPreferences(); -} - - - private void updateUserPreferences() - { - PreferenceCategory usersCategory = (PreferenceCategory)findPreference("catUsers"); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - int selectedUserId = prefs.getInt("selectedUserId", -1); - - usersCategory.removeAll(); - - OpenScale openScale = OpenScale.getInstance(this); - - ArrayList scaleUserList = openScale.getScaleUserList(); - - for (ScaleUser scaleUser : scaleUserList) - { - Preference prefUser = new Preference(this); - prefUser.setOnPreferenceClickListener(new onClickListenerUserSelect()); - - if (scaleUser.id == selectedUserId) { - prefUser.setTitle("> " + scaleUser.user_name); - } else - { - prefUser.setTitle(scaleUser.user_name); - } - - prefUser.setKey(Integer.toString(scaleUser.id)); - - usersCategory.addPreference(prefUser); - } - - - Preference prefAddUser = new Preference(this); - - prefAddUser.setOnPreferenceClickListener(new onClickListenerAddUser()); - prefAddUser.setTitle("+ " + getResources().getString(R.string.label_add_user)); - - usersCategory.addPreference(prefAddUser); - } - -@Override -protected void onResume() { - super.onResume(); - // Set up a listener whenever a key changes - getPreferenceScreen().getSharedPreferences() - .registerOnSharedPreferenceChangeListener(this); -} - -@Override -protected void onPause() { - super.onPause(); - // Unregister the listener whenever a key changes - getPreferenceScreen().getSharedPreferences() - .unregisterOnSharedPreferenceChangeListener(this); -} - -@Override -public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - updatePrefSummary(findPreference(key)); -} - -private void initSummary(Preference p) { - if (p instanceof PreferenceGroup) { - PreferenceGroup pGrp = (PreferenceGroup) p; - for (int i = 0; i < pGrp.getPreferenceCount(); i++) { - initSummary(pGrp.getPreference(i)); - } - } else { - updatePrefSummary(p); - } -} - -private void updatePrefSummary(Preference p) { - if (p instanceof ListPreference) { - ListPreference listPref = (ListPreference) p; - p.setSummary(listPref.getEntry()); - } - if (p instanceof EditTextPreference) { - EditTextPreference editTextPref = (EditTextPreference) p; - if (p.getTitle().toString().contains("assword")) - { - p.setSummary("******"); - } else { - p.setSummary(editTextPref.getText()); - } - } - if (p instanceof MultiSelectListPreference) { - EditTextPreference editTextPref = (EditTextPreference) p; - p.setSummary(editTextPref.getText()); - } -} @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - if (requestCode == UserSettingsActivity.ADD_USER_REQUEST) { - if(resultCode == RESULT_OK){ - updateUserPreferences(); - } - } + public void onBuildHeaders(List
target) { + loadHeadersFromResource(R.xml.header_preferences, target); - - if (requestCode == UserSettingsActivity.EDIT_USER_REQUEST) { - if(resultCode == RESULT_OK){ - updateUserPreferences(); - } + fragments.clear(); + for (Header header : target) { + fragments.add(header.fragment); } } - private class onClickListenerUserSelect implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(preference.getContext(), UserSettingsActivity.class); - intent.putExtra("mode", UserSettingsActivity.EDIT_USER_REQUEST); - intent.putExtra("id", Integer.parseInt(preference.getKey())); - startActivityForResult(intent, UserSettingsActivity.EDIT_USER_REQUEST); - - return false; - } + @Override + protected boolean isValidFragment (String fragmentName) { + return fragments.contains(fragmentName); } - - private class onClickListenerAddUser implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(preference.getContext(), UserSettingsActivity.class); - intent.putExtra("mode", UserSettingsActivity.ADD_USER_REQUEST); - startActivityForResult(intent, UserSettingsActivity.ADD_USER_REQUEST); - - return false; - } - } - } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java new file mode 100644 index 00000000..70ad8635 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java @@ -0,0 +1,103 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.EditTextPreference; +import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceGroup; + +import com.health.openscale.R; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class BluetoothPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.bluetooth_preferences); + + initSummary(getPreferenceScreen()); + } + + private void initSummary(Preference p) { + if (p instanceof PreferenceGroup) { + PreferenceGroup pGrp = (PreferenceGroup) p; + for (int i = 0; i < pGrp.getPreferenceCount(); i++) { + initSummary(pGrp.getPreference(i)); + } + } else { + updatePrefSummary(p); + } + } + + @Override + public void onResume() { + super.onResume(); + getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + + } + + @Override + public void onPause() { + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + updatePrefSummary(findPreference(key)); + } + + private void updatePrefSummary(Preference p) { + if (p instanceof ListPreference) { + ListPreference listPref = (ListPreference) p; + p.setSummary(listPref.getEntry()); + } + + if (p instanceof EditTextPreference) { + EditTextPreference editTextPref = (EditTextPreference) p; + if (p.getTitle().toString().contains("assword")) + { + p.setSummary("******"); + } else { + p.setSummary(editTextPref.getText()); + } + } + + if (p instanceof MultiSelectListPreference) { + MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p; + + CharSequence[] entries = editMultiListPref.getEntries(); + CharSequence[] entryValues = editMultiListPref.getEntryValues(); + List currentEntries = new ArrayList<>(); + Set currentEntryValues = editMultiListPref.getValues(); + + for (int i = 0; i < entries.length; i++) + if (currentEntryValues.contains(entryValues[i])) + currentEntries.add(entries[i].toString()); + + p.setSummary(currentEntries.toString()); + } + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/GraphPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/GraphPreferences.java new file mode 100644 index 00000000..e65473ee --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/GraphPreferences.java @@ -0,0 +1,30 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.os.Bundle; +import android.preference.PreferenceFragment; + +import com.health.openscale.R; + +public class GraphPreferences extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.graph_preferences); + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java new file mode 100644 index 00000000..667a6969 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java @@ -0,0 +1,30 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.os.Bundle; +import android.preference.PreferenceFragment; + +import com.health.openscale.R; + +public class MeasurementPreferences extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.measurement_preferences); + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/ReminderPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/ReminderPreferences.java new file mode 100644 index 00000000..0f1ea751 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/ReminderPreferences.java @@ -0,0 +1,230 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; +import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceGroup; +import android.preference.PreferenceManager; + +import com.health.openscale.R; +import com.health.openscale.gui.ReminderBootReceiver; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +public class ReminderPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + + private CheckBoxPreference reminderEnable; + private MultiSelectListPreference reminderWeekdays; + private TimePreferenceDialog reminderTime; + private EditTextPreference reminderNotifyText; + + private static ArrayList pendingAlarms = new ArrayList<>(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.reminder_preferences); + + reminderEnable = (CheckBoxPreference)findPreference("reminderEnable"); + reminderWeekdays = (MultiSelectListPreference)findPreference("reminderWeekdays"); + reminderTime = (TimePreferenceDialog)findPreference("reminderTime"); + reminderNotifyText = (EditTextPreference)findPreference("reminderNotifyText"); + + updateAlarmPreferences(); + initSummary(getPreferenceScreen()); + } + + private void initSummary(Preference p) { + if (p instanceof PreferenceGroup) { + PreferenceGroup pGrp = (PreferenceGroup) p; + for (int i = 0; i < pGrp.getPreferenceCount(); i++) { + initSummary(pGrp.getPreference(i)); + } + } else { + updatePrefSummary(p); + } + } + + @Override + public void onResume() { + super.onResume(); + getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + + } + + @Override + public void onPause() { + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + updatePrefSummary(findPreference(key)); + updateAlarmPreferences(); + } + + public void updateAlarmPreferences() { + ComponentName receiver = new ComponentName(getActivity().getApplicationContext(), ReminderBootReceiver.class); + PackageManager pm = getActivity().getApplicationContext().getPackageManager(); + + if (reminderEnable.isChecked()) { + scheduleAlarms(getActivity()); + + pm.setComponentEnabledSetting(receiver, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP); + + reminderWeekdays.setEnabled(true); + reminderTime.setEnabled(true); + reminderNotifyText.setEnabled(true); + } else { + disableAllAlarms(getActivity()); + + pm.setComponentEnabledSetting(receiver, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP); + + reminderWeekdays.setEnabled(false); + reminderTime.setEnabled(false); + reminderNotifyText.setEnabled(false); + } + } + + private void updatePrefSummary(Preference p) { + if (p instanceof ListPreference) { + ListPreference listPref = (ListPreference) p; + p.setSummary(listPref.getEntry()); + } + + if (p instanceof EditTextPreference) { + EditTextPreference editTextPref = (EditTextPreference) p; + if (p.getTitle().toString().contains("assword")) + { + p.setSummary("******"); + } else { + p.setSummary(editTextPref.getText()); + } + } + + if (p instanceof MultiSelectListPreference) { + MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p; + + CharSequence[] entries = editMultiListPref.getEntries(); + CharSequence[] entryValues = editMultiListPref.getEntryValues(); + List currentEntries = new ArrayList<>(); + Set currentEntryValues = editMultiListPref.getValues(); + + for (int i = 0; i < entries.length; i++) + if (currentEntryValues.contains(entryValues[i])) + currentEntries.add(entries[i].toString()); + + p.setSummary(currentEntries.toString()); + } + } + + public static void scheduleAlarms(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + Set reminderWeekdays = prefs.getStringSet("reminderWeekdays", new HashSet()); + Long reminderTimeInMillis = prefs.getLong("reminderTime", System.currentTimeMillis()); + + Iterator iterWeekdays = reminderWeekdays.iterator(); + + disableAllAlarms(context); + + while (iterWeekdays.hasNext()) { + String strWeekdays = iterWeekdays.next().toString(); + + switch (Integer.parseInt(strWeekdays)){ + case 0: + pendingAlarms.add(enableAlarm(context, Calendar.MONDAY, reminderTimeInMillis)); + break; + case 1: + pendingAlarms.add(enableAlarm(context, Calendar.TUESDAY, reminderTimeInMillis)); + break; + case 2: + pendingAlarms.add(enableAlarm(context, Calendar.WEDNESDAY, reminderTimeInMillis)); + break; + case 3: + pendingAlarms.add(enableAlarm(context, Calendar.THURSDAY, reminderTimeInMillis)); + break; + case 4: + pendingAlarms.add(enableAlarm(context, Calendar.FRIDAY, reminderTimeInMillis)); + break; + case 5: + pendingAlarms.add(enableAlarm(context, Calendar.SATURDAY, reminderTimeInMillis)); + break; + case 6: + pendingAlarms.add(enableAlarm(context, Calendar.SUNDAY, reminderTimeInMillis)); + break; + } + } + + } + + public static PendingIntent enableAlarm(Context context, int dayOfWeek, long timeInMillis) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); + + // Check we aren't setting it in the past which would trigger it to fire instantly + if(calendar.getTimeInMillis() < System.currentTimeMillis()) { + calendar.add(Calendar.DAY_OF_YEAR, 7); + } + + AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + + Intent alarmIntent = new Intent(context, ReminderBootReceiver.class); + alarmIntent.putExtra("alarmIntent", true); + + PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, + AlarmManager.INTERVAL_DAY * 7, alarmPendingIntent); + + return alarmPendingIntent; + } + + public static void disableAllAlarms(Context context) { + AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + + for (int i=0; i +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.content.Context; +import android.content.res.TypedArray; +import android.preference.DialogPreference; +import android.text.format.DateFormat; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TimePicker; + +import com.health.openscale.R; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class TimePreferenceDialog extends DialogPreference { + private Calendar calendar; + private TimePicker picker = null; + + public TimePreferenceDialog(Context ctxt) { + this(ctxt, null); + } + + public TimePreferenceDialog(Context ctxt, AttributeSet attrs) { + this(ctxt, attrs, android.R.attr.dialogPreferenceStyle); + } + + public TimePreferenceDialog(Context ctxt, AttributeSet attrs, int defStyle) { + super(ctxt, attrs, defStyle); + + setPositiveButtonText(R.string.label_ok); + setNegativeButtonText(R.string.label_cancel); + calendar = new GregorianCalendar(); + } + + @Override + protected View onCreateDialogView() { + picker = new TimePicker(getContext()); + return (picker); + } + + @Override + protected void onBindDialogView(View v) { + super.onBindDialogView(v); + picker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); + picker.setCurrentMinute(calendar.get(Calendar.MINUTE)); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + + if (positiveResult) { + calendar.set(Calendar.HOUR_OF_DAY, picker.getCurrentHour()); + calendar.set(Calendar.MINUTE, picker.getCurrentMinute()); + + setSummary(getSummary()); + if (callChangeListener(calendar.getTimeInMillis())) { + persistLong(calendar.getTimeInMillis()); + notifyChanged(); + } + } + } + + @Override + protected Object onGetDefaultValue(TypedArray a, int index) { + return (a.getString(index)); + } + + @Override + protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { + + if (restoreValue) { + if (defaultValue == null) { + calendar.setTimeInMillis(getPersistedLong(System.currentTimeMillis())); + } else { + calendar.setTimeInMillis(Long.parseLong(getPersistedString((String) defaultValue))); + } + } else { + if (defaultValue == null) { + calendar.setTimeInMillis(System.currentTimeMillis()); + } else { + calendar.setTimeInMillis(Long.parseLong((String) defaultValue)); + } + } + setSummary(getSummary()); + } + + @Override + public CharSequence getSummary() { + if (calendar == null) { + return null; + } + return DateFormat.getTimeFormat(getContext()).format(new Date(calendar.getTimeInMillis())); + } + + public long getTimeInMillis() { + return calendar.getTimeInMillis(); + } +} \ No newline at end of file diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java new file mode 100644 index 00000000..a6b99a63 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java @@ -0,0 +1,121 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; + +import com.health.openscale.R; +import com.health.openscale.core.OpenScale; +import com.health.openscale.core.ScaleUser; +import com.health.openscale.gui.UserSettingsActivity; + +import java.util.ArrayList; + +import static android.app.Activity.RESULT_OK; + +public class UsersPreferences extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.users_preferences); + + updateUserPreferences(); + } + + private void updateUserPreferences() + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); + int selectedUserId = prefs.getInt("selectedUserId", -1); + + getPreferenceScreen().removeAll(); + + OpenScale openScale = OpenScale.getInstance(getActivity().getApplicationContext()); + + ArrayList scaleUserList = openScale.getScaleUserList(); + + for (ScaleUser scaleUser : scaleUserList) + { + Preference prefUser = new Preference(getActivity().getBaseContext()); + prefUser.setOnPreferenceClickListener(new onClickListenerUserSelect()); + + if (scaleUser.id == selectedUserId) { + prefUser.setTitle("> " + scaleUser.user_name); + } else + { + prefUser.setTitle(scaleUser.user_name); + } + + prefUser.setKey(Integer.toString(scaleUser.id)); + + getPreferenceScreen().addPreference(prefUser); + } + + + Preference prefAddUser = new Preference(getActivity().getBaseContext()); + + prefAddUser.setOnPreferenceClickListener(new onClickListenerAddUser()); + prefAddUser.setTitle("+ " + getResources().getString(R.string.label_add_user)); + + getPreferenceScreen().addPreference(prefAddUser); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) + { + if (requestCode == UserSettingsActivity.ADD_USER_REQUEST) { + if(resultCode == RESULT_OK){ + updateUserPreferences(); + } + } + + + if (requestCode == UserSettingsActivity.EDIT_USER_REQUEST) { + if(resultCode == RESULT_OK){ + updateUserPreferences(); + } + } + } + + private class onClickListenerUserSelect implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent intent = new Intent(preference.getContext(), UserSettingsActivity.class); + intent.putExtra("mode", UserSettingsActivity.EDIT_USER_REQUEST); + intent.putExtra("id", Integer.parseInt(preference.getKey())); + startActivityForResult(intent, UserSettingsActivity.EDIT_USER_REQUEST); + + return false; + } + } + + private class onClickListenerAddUser implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent intent = new Intent(preference.getContext(), UserSettingsActivity.class); + intent.putExtra("mode", UserSettingsActivity.ADD_USER_REQUEST); + startActivityForResult(intent, UserSettingsActivity.ADD_USER_REQUEST); + + return false; + } + } + +} diff --git a/android_app/app/src/main/res/values-de/strings.xml b/android_app/app/src/main/res/values-de/strings.xml index b6c12f8c..682682f6 100644 --- a/android_app/app/src/main/res/values-de/strings.xml +++ b/android_app/app/src/main/res/values-de/strings.xml @@ -105,4 +105,10 @@ Gerätetyp Initializiere Bluetooth Gerät Intelligente Benutzer Zuweisung + Zeit zum Wiegen + Erinnerung + Benachrichtigungstext + Zeit + Wochentage + Messwerte \ No newline at end of file diff --git a/android_app/app/src/main/res/values-ja/strings.xml b/android_app/app/src/main/res/values-ja/strings.xml index 63089b1c..cb6101e9 100644 --- a/android_app/app/src/main/res/values-ja/strings.xml +++ b/android_app/app/src/main/res/values-ja/strings.xml @@ -105,4 +105,10 @@ デバイスタイプ Bluetooth接続を初期化する スマートユーザーのアサイン + 重量までの時間 + リマインダー + 通知テキスト + 時刻 + 平日 + 観測 \ No newline at end of file diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index b974de7d..05e38107 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ Table Users Data + Measurements Settings Bluetooth Status @@ -114,6 +115,12 @@ Label on data point + Reminder + Weekdays + Time + Notification text + Time to weight + Your weight was Your body fat was Your water percentage was diff --git a/android_app/app/src/main/res/values/btdevtypes.xml b/android_app/app/src/main/res/values/type_btdevices.xml similarity index 78% rename from android_app/app/src/main/res/values/btdevtypes.xml rename to android_app/app/src/main/res/values/type_btdevices.xml index 12669b1d..bf08b649 100644 --- a/android_app/app/src/main/res/values/btdevtypes.xml +++ b/android_app/app/src/main/res/values/type_btdevices.xml @@ -1,11 +1,11 @@ - + Xiaomi Mi Scale openScale Custom Scale - + 0 1 diff --git a/android_app/app/src/main/res/values/type_weekdays.xml b/android_app/app/src/main/res/values/type_weekdays.xml new file mode 100644 index 00000000..68aecbf4 --- /dev/null +++ b/android_app/app/src/main/res/values/type_weekdays.xml @@ -0,0 +1,24 @@ + + + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/bluetooth_preferences.xml b/android_app/app/src/main/res/xml/bluetooth_preferences.xml new file mode 100644 index 00000000..4af0b824 --- /dev/null +++ b/android_app/app/src/main/res/xml/bluetooth_preferences.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/graph_preferences.xml b/android_app/app/src/main/res/xml/graph_preferences.xml new file mode 100644 index 00000000..f4ad80bb --- /dev/null +++ b/android_app/app/src/main/res/xml/graph_preferences.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/header_preferences.xml b/android_app/app/src/main/res/xml/header_preferences.xml new file mode 100644 index 00000000..9a8258ef --- /dev/null +++ b/android_app/app/src/main/res/xml/header_preferences.xml @@ -0,0 +1,18 @@ + + +
+
+
+
+
+ \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/measurement_preferences.xml b/android_app/app/src/main/res/xml/measurement_preferences.xml new file mode 100644 index 00000000..08ab0487 --- /dev/null +++ b/android_app/app/src/main/res/xml/measurement_preferences.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/preferences.xml b/android_app/app/src/main/res/xml/preferences.xml deleted file mode 100644 index c49dc5d8..00000000 --- a/android_app/app/src/main/res/xml/preferences.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android_app/app/src/main/res/xml/reminder_preferences.xml b/android_app/app/src/main/res/xml/reminder_preferences.xml new file mode 100644 index 00000000..0da86328 --- /dev/null +++ b/android_app/app/src/main/res/xml/reminder_preferences.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/users_preferences.xml b/android_app/app/src/main/res/xml/users_preferences.xml new file mode 100644 index 00000000..624ed13a --- /dev/null +++ b/android_app/app/src/main/res/xml/users_preferences.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file