diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index 78ff2326d..cb43bd095 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -330,6 +330,16 @@ public class GBApplication extends Application { return deviceService; } + /** + * Returns the facade for talking to a specific device. Devices are managed by + * an Android Service and this facade provides access to its functionality. + * + * @return the facade for talking to the service/device. + */ + public static DeviceService deviceService(GBDevice device) { + return deviceService.forDevice(device); + } + /** * Returns the DBHandler instance for reading/writing or throws GBException * when that was not successful diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java index c74d3adc7..106ec169d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java @@ -129,7 +129,7 @@ public class SleepAlarmWidget extends AppWidgetProvider { Alarm alarm = AlarmUtils.createSingleShot(0, true, false, calendar); ArrayList alarms = new ArrayList<>(1); alarms.add(alarm); - GBApplication.deviceService().onSetAlarms(alarms); + GBApplication.deviceService(deviceForWidget).onSetAlarms(alarms); // if (GBApplication.isRunningLollipopOrLater()) { // setAlarmViaAlarmManager(context, calendar.getTimeInMillis()); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java index 97b50fca3..b820a146c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java @@ -181,7 +181,7 @@ public class Widget extends AppWidgetProvider { GB.toast(context, context.getString(R.string.device_not_connected), Toast.LENGTH_SHORT, GB.ERROR); - GBApplication.deviceService().connect(); + GBApplication.deviceService(deviceForWidget).connect(); GB.toast(context, context.getString(R.string.connecting), Toast.LENGTH_SHORT, GB.INFO); @@ -192,7 +192,7 @@ public class Widget extends AppWidgetProvider { context.getString(R.string.busy_task_fetch_activity_data), Toast.LENGTH_SHORT, GB.INFO); - GBApplication.deviceService().onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY); + GBApplication.deviceService(deviceForWidget).onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY); } public void updateWidget() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java index a5496f099..e4cd7c71d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java @@ -369,7 +369,7 @@ public class ActivitySummariesActivity extends AbstractListActivity alarms = new ArrayList<>(1); alarms.add(alarm); - GBApplication.deviceService().onSetAlarms(alarms); + GBApplication.deviceService(deviceForWidget).onSetAlarms(alarms); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java index 41347d6c3..89aa71bd1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java @@ -304,7 +304,7 @@ public abstract class AbstractAppManagerFragment extends Fragment { LocalBroadcastManager.getInstance(getContext()).registerReceiver(mReceiver, filter); if (mCoordinator.supportsAppListFetching()) { - GBApplication.deviceService().onAppInfoReq(); + GBApplication.deviceService(mGBDevice).onAppInfoReq(); if (isCacheManager()) { refreshList(); } @@ -391,7 +391,7 @@ public abstract class AbstractAppManagerFragment extends Fragment { ArrayList concatUuids = AppManagerActivity.getUuidsFromFile(concatFilename); uuids.addAll(concatUuids); } - GBApplication.deviceService().onAppReorder(uuids.toArray(new UUID[uuids.size()])); + GBApplication.deviceService(mGBDevice).onAppReorder(uuids.toArray(new UUID[uuids.size()])); } public void onItemClick(View view, GBDeviceApp deviceApp) { @@ -399,7 +399,7 @@ public abstract class AbstractAppManagerFragment extends Fragment { openPopupMenu(view, deviceApp); } else { UUID uuid = deviceApp.getUUID(); - GBApplication.deviceService().onAppStart(uuid, true); + GBApplication.deviceService(mGBDevice).onAppStart(uuid, true); } } @@ -506,11 +506,11 @@ public abstract class AbstractAppManagerFragment extends Fragment { refreshIntent = new Intent(AbstractAppManagerFragment.ACTION_REFRESH_APPLIST); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(refreshIntent); } - GBApplication.deviceService().onAppDelete(selectedApp.getUUID()); + GBApplication.deviceService(mGBDevice).onAppDelete(selectedApp.getUUID()); return true; case R.id.appmanager_app_reinstall: File cachePath = new File(appCacheDir, selectedApp.getUUID() + mCoordinator.getAppFileExtension()); - GBApplication.deviceService().onInstallApp(Uri.fromFile(cachePath)); + GBApplication.deviceService(mGBDevice).onInstallApp(Uri.fromFile(cachePath)); return true; case R.id.appmanager_app_share: File origFilePath = new File(appCacheDir, selectedApp.getUUID() + mCoordinator.getAppFileExtension()); @@ -533,24 +533,24 @@ public abstract class AbstractAppManagerFragment extends Fragment { } return true; case R.id.appmanager_health_activate: - GBApplication.deviceService().onInstallApp(Uri.parse("fake://health")); + GBApplication.deviceService(mGBDevice).onInstallApp(Uri.parse("fake://health")); return true; case R.id.appmanager_hrm_activate: - GBApplication.deviceService().onInstallApp(Uri.parse("fake://hrm")); + GBApplication.deviceService(mGBDevice).onInstallApp(Uri.parse("fake://hrm")); return true; case R.id.appmanager_weather_activate: - GBApplication.deviceService().onInstallApp(Uri.parse("fake://weather")); + GBApplication.deviceService(mGBDevice).onInstallApp(Uri.parse("fake://weather")); return true; case R.id.appmanager_health_deactivate: case R.id.appmanager_hrm_deactivate: case R.id.appmanager_weather_deactivate: - GBApplication.deviceService().onAppDelete(selectedApp.getUUID()); + GBApplication.deviceService(mGBDevice).onAppDelete(selectedApp.getUUID()); return true; case R.id.appmanager_weather_install_provider: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://f-droid.org/app/ru.gelin.android.weather.notification"))); return true; case R.id.appmanager_app_configure: - GBApplication.deviceService().onAppStart(selectedApp.getUUID(), true); + GBApplication.deviceService(mGBDevice).onAppStart(selectedApp.getUUID(), true); Intent startIntent = new Intent(getContext().getApplicationContext(), ExternalPebbleJSActivity.class); startIntent.putExtra(DeviceService.EXTRA_APP_UUID, selectedApp.getUUID()); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java index 5a5f48402..b72f85b6f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java @@ -359,7 +359,7 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts private void fetchActivityData() { if (getDevice().isInitialized()) { - GBApplication.deviceService().onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY); + GBApplication.deviceService(getDevice()).onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY); } else { swipeLayout.setRefreshing(false); GB.toast(this, getString(R.string.device_not_connected), Toast.LENGTH_SHORT, GB.ERROR); 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 5c34c7345..5cecdf9ef 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 @@ -210,7 +210,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat imp invokeLater(new Runnable() { @Override public void run() { - GBApplication.deviceService().onSendConfiguration(preferenceKey); + GBApplication.deviceService(device).onSendConfiguration(preferenceKey); } }); } @@ -355,7 +355,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat imp enableHeartrateSleepSupport.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { - GBApplication.deviceService().onEnableHeartRateSleepSupport(Boolean.TRUE.equals(newVal)); + GBApplication.deviceService(device).onEnableHeartRateSleepSupport(Boolean.TRUE.equals(newVal)); return true; } }); @@ -369,7 +369,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat imp heartrateMeasurementInterval.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(final Preference preference, final Object newVal) { - GBApplication.deviceService().onSetHeartRateMeasurementInterval(Integer.parseInt((String) newVal)); + GBApplication.deviceService(device).onSetHeartRateMeasurementInterval(Integer.parseInt((String) newVal)); final boolean isMeasurementIntervalEnabled = !newVal.equals("0"); @@ -720,7 +720,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat imp CannedMessagesSpec cannedMessagesSpec = new CannedMessagesSpec(); cannedMessagesSpec.type = CannedMessagesSpec.TYPE_REJECTEDCALLS; cannedMessagesSpec.cannedMessages = messages.toArray(new String[0]); - GBApplication.deviceService().onSetCannedMessages(cannedMessagesSpec); + GBApplication.deviceService(device).onSetCannedMessages(cannedMessagesSpec); return true; } }); 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 08cf0a525..8314d3e7d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java @@ -285,7 +285,7 @@ public class GBDeviceAdapterv2 extends ListAdapter qb = session.getCalendarSyncStateDao().queryBuilder(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java index 409ff088b..1007f1e42 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java @@ -53,6 +53,7 @@ import static nodomain.freeyourgadget.gadgetbridge.util.JavaExtensions.coalesce; public class GBDeviceService implements DeviceService { protected final Context mContext; + private final GBDevice mDevice; private final Class mServiceClass; public static final String[] transliterationExtras = new String[]{ EXTRA_NOTIFICATION_SENDER, @@ -69,10 +70,20 @@ public class GBDeviceService implements DeviceService { }; public GBDeviceService(Context context) { + this(context, null); + } + + public GBDeviceService(Context context, GBDevice device) { mContext = context; + mDevice = device; mServiceClass = DeviceCommunicationService.class; } + @Override + public DeviceService forDevice(final GBDevice device) { + return new GBDeviceService(mContext, device); + } + protected Intent createIntent() { return new Intent(mContext, mServiceClass); } @@ -87,6 +98,10 @@ public class GBDeviceService implements DeviceService { } } + if (mDevice != null) { + intent.putExtra(GBDevice.EXTRA_DEVICE, mDevice); + } + mContext.startService(intent); } @@ -102,29 +117,16 @@ public class GBDeviceService implements DeviceService { @Override public void connect() { - connect(null, false); + connect(false); } @Override - public void connect(@Nullable GBDevice device) { - connect(device, false); - } - - @Override - public void connect(@Nullable GBDevice device, boolean firstTime) { + public void connect(boolean firstTime) { Intent intent = createIntent().setAction(ACTION_CONNECT) - .putExtra(GBDevice.EXTRA_DEVICE, device) .putExtra(EXTRA_CONNECT_FIRST_TIME, firstTime); invokeService(intent); } - @Override - public void disconnect(@Nullable GBDevice device) { - Intent intent = createIntent().setAction(ACTION_DISCONNECT) - .putExtra(GBDevice.EXTRA_DEVICE, device); - invokeService(intent); - } - @Override public void disconnect() { Intent intent = createIntent().setAction(ACTION_DISCONNECT); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java index d26f55944..e48ac8c88 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java @@ -150,16 +150,14 @@ public interface DeviceService extends EventHandler { void connect(); - void connect(@Nullable GBDevice device); - - void connect(@Nullable GBDevice device, boolean firstTime); - - void disconnect(@Nullable GBDevice device); + void connect(boolean firstTime); void disconnect(); void quit(); + DeviceService forDevice(GBDevice device); + /** * Requests information from the {@link DeviceCommunicationService} about the connection state, * firmware info, etc. diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/receivers/AutoConnectIntervalReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/receivers/AutoConnectIntervalReceiver.java index 2e3211d91..a425fb0d9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/receivers/AutoConnectIntervalReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/receivers/AutoConnectIntervalReceiver.java @@ -82,7 +82,7 @@ public class AutoConnectIntervalReceiver extends BroadcastReceiver { for(GBDevice device : devices){ if(device.getState() == GBDevice.State.WAITING_FOR_RECONNECT) { LOG.info("Will re-connect to " + device.getAddress() + "(" + device.getName() + ")"); - GBApplication.deviceService().connect(device); + GBApplication.deviceService(device).connect(); } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/BondingUtil.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/BondingUtil.java index 0dafb618f..5ed5b1f9d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/BondingUtil.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/BondingUtil.java @@ -147,7 +147,7 @@ public class BondingUtil { */ private static void connectToGBDevice(GBDevice device) { if (device != null) { - GBApplication.deviceService().connect(device, true); + GBApplication.deviceService(device).connect(true); } else { GB.toast("Unable to connect, can't recognize the device type", Toast.LENGTH_LONG, GB.ERROR); } @@ -180,8 +180,8 @@ public class BondingUtil { public static void connectThenComplete(BondingInterface bondingInterface, GBDevice device) { toast(bondingInterface.getContext(), bondingInterface.getContext().getString(R.string.discovery_trying_to_connect_to, device.getName()), Toast.LENGTH_SHORT, GB.INFO); // Disconnect when LE Pebble so that the user can manually initiate a connection - GBApplication.deviceService().disconnect(device); - GBApplication.deviceService().connect(device, true); + GBApplication.deviceService(device).disconnect(); + GBApplication.deviceService(device).connect(true); bondingInterface.onBondingComplete(true); }