Skip to content

Implementing Additional Platform Support

Stephen Winnall edited this page Jul 21, 2020 · 4 revisions

In order to behave well on a given platform, OHR has to do certain things according to that platform's established conventions. Failure to do this will cause irritation to the user and possibly also mistakes because the app does not behave the way that the users expects.

I am aware of three ways in which OHR interacts with the host platform. These are summarised in the following table:

Interaction Implementation
Files the abstract class net.winnall.ohr.host.Host, which is overridden by platform-specific classes
UI the SASS files, from which the CSS files used by JavaFX are generated; and JavaFX itself, which has some platform specific awareness (order of buttons, file and folder choosers, etc.)
Executable pom.xml contains instructions (de.perdian.maven.plugins:macosappbundler-maven-plugin) to generate a MacOS application; something similar is needed for other platforms unless a simple JAR is adequate.

Overriding Host

The current version of OHR is aware of the the following platforms:

Platform Overriding Class Status
MacOS MacOSHost implemented
iOS IOSHost stub
Linux LinuxHost stub
Unix UnixHost stub
Windows WindowsHost stub

Host is implemented as a singleton and provides two general purpose methods and several methods for accessing application support files:

Method Purpose
applyHostConventions do any necessary initialisation to set up platform conventions (e.g. location of menu on screen)
getUserHome return the name of user's login folder
--- ---
getInputSupportFile look for an application support file (also in JAR) and return it as an InputStream
getInputSupportFolderName look for an application support folder and return it as an String
getOutputSupportFile create an application support file and return it as an OutputStream
getInputHostSupportFile look for an application support file (but not in JAR) and return it as an InputStream

It is assumed that application support files can be in:

  1. user space
  2. system space
  3. OHR JAR file

and they are searched for in that order. This allows for system- and user-level overriding of the default settings in the OHR application. The following table illustrates how this works on MacOS and might work on other platforms:

OS User Space System Space
MacOS ~/Library/Application Support/OpenHAB Reporter/ /Library/Application Support/OpenHAB Reporter/
Linux ~/.ohr /etc/ohr
Unix ~/.ohr /etc/ohr

Overriding Host entails instantiating abstract methods, where necessary, and possibly overriding other methods to achieve an appropriate result as outlined above on the given platform whilst observing relevant platform conventions. Looking at MacOS may give some insight into the intended semantics.

Adapting UI

My current (but untested) belief is that JavaFX will do the "right thing" for most platforms. Please raise an issue if this is not the case. Fine tuning of the OHR's windows can be carried out by editing the SASS resource files (file type .scss) in the src/main/resources/sass tree. Some knowledge of SASS is required. Conventions have not yet been established for switching between platforms in the SASS files, but it may not be necessary. Again, please raise an issue if you need to add any platform-specific stuff here.

Creating Executable

I'm afraid you're on your own here. I've only ever done it for MacOS. Please share whatever you develop.

Clone this wiki locally