diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java
index 1d5cf820c..9516b3f07 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java
@@ -590,7 +590,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(deviceCandidate);
GBDevice device = DeviceHelper.getInstance().toSupportedDevice(deviceCandidate);
- if (!coordinator.supportsDeviceSpecificSettings(device)) {
+ if (coordinator.getSupportedDeviceSpecificSettings(device) != null) {
return true;
}
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 5637ecf9f..059692102 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java
@@ -64,14 +64,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
-import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION;
-import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_END;
-import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_START;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DATEFORMAT;
-import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_OFF;
-import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_SCHEDULED;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_ENABLE_TEXT_NOTIFICATIONS;
-import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI3_BAND_SCREEN_UNLOCK;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI3_NIGHT_MODE;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI3_NIGHT_MODE_END;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI3_NIGHT_MODE_OFF;
@@ -385,20 +379,6 @@ public class SettingsActivity extends AbstractSettingsActivity {
}
});
- final Preference miBand3ScreenUnlock = findPreference(PREF_MI3_BAND_SCREEN_UNLOCK);
- miBand3ScreenUnlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newVal) {
- invokeLater(new Runnable() {
- @Override
- public void run() {
- GBApplication.deviceService().onSendConfiguration(PREF_MI3_BAND_SCREEN_UNLOCK);
- }
- });
- return true;
- }
- });
-
String nightModeState = prefs.getString(MiBandConst.PREF_MI3_NIGHT_MODE, PREF_MI3_NIGHT_MODE_OFF);
boolean nightModeScheduled = nightModeState.equals(PREF_MI3_NIGHT_MODE_SCHEDULED);
@@ -453,59 +433,6 @@ public class SettingsActivity extends AbstractSettingsActivity {
}
});
- String disconnectNotificationState = prefs.getString(PREF_DISCONNECT_NOTIFICATION, PREF_MI2_DO_NOT_DISTURB_OFF);
- boolean disconnectNotificationScheduled = disconnectNotificationState.equals(PREF_MI2_DO_NOT_DISTURB_SCHEDULED);
-
- final Preference disconnectNotificationStart = findPreference(PREF_DISCONNECT_NOTIFICATION_START);
- disconnectNotificationStart.setEnabled(disconnectNotificationScheduled);
- disconnectNotificationStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newVal) {
- invokeLater(new Runnable() {
- @Override
- public void run() {
- GBApplication.deviceService().onSendConfiguration(PREF_DISCONNECT_NOTIFICATION_START);
- }
- });
- return true;
- }
- });
-
-
- final Preference disconnectNotificationEnd = findPreference(PREF_DISCONNECT_NOTIFICATION_END);
- disconnectNotificationStart.setEnabled(disconnectNotificationScheduled);
- disconnectNotificationStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newVal) {
- invokeLater(new Runnable() {
- @Override
- public void run() {
- GBApplication.deviceService().onSendConfiguration(PREF_DISCONNECT_NOTIFICATION_END);
- }
- });
- return true;
- }
- });
-
-
- final Preference disconnectNotification = findPreference(PREF_DISCONNECT_NOTIFICATION);
- disconnectNotification.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newVal) {
- final boolean scheduled = PREF_MI2_DO_NOT_DISTURB_SCHEDULED.equals(newVal.toString());
-
- disconnectNotificationStart.setEnabled(scheduled);
- disconnectNotificationEnd.setEnabled(scheduled);
- invokeLater(new Runnable() {
- @Override
- public void run() {
- GBApplication.deviceService().onSendConfiguration(PREF_DISCONNECT_NOTIFICATION);
- }
- });
- return true;
- }
- });
-
// Get all receivers of Media Buttons
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java
index 9daa84068..8b2e2ca93 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsActivity.java
@@ -19,10 +19,10 @@ package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings;
import android.os.Bundle;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,31 +34,46 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
-public class DeviceSettingsActivity extends AbstractGBActivity {
+public class DeviceSettingsActivity extends AbstractGBActivity implements
+ PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
private static final Logger LOG = LoggerFactory.getLogger(DeviceSettingsActivity.class);
- private GBDevice device;
+ GBDevice device;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_settings);
+ if (savedInstanceState == null) {
+ Fragment fragment = getSupportFragmentManager().findFragmentByTag(DeviceSpecificSettingsFragment.FRAGMENT_TAG);
+ if (fragment == null) {
+ DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
+ fragment = DeviceSpecificSettingsFragment.newInstance(device.getAddress(), coordinator.getSupportedDeviceSpecificSettings(device));
+ }
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.settings_container, fragment, DeviceSpecificSettingsFragment.FRAGMENT_TAG)
+ .commit();
- DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
- PreferenceFragmentCompat fragment = coordinator.getDeviceSpecificSettingsFragment(device);
-
- getSupportFragmentManager()
- .beginTransaction()
- .replace(R.id.settings_container, fragment)
- .commit();
- }
-
-
- public class DoesNotExistSettingsFragment extends PreferenceFragmentCompat {
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
}
}
-}
+ @Override
+ public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen preferenceScreen) {
+ DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
+
+ PreferenceFragmentCompat fragment = DeviceSpecificSettingsFragment.newInstance(device.getAddress(), coordinator.getSupportedDeviceSpecificSettings(device));
+ Bundle args = fragment.getArguments();
+ args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
+ fragment.setArguments(args);
+
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.settings_container, fragment, preferenceScreen.getKey())
+ .addToBackStack(preferenceScreen.getKey())
+ .commit();
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java
index 1eed477a3..0e5c10e6e 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java
@@ -2,21 +2,193 @@ package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings;
import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.DialogFragment;
+import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
-abstract public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat {
+import nodomain.freeyourgadget.gadgetbridge.GBApplication;
+import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
+import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
+import nodomain.freeyourgadget.gadgetbridge.util.XTimePreference;
+import nodomain.freeyourgadget.gadgetbridge.util.XTimePreferenceFragment;
- public void setSettingsFileSuffix(String settingsFileSuffix) {
+import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION;
+import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_END;
+import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_START;
+import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_OFF;
+import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_SCHEDULED;
+import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_SWIPE_UNLOCK;
+
+public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat {
+
+ static final String FRAGMENT_TAG = "DEVICE_SPECIFIC_SETTINGS_FRAGMENT";
+
+ private void setSettingsFileSuffix(String settingsFileSuffix, @NonNull int[] supportedSettings) {
Bundle args = new Bundle();
args.putString("settingsFileSuffix", settingsFileSuffix);
+ args.putIntArray("supportedSettings", supportedSettings);
setArguments(args);
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- String settingsFileSuffix = getArguments().getString("settingsFileSuffix", "_bug");
+ Bundle arguments = getArguments();
+ if (arguments == null) {
+ return;
+ }
+ String settingsFileSuffix = arguments.getString("settingsFileSuffix", null);
+ int[] supportedSettings = arguments.getIntArray("supportedSettings");
+ if (settingsFileSuffix == null || supportedSettings == null) {
+ return;
+ }
+
getPreferenceManager().setSharedPreferencesName("devicesettings_" + settingsFileSuffix);
+
+ if (rootKey == null) {
+ // we are the main preference screen
+ boolean first = true;
+ for (int setting : supportedSettings) {
+ if (first) {
+ setPreferencesFromResource(setting, null);
+ first = false;
+ } else {
+ addPreferencesFromResource(setting);
+ }
+ }
+ } else {
+ // Now, this is ugly: search all the xml files for the rootKey
+ for (int setting : supportedSettings) {
+ try {
+ setPreferencesFromResource(setting, rootKey);
+ } catch (Exception ignore) {
+ continue;
+ }
+ break;
+ }
+ }
+ setChangeListener();
+ }
+
+ /*
+ * delayed execution so that the preferences are applied first
+ */
+ private void invokeLater(Runnable runnable) {
+ getListView().post(runnable);
+ }
+
+ private void setChangeListener() {
+ final Preference displayItems = findPreference("display_items");
+ if (displayItems != null) {
+ displayItems.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newVal) {
+ invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ GBApplication.deviceService().onSendConfiguration(HuamiConst.PREF_DISPLAY_ITEMS);
+ }
+ });
+ return true;
+ }
+ });
+ }
+
+ Prefs prefs = new Prefs(getPreferenceManager().getSharedPreferences());
+ String disconnectNotificationState = prefs.getString(PREF_DISCONNECT_NOTIFICATION, PREF_MI2_DO_NOT_DISTURB_OFF);
+ boolean disconnectNotificationScheduled = disconnectNotificationState.equals(PREF_MI2_DO_NOT_DISTURB_SCHEDULED);
+
+ final Preference disconnectNotificationStart = findPreference(PREF_DISCONNECT_NOTIFICATION_START);
+ if (disconnectNotificationStart != null) {
+ disconnectNotificationStart.setEnabled(disconnectNotificationScheduled);
+ disconnectNotificationStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newVal) {
+ invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ GBApplication.deviceService().onSendConfiguration(PREF_DISCONNECT_NOTIFICATION_START);
+ }
+ });
+ return true;
+ }
+ });
+ }
+
+ final Preference disconnectNotificationEnd = findPreference(PREF_DISCONNECT_NOTIFICATION_END);
+ if (disconnectNotificationEnd != null) {
+ disconnectNotificationEnd.setEnabled(disconnectNotificationScheduled);
+ disconnectNotificationEnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newVal) {
+ invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ GBApplication.deviceService().onSendConfiguration(PREF_DISCONNECT_NOTIFICATION_END);
+ }
+ });
+ return true;
+ }
+ });
+ }
+
+ final Preference disconnectNotification = findPreference(PREF_DISCONNECT_NOTIFICATION);
+ if (disconnectNotification != null) {
+ disconnectNotification.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newVal) {
+ final boolean scheduled = PREF_MI2_DO_NOT_DISTURB_SCHEDULED.equals(newVal.toString());
+
+ disconnectNotificationStart.setEnabled(scheduled);
+ disconnectNotificationEnd.setEnabled(scheduled);
+ invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ GBApplication.deviceService().onSendConfiguration(PREF_DISCONNECT_NOTIFICATION);
+ }
+ });
+ return true;
+ }
+ });
+
+ }
+ final Preference swipeUnlock = findPreference(PREF_SWIPE_UNLOCK);
+ if (swipeUnlock != null) {
+ swipeUnlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newVal) {
+ invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ GBApplication.deviceService().onSendConfiguration(PREF_SWIPE_UNLOCK);
+ }
+ });
+ return true;
+ }
+ });
+ }
+ }
+
+ static DeviceSpecificSettingsFragment newInstance(String settingsFileSuffix, @NonNull int[] supportedSettings) {
+ DeviceSpecificSettingsFragment fragment = new DeviceSpecificSettingsFragment();
+ fragment.setSettingsFileSuffix(settingsFileSuffix, supportedSettings);
+
+ return fragment;
+ }
+
+ @Override
+ public void onDisplayPreferenceDialog(Preference preference) {
+ DialogFragment dialogFragment = null;
+ if (preference instanceof XTimePreference) {
+ dialogFragment = new XTimePreferenceFragment();
+ Bundle bundle = new Bundle(1);
+ bundle.putString("key", preference.getKey());
+ dialogFragment.setArguments(bundle);
+ dialogFragment.setTargetFragment(this, 0);
+ dialogFragment.show(getFragmentManager(), "androidx.preference.PreferenceFragment.DIALOG");
+ } else {
+ super.onDisplayPreferenceDialog(preference);
+ }
}
}
-
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/AmazfitBipSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/AmazfitBipSettingsFragment.java
deleted file mode 100644
index 0151b7bb2..000000000
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/AmazfitBipSettingsFragment.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.huami;
-
-import android.os.Bundle;
-
-import nodomain.freeyourgadget.gadgetbridge.R;
-
-public class AmazfitBipSettingsFragment extends HuamiSettingsFragment {
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- super.onCreatePreferences(savedInstanceState, rootKey);
- addPreferencesFromResource(R.xml.devicesettings_huami_bip);
- setChangeListener();
- }
-
- public static HuamiSettingsFragment newInstance(String settingsFileSuffix) {
- HuamiSettingsFragment fragment = new AmazfitBipSettingsFragment();
- fragment.setSettingsFileSuffix(settingsFileSuffix);
-
- return fragment;
- }
-}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/AmazfitCorSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/AmazfitCorSettingsFragment.java
deleted file mode 100644
index ad3b145cc..000000000
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/AmazfitCorSettingsFragment.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.huami;
-
-import android.os.Bundle;
-
-import nodomain.freeyourgadget.gadgetbridge.R;
-
-public class AmazfitCorSettingsFragment extends HuamiSettingsFragment{
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- super.onCreatePreferences(savedInstanceState, rootKey);
- addPreferencesFromResource(R.xml.devicesettings_huami_cor);
- setChangeListener();
- }
-
- public static HuamiSettingsFragment newInstance(String settingsFileSuffix) {
- HuamiSettingsFragment fragment = new AmazfitCorSettingsFragment();
- fragment.setSettingsFileSuffix(settingsFileSuffix);
-
- return fragment;
- }
-}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/HuamiSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/HuamiSettingsFragment.java
deleted file mode 100644
index 26792da3a..000000000
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/HuamiSettingsFragment.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.huami;
-
-import android.os.Bundle;
-
-import androidx.preference.Preference;
-
-import nodomain.freeyourgadget.gadgetbridge.GBApplication;
-import nodomain.freeyourgadget.gadgetbridge.R;
-import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsFragment;
-import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
-
-public class HuamiSettingsFragment extends DeviceSpecificSettingsFragment {
-
- /*
- * delayed execution so that the preferences are applied first
- */
- private void invokeLater(Runnable runnable) {
- getListView().post(runnable);
- }
-
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- super.onCreatePreferences(savedInstanceState, rootKey);
- setPreferencesFromResource(R.xml.devicesettings_huami, rootKey);
- }
-
- public static HuamiSettingsFragment newInstance(String settingsFileSuffix) {
- HuamiSettingsFragment fragment = new HuamiSettingsFragment();
- fragment.setSettingsFileSuffix(settingsFileSuffix);
-
- return fragment;
- }
-
- void setChangeListener() {
- final Preference displayItems = findPreference("display_items");
- if (displayItems != null) {
- displayItems.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newVal) {
- invokeLater(new Runnable() {
- @Override
- public void run() {
- GBApplication.deviceService().onSendConfiguration(HuamiConst.PREF_DISPLAY_ITEMS);
- }
- });
- return true;
- }
- });
- }
- }
-}
-
-
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/MiBand2SettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/MiBand2SettingsFragment.java
deleted file mode 100644
index 941559d06..000000000
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/MiBand2SettingsFragment.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.huami;
-
-import android.os.Bundle;
-
-import nodomain.freeyourgadget.gadgetbridge.R;
-
-public class MiBand2SettingsFragment extends HuamiSettingsFragment {
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- super.onCreatePreferences(savedInstanceState, rootKey);
- addPreferencesFromResource(R.xml.devicesettings_huami_miband2);
- setChangeListener();
- }
-
- public static HuamiSettingsFragment newInstance(String settingsFileSuffix) {
- HuamiSettingsFragment fragment = new MiBand2SettingsFragment();
- fragment.setSettingsFileSuffix(settingsFileSuffix);
-
- return fragment;
- }
-}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/MiBand3SettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/MiBand3SettingsFragment.java
deleted file mode 100644
index ddef83cfb..000000000
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/huami/MiBand3SettingsFragment.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.huami;
-
-import android.os.Bundle;
-
-import nodomain.freeyourgadget.gadgetbridge.R;
-
-public class MiBand3SettingsFragment extends HuamiSettingsFragment {
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- super.onCreatePreferences(savedInstanceState, rootKey);
- addPreferencesFromResource(R.xml.devicesettings_huami_miband3);
- setChangeListener();
- }
-
- public static HuamiSettingsFragment newInstance(String settingsFileSuffix) {
- HuamiSettingsFragment fragment = new MiBand3SettingsFragment();
- fragment.setSettingsFileSuffix(settingsFileSuffix);
-
- return fragment;
- }
-}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java
index 5a7d8a989..f756d65cd 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java
@@ -152,7 +152,7 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter. */
+package nodomain.freeyourgadget.gadgetbridge.util;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+
+import androidx.preference.DialogPreference;
+
+public class XTimePreference extends DialogPreference {
+ protected int hour = 0;
+ protected int minute = 0;
+
+ public XTimePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected Object onGetDefaultValue(TypedArray a, int index) {
+ return a.getString(index);
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+ String time;
+
+ if (restoreValue) {
+ if (defaultValue == null) {
+ time = getPersistedString("00:00");
+ } else {
+ time = getPersistedString(defaultValue.toString());
+ }
+ } else {
+ if (defaultValue != null) {
+ time = defaultValue.toString();
+ } else {
+ time = "00:00";
+ }
+ }
+
+ String[] pieces = time.split(":");
+
+ hour = Integer.parseInt(pieces[0]);
+ minute = Integer.parseInt(pieces[1]);
+
+ updateSummary();
+ }
+
+ void updateSummary() {
+ if (DateFormat.is24HourFormat(getContext()))
+ setSummary(getTime24h());
+ else
+ setSummary(getTime12h());
+ }
+
+ String getTime24h() {
+ return String.format("%02d", hour) + ":" + String.format("%02d", minute);
+ }
+
+ private String getTime12h() {
+ String suffix = hour < 12 ? " AM" : " PM";
+ int h = hour > 12 ? hour - 12 : hour;
+
+ return h + ":" + String.format("%02d", minute) + suffix;
+ }
+
+ void persistStringValue(String value) {
+ persistString(value);
+ }
+}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/XTimePreferenceFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/XTimePreferenceFragment.java
new file mode 100644
index 000000000..1cfb0d35e
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/XTimePreferenceFragment.java
@@ -0,0 +1,71 @@
+/* Copyright (C) 2017-2019 Carsten Pfeiffer, José Rebelo
+
+ This file is part of Gadgetbridge.
+
+ Gadgetbridge is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Gadgetbridge 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see . */
+package nodomain.freeyourgadget.gadgetbridge.util;
+
+import android.content.Context;
+import android.text.format.DateFormat;
+import android.view.View;
+import android.widget.TimePicker;
+
+import androidx.preference.DialogPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceDialogFragmentCompat;
+
+public class XTimePreferenceFragment extends PreferenceDialogFragmentCompat implements DialogPreference.TargetFragment {
+ private TimePicker picker = null;
+
+ @Override
+ protected View onCreateDialogView(Context context) {
+ picker = new TimePicker(context);
+ picker.setIs24HourView(DateFormat.is24HourFormat(getContext()));
+ picker.setPadding(0, 50, 0, 50);
+
+ return picker;
+ }
+
+ @Override
+ protected void onBindDialogView(View v) {
+ super.onBindDialogView(v);
+ XTimePreference pref = (XTimePreference) getPreference();
+
+ picker.setCurrentHour(pref.hour);
+ picker.setCurrentMinute(pref.minute);
+ }
+
+ @Override
+ public void onDialogClosed(boolean positiveResult) {
+
+ if (positiveResult) {
+ XTimePreference pref = (XTimePreference) getPreference();
+
+ pref.hour = picker.getCurrentHour();
+ pref.minute = picker.getCurrentMinute();
+
+ String time = pref.getTime24h();
+ if (pref.callChangeListener(time)) {
+ pref.persistStringValue(time);
+ pref.updateSummary();
+ }
+ }
+ }
+
+
+ @Override
+ public Preference findPreference(CharSequence key) {
+ return getPreference();
+ }
+}
diff --git a/app/src/main/res/xml/devicesettings_huami_bip.xml b/app/src/main/res/xml/devicesettings_amazfitbip.xml
similarity index 100%
rename from app/src/main/res/xml/devicesettings_huami_bip.xml
rename to app/src/main/res/xml/devicesettings_amazfitbip.xml
diff --git a/app/src/main/res/xml/devicesettings_huami_cor.xml b/app/src/main/res/xml/devicesettings_amazfitcor.xml
similarity index 100%
rename from app/src/main/res/xml/devicesettings_huami_cor.xml
rename to app/src/main/res/xml/devicesettings_amazfitcor.xml
diff --git a/app/src/main/res/xml/devicesettings_disconnectnotification.xml b/app/src/main/res/xml/devicesettings_disconnectnotification.xml
new file mode 100644
index 000000000..c198e9ca9
--- /dev/null
+++ b/app/src/main/res/xml/devicesettings_disconnectnotification.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/devicesettings_huami_miband2.xml b/app/src/main/res/xml/devicesettings_miband2.xml
similarity index 100%
rename from app/src/main/res/xml/devicesettings_huami_miband2.xml
rename to app/src/main/res/xml/devicesettings_miband2.xml
diff --git a/app/src/main/res/xml/devicesettings_huami_miband3.xml b/app/src/main/res/xml/devicesettings_miband3.xml
similarity index 100%
rename from app/src/main/res/xml/devicesettings_huami_miband3.xml
rename to app/src/main/res/xml/devicesettings_miband3.xml
diff --git a/app/src/main/res/xml/devicesettings_huami.xml b/app/src/main/res/xml/devicesettings_pairingkey.xml
similarity index 100%
rename from app/src/main/res/xml/devicesettings_huami.xml
rename to app/src/main/res/xml/devicesettings_pairingkey.xml
diff --git a/app/src/main/res/xml/devicesettings_swipeunlock.xml b/app/src/main/res/xml/devicesettings_swipeunlock.xml
new file mode 100644
index 000000000..22f35cf81
--- /dev/null
+++ b/app/src/main/res/xml/devicesettings_swipeunlock.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index e96ec11b5..87c390ef5 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -293,12 +293,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-