View on GitHub

TouchPortalPluginSDK

This Project is an SDK to create a Touch Portal Plugin using Java or Kotlin and Gradle

Touch Portal Plugin SDK

Touch Portal Plugin SDK

Build, Coverage and Publish Release Build and Publish Snapshot Code Coverage Language gradle: Java

This Project is an SDK to create a Touch Portal Plugin using Java or Kotlin and Gradle. This SDK is a complete solution which will not only help you connect to communicate with TouchPortal through Actions, Events, States, Settings and Connectors, but it will also help you with the hassle of packaging it

For further reference, the Touch Portal Plugin documentation can be found here

Documentation

Once you have cloned this project, you can run the gradlew javaDoc and browse the document in the build/docs/javadoc of each module

Releases

Latest is 8.0.0

Go to releases

Maven Central

Latest version is 8.0.0

Prior versions were not published to Maven Central

Gradle

plugins {
  id 'com.christophecvb.touchportal.plugin-packager' version '8.0.0'
}

dependencies {
  implementation 'com.christophecvb.touchportal:plugin-sdk:8.0.0'
  annotationProcessor 'com.christophecvb.touchportal:plugin-sdk-annotations-processor:8.0.0'
}

Get Started

public class MyTouchPortalPlugin extends TouchPortalPlugin implements TouchPortalPlugin.TouchPortalPluginListener {
    /**
     * Logger
     */
    private final static Logger LOGGER = Logger.getLogger(TouchPortalPlugin.class.getName());
    
    /**
     * Constructor calling super
     */
    public MyTouchPortalPlugin() {
        super(true);// true is for paralleling Actions executions
    }

    public static void main(String... args) {
        if (args != null && args.length == 1) {
            if (PluginHelper.COMMAND_START.equals(args[0])) {
                // Initialize your Plugin
                MyTouchPortalPlugin myTouchPortalPlugin = new MyTouchPortalPlugin();
                // Initiate the connection with the Touch Portal Plugin System (will trigger an onInfo message with a confirmation from TouchPortal and the initial settings)
                boolean connectedPairedAndListening = myTouchPortalPlugin.connectThenPairAndListen(myTouchPortalPlugin);
            }
        }
    }

    /**
     * Called when the Socket connection is lost or the plugin has received the close Message
     */
    public void onDisconnected(Exception exception) {  }

    /**
     * Called when receiving a message from the Touch Portal Plugin System
     */
    public void onReceived(JsonObject jsonMessage) { }

    /**
     * Called when the Info Message is received when Touch Portal confirms our initial connection is successful
     */
    public void onInfo(TPInfoMessage tpInfoMessage) { }

    /**
     * Called when a List Change Message is received
     */
    public void onListChanged(TPListChangeMessage tpListChangeMessage) { }

    /**
     * Called when a Broadcast Message is received
     */
    public void onBroadcast(TPBroadcastMessage tpBroadcastMessage) { }

    /**
     * Called when a Settings Message is received
     */
    public void onSettings(TPSettingsMessage tpSettingsMessage) { }

  /**
   * Called when a Notification Option Clicked Message is received
   */
  public void onNotificationOptionClicked(TPNotificationOptionClickedMessage tpNotificationOptionClickedMessage) {}
}

Development and Interaction

public class MyTouchPortalPlugin extends TouchPortalPlugin implements TouchPortalPlugin.TouchPortalPluginListener {
    // ...

    /**
     * Action example with a Data Text parameter
     *
     * @param text String
     */
    @Action(description = "Long Description of Dummy Action with Data Text", format = "Set text to {$text$}", categoryId = "BaseCategory")
    private void actionWithText(@Data String text) {
        TouchPortalSamplePlugin.LOGGER.log(Level.INFO, "Action actionWithText received: " + text);
    }
    
    // ...
}
public class MyTouchPortalPlugin extends TouchPortalPlugin implements TouchPortalPlugin.TouchPortalPluginListener {
    // ...
  
    public void onReceived(JsonObject jsonMessage) {
        // Check if ReceiveMessage is an Action
        if (ReceivedMessageHelper.isTypeAction(jsonMessage)) {
            // Get the Action ID
            String receivedActionId = ReceivedMessageHelper.getActionId(jsonMessage);
            if (receivedActionId != null) {
                // Manually call the action methods which not all parameters are annotated with @Data
                switch (receivedActionId) {
                    // case ...:
                    // break;
                }
            }
        }
    }
    
    //...
}
public class MyTouchPortalPlugin extends TouchPortalPlugin implements TouchPortalPlugin.TouchPortalPluginListener {
    // ...
  
    public void onInfo(TPInfoMessage tpInfoMessage) {
        // TPInfoMessage will contain the initial settings stored by TP
        // -> Note that your annotated Settings fields will be up to date at this point
      
        // continue plugin initialization
    }
    
    // ...
}
public class MyTouchPortalPlugin extends TouchPortalPlugin implements TouchPortalPlugin.TouchPortalPluginListener {
    // ...
  
    @State(defaultValue = "Default Value", categoryId = "SecondCategory")
    private String customStateText;
  
    @Action(description = "Long Description of Dummy Action with Data Text", format = "Set text to {$text$}", categoryId = "BaseCategory")
    private void actionWithText(@Data String text) {
      // ... do something then update state
      this.customStateText = "new state value";
      this.sendStateUpdate(MyTouchPortalPluginConstants.BaseCategory.States.CustomStateText.ID, this.customStateText, true);
    }
    
    // ...
}

Use Annotations to describe your plugin and package it

// ...

@Plugin(version = BuildConfig.VERSION_CODE, colorDark = "#203060", colorLight = "#4070F0", name = "My Touch Portal Plugin")
public class MyTouchPortalPlugin extends TouchPortalPlugin {
    //...

    /**
     * Action example that contains a dynamic data text
     *
     * @param text String
     */
    @Action(description = "Long Description of Dummy Action with Data", format = "Set text to {$text$}", categoryId = "BaseCategory")
    private void dummyWithData(@Data String text) {
        LOGGER.log(Level.Info, "Action dummyWithData received: " + text);
    }

    /**
     * State and Event definition example
     */
    @State(defaultValue = "1", categoryId = "BaseCategory")
    @Event(valueChoices = {"1", "2"}, format = "When customStateWithEvent becomes $val")
    private String customStateWithEvent;

    private enum Categories {
        /**
         * Category definition example
         */
        @Category(name = "My Touch Portal Plugin", imagePath = "images/icon-24.png")
        BaseCategory
    }

    //...
}

Prepackaging

Build

Debugging tips

ROADMAP

The roadmap can be found here