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; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.XTimePreference; import nodomain.freeyourgadget.gadgetbridge.util.XTimePreferenceFragment; 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_DO_NOT_DISTURB; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_END; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_OFF; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_SCHEDULED; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_START; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DATEFORMAT; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_NIGHT_MODE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_NIGHT_MODE_END; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_NIGHT_MODE_OFF; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_NIGHT_MODE_SCHEDULED; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_NIGHT_MODE_START; 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) { 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_DO_NOT_DISTURB_OFF); boolean disconnectNotificationScheduled = disconnectNotificationState.equals(PREF_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_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; } }); } String nightModeState = prefs.getString(MiBandConst.PREF_NIGHT_MODE, PREF_NIGHT_MODE_OFF); boolean nightModeScheduled = nightModeState.equals(PREF_NIGHT_MODE_SCHEDULED); final Preference nightModeStart = findPreference(PREF_NIGHT_MODE_START); if (nightModeStart != null) { nightModeStart.setEnabled(nightModeScheduled); nightModeStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_NIGHT_MODE_START); } }); return true; } }); } final Preference nightModeEnd = findPreference(PREF_NIGHT_MODE_END); if (nightModeEnd != null) { nightModeEnd.setEnabled(nightModeScheduled); nightModeEnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_NIGHT_MODE_END); } }); return true; } }); } final Preference nightMode = findPreference(PREF_NIGHT_MODE); if (nightMode != null) { nightMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { final boolean scheduled = PREF_NIGHT_MODE_SCHEDULED.equals(newVal.toString()); nightModeStart.setEnabled(scheduled); nightModeEnd.setEnabled(scheduled); invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_NIGHT_MODE); } }); return true; } }); } String doNotDisturbState = prefs.getString(MiBandConst.PREF_DO_NOT_DISTURB, PREF_DO_NOT_DISTURB_OFF); boolean doNotDisturbScheduled = doNotDisturbState.equals(PREF_DO_NOT_DISTURB_SCHEDULED); final Preference doNotDisturbStart = findPreference(PREF_DO_NOT_DISTURB_START); if (doNotDisturbStart != null) { doNotDisturbStart.setEnabled(doNotDisturbScheduled); doNotDisturbStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_DO_NOT_DISTURB_START); } }); return true; } }); } final Preference doNotDisturbEnd = findPreference(PREF_DO_NOT_DISTURB_END); if (doNotDisturbEnd != null) { doNotDisturbEnd.setEnabled(doNotDisturbScheduled); doNotDisturbEnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_DO_NOT_DISTURB_END); } }); return true; } }); } final Preference doNotDisturb = findPreference(PREF_DO_NOT_DISTURB); if (doNotDisturb != null) { doNotDisturb.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { final boolean scheduled = PREF_DO_NOT_DISTURB_SCHEDULED.equals(newVal.toString()); doNotDisturbStart.setEnabled(scheduled); doNotDisturbEnd.setEnabled(scheduled); invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_DO_NOT_DISTURB); } }); 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; } }); } final Preference setDateFormat = findPreference(PREF_MI2_DATEFORMAT); if (setDateFormat != null) { setDateFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { invokeLater(new Runnable() { @Override public void run() { GBApplication.deviceService().onSendConfiguration(PREF_MI2_DATEFORMAT); } }); 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); } } }