This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
powersync-app/packaging/android/src/io/guh/nymeaapp/NymeaAppControlService.java
2020-09-21 19:28:17 +02:00

131 lines
6.0 KiB
Java

package io.guh.nymeaapp;
import android.util.Log;
import android.content.Intent;
import android.app.PendingIntent;
import android.net.Uri;
import android.content.Context;
import android.service.controls.ControlsProviderService;
import android.service.controls.actions.ControlAction;
import android.service.controls.actions.BooleanAction;
import android.service.controls.Control;
import android.service.controls.DeviceTypes;
import java.util.concurrent.Flow.Publisher;
import java.util.function.Consumer;
import java.util.List;
import java.util.ArrayList;
import io.reactivex.Flowable;
import io.reactivex.processors.ReplayProcessor;
import org.reactivestreams.FlowAdapters;
public class NymeaAppControlService extends ControlsProviderService {
private ReplayProcessor updatePublisher;
@Override
public Publisher createPublisherForAllAvailable() {
Log.d("********************************* Creating publishers for all ****************************", "fff");
Context context = getBaseContext();
Intent i = new Intent();
PendingIntent pi = PendingIntent.getActivity(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
// pi = PendingIntent.getActivity(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
List controls = new ArrayList<>();
Control control = new Control.StatelessBuilder("e24b0d95-9982-4f9b-ad8b-2aa6b9aba8fd", pi)
// Required: The name of the control
.setTitle("TestControl")
// Required: Usually the room where the control is located
.setSubtitle("TestSubtitle")
// Optional: Structure where the control is located, an example would be a house
.setStructure("TestLocation")
// Required: Type of device, i.e., thermostat, light, switch
.setDeviceType(DeviceTypes.TYPE_GENERIC_ON_OFF) // For example, DeviceTypes.TYPE_THERMOSTAT
.build();
controls.add(control);
// Create more controls here if needed and add it to the ArrayList
// Uses the RxJava 2 library
return FlowAdapters.toFlowPublisher(Flowable.fromIterable(controls));
}
@Override
public Publisher createPublisherFor(List controlIds) {
Log.d("********************************* Creating publishers for one ****************************", "..");
// for(int i = 0; i < controlIds.size(); i++) {
// Log.d("requested control id:", controlIds.get(i));
// }
Context context = getBaseContext();
/* Fill in details for the activity related to this device. On long press,
* this Intent will be launched in a bottomsheet. Please design the activity
* accordingly to fit a more limited space (about 2/3 screen height).
*/
Intent i = new Intent();
PendingIntent pi = PendingIntent.getActivity(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
updatePublisher = ReplayProcessor.create();
// For each controlId in controlIds
if (controlIds.contains("e24b0d95-9982-4f9b-ad8b-2aa6b9aba8fd")) {
Log.d("**", "control asked");
Control control = new Control.StatefulBuilder("e24b0d95-9982-4f9b-ad8b-2aa6b9aba8fd", pi)
// Required: The name of the control
.setTitle("TestTitle")
// Required: Usually the room where the control is located
.setSubtitle("TestSubTitle")
// Optional: Structure where the control is located, an example would be a house
.setStructure("TestStructure")
// Required: Type of device, i.e., thermostat, light, switch
.setDeviceType(DeviceTypes.TYPE_GENERIC_ON_OFF) // For example, DeviceTypes.TYPE_THERMOSTAT
// Required: Current status of the device
.setStatus(Control.STATUS_OK) // For example, Control.STATUS_OK
.build();
updatePublisher.onNext(control);
}
// Uses the Reactive Streams API
return FlowAdapters.toFlowPublisher(updatePublisher);
}
@Override
public void performControlAction(String controlId, ControlAction action, Consumer consumer) {
/* First, locate the control identified by the controlId. Once it is located, you can
* interpret the action appropriately for that specific device. For instance, the following
* assumes that the controlId is associated with a light, and the light can be turned on
* or off.
*/
if (action instanceof BooleanAction) {
// Inform SystemUI that the action has been received and is being processed
consumer.accept(ControlAction.RESPONSE_OK);
BooleanAction bAction = (BooleanAction) action;
// In this example, action.getNewState() will have the requested action: true for “On”,
// false for “Off”.
/* This is where application logic/network requests would be invoked to update the state of
* the device.
* After updating, the application should use the publisher to update SystemUI with the new
* state.
*/
// Control control = new Control.StatefulBuilder("123", pi)
// // Required: The name of the control
// .setTitle("TestControl")
// // Required: Usually the room where the control is located
// .setSubtitle("TestSubTitle")
// // Optional: Structure where the control is located, an example would be a house
// .setStructure("TestStructure")
// // Required: Type of device, i.e., thermostat, light, switch
// .setDeviceType(DeviceTypes.TYPE_GENERIC_ON_OFF) // For example, DeviceTypes.TYPE_THERMOSTAT
// // Required: Current status of the device
// .setStatus(Control.STATUS_OK) // For example, Control.STATUS_OK
// .build();
// // This is the publisher the application created during the call to createPublisherFor()
// updatePublisher.onNext(control);
}
}
}