New in version 0.32.0

Released 8 months ago

Please remember to uno clean your projects after upgrading Fuse.

Highlights
  • WebSockets!
  • Added Page.Freeze and Navigator.DeferPageSwitch to deal with stutter and lag while navigating to new pages.
  • Revamped Uno.Threading for better performance and alignment with .Net APIs
  • Changes to how WhileCount handles multiple conditions.
JavaScript
  • Added support for WebSockets
  • Updated the bundled V8 engine to version 5.5 for Android, Windows and OSX Local preview.
  • Fixed some inconsistencies in how V8 handled marshalling Uno exceptions and String objects in JavaScript.
  • Added Page.Freeze that can be set to WhileNavigating to freeze the page (block updates) during navigation
  • Added Navigator.DeferPageSwitch to defer page navigation until the page is ready
  • Removed the static "State" events from Navigation, replacing them with INavigation.StateChanged. This should not affect any UX code, unless you used a WhileNavigating in an incorrect place, in which case you may get an error now.
  • Fixed Transition to work with swiping
  • Renamed NavigationControlBits to NavigationInternal -- these are not meant to be used and are only public for technical reasons
  • Fixed an issue of an incomplete back swipe causing oddness on the Navigator
  • Fix issue where Unrooting and then Rooting of a LinearNavigation could make the Active property hold an invalid object reference
Text rendering
  • Fixed an issue in the text renderer enabled by compiling with -DUSE_HARFBUZZ where center- and right-aligned text would not properly update their alignment when the text element changed size.
WhileCount
  • Fixed how multiple conditions were combined on WhileCount. Previosuly two conditions would be combined with "OR", now the various range combinations are combined with "AND". Refer to the docs on how to do an inverted, or "OR", range, and how to make a GreaterThanEqual or LessThanEqual comparison (this has changed in a backwards incompatible fashion)
  • Fixed some potential leaks and update paths on WhileCount
NodeGroup
  • Added NodeGroup which allows combining several nodes and resources together in a block
Triggers
  • Changed the ordering behaviour of how trigger actions/events are resolved. This resolves some issues with previously undefined behaviour. It should not affect applications unless they were inadvertently relying on such undefined behaviour. This generally relates to triggers with actions that modified their own state, or have a cycle with other triggers, or contain nodes but no animators.
Swipe
  • WhileSwipeActive changed to be only active when the gesture is at progress="1". Previosuly this could activate immediately when the IsActive flag was switched, which led to inconsistent states. To get a behaviour close to the previous one set the new Threshold parameter to 0.01 (however, this is rarely desired).
  • Fixed a defect where a second swipe gesture might not have been recognized
  • Added WhileSwiping to detect an active swiping gesture
  • Added How="Cancelled" to Swiped to detect when the user does not complete a gesture
Panel
  • Added a IsFrozen feature that allows temporarily blocking any new layout as well as new drawing. It's meant to be used in conjunction with navigation for smooth transitions.
  • Several drawing and layout functions are now sealed. This prevents any derived class from implementing new layout, or drawing, which was never properly supported, and will fail now. You can instead derive from LayoutControl and override DrawVisual if necessary.
Observable
  • Fixed issue with duplicated items in Each using addAll
  • Fixed issue of refreshAll not removing excess items
  • Fixed issue of replaceAt not doing bounds checking
Xcode project generation
  • Xcode.ShellScripts are now escaped as string literals. No more fiddling with manual escaping.
Android builds
  • Added a JNI.SystemLibrary UXL element for linking in libraries like liblog.
Foreign Code Improvements
  • You can now make Uno properties where the bodies of the getter and setter are foreign code. For example:

      [Foreign(Language.Java)]
      public int Foo
      {
          get
          @{
              return getSomeSubsystem().refreshRate;
          @}
          set
          @{
              getSomeSubsystem().refreshRate = value;
          @}
      }
    

    On foreign Java methods you can also provide annotations.

      [ForeignAnnotation(Language.Java, "TargetApi(19)")]
      public void Foo()
      @{
          ...
      @}
    
  • Fixed a bug where the argument names to foreign methods would be renamed because of other conflicting names in the same scope.

  • @{TypeName} macros now expand correctly in foreign Java & ObjC code.

  • The Uno.Compiler.ExportTargetInterop.Foreign.ObjC.Object class has now been removed. Use ObjC.Object instead.

Uno.Threading

To align better with the .NET APIs and to reduce some performance issues with our low-level threading API, we have revamped our API a bit. The following changes are noteworthy:

  • Thread.Join(int) has been marked as obsolete. It's not implemented on most platforms, so it's not very useful in its current form.
  • Thread.Create(), Mutex.Create(), Semaphore.Create(), AutoResetEvent.Create() and ManualResetEvent.Create() has been marked as obsolete. Use the constructors for the respective classes instead.
  • Mutex.Lock() and Mutex.TryLock() has been marked as obsolete. Use Mutex.WaitOne() instead.
  • Mutex.Unlock() has been marked as obsolete. Use Mutex.ReleaseMutex() instead.
  • Thread, Mutex, Semaphore, AutoResetEvent and ManualResetEvent are now sealed, and cannot be inherited from.

In order to get a smooth transition, the deprecated APIs are still present in the current release (but should produce compiler-warnings when used). They will however be removed soon.