Create native cross-platform desktop, web, mobile & Raspberry Pi apps

Xojo for Mac

Xojo for Mac

  -  Trial
  • Latest Version

    Xojo 2024 Release 3 LATEST

  • Review by

    Daniel Leblanc

  • Operating System

    macOS 10.14 Mojave or later

  • User Rating

    Click to vote
  • Author / Product

    Xojo, Inc. / External Link

  • MD5 Checksum

    4ffdd256723be3aa6d4faada29920f75

Xojo for Mac is an application development environment that provides developers a marked increase in productivity over other multi-platform development tools. The app includes drag-and-drop capability to enable you to quickly create a user interface design, then incorporate the code behind it to add power and functionality. The tool is highly compatible with Visual Basic, so Visual Basic developers are productive very quickly with this product.

Xojo for macOS also comes with a utility to help convert Visual Basic projects to the app where they can be compiled for macOS, Windows, Linux, the web, and iOS -- with the click of a checkbox. Xojo runs on and creates software for OS X, Windows, Linux, iOS and the web all from a single set of source code. The app incorporates platform-specific intelligence, like user interface widgets, so applications created with the applook and feel native, regardless of the development platform you created it on. Build powerful database apps with the app's built-in database, based on the SQLite public domain database engine. Xojo for Mac supports standard image formats for vector graphics.

Features and Highlights

Create Anything
With built-in support for graphics, database servers, internet protocols and more, you can build just about anything you can imagine with the app. Using the tool, you can make commercial software products, utilities to help make your life easier, or even learn to program. In fact, the app itself is a Xojo app!

Build Apps 10x Faster
You can use one set of source code to support multiple platforms and there are over 40 user interface controls built in, allowing your app to look and behave how you'd want it to on any platform. On the web you can use one powerful language to create your web app instead of HTML, CSS, PHP, JavaScript, or AJAX, saving you tons of development time!

Modern Development
The program is a modern, object-oriented language. It supports inheritance, interfaces, polymorphism and is strongly-typed as well. There are thousands of differences in OS API calls and the app abstracts you from these details, dramatically reducing development time and allowing you to focus on what makes your application unique.

Native, Cross-Platform
Xojo apps don't have an interpreter or virtual machine - they're compiled to machine code for fast execution and the protection of your intellectual property. The tool uses native controls so your app looks and feels right on each platform. Development is cross-platform as well. Create your project on your favorite OS and then build it for any platform the app supports.

Note: 30 days trial version.

Also Available: Download Xojo for Windows

  • Xojo 2024 Release 3 Screenshots

    The images below have been resized. Click on them to view the screenshots in full size.

    Xojo 2024 Release 3 Screenshot 1
  • Xojo 2024 Release 3 Screenshot 2
  • Xojo 2024 Release 3 Screenshot 3
  • Xojo 2024 Release 3 Screenshot 4

What's new in this version:

Xojo 2024 Release 3
New Features:
- Minor tweak to the message error displayed when a Xojo Cloud subdomain is already in use
- Changed the Tab Order Editor window frame so it is displayed in the current screen instead of the main screen when the IDE is running in a multi-display setup
- Added a Code Editor command bar item for Standardize Format. If something is selected, it formats the selection. If nothing is selected, it formats the entire method
- The entire line with the cursor is now highlighted by default, with its own Coding setting to turn it on or off. This uses the Row Highlight color from the Code Editor settings (previously this was the Debugger Highlight color - the color is now used for both things)
- The IDE now checks that newly saved text projects are being saved into an empty folder. If the folder is not empty, then a dialog appears offering to save the project into a newly created folder, save it anyway at the specified location or cancel
- Android: The Layout Editor in Android projects now supports tablet-sized layouts. The App inspector now had an additional property to specify the default tablet screen, which is used when the app starts on tablet-sized devices
- macOS: Added Hover effect to toolbar items in the IDE for macOS
- Web: Added a property in the inspector to allow entering CSS classes for visual controls
- Web: Added a setting to Web Projects to avoid launching the browser when debugging the project

Fixed:
- Fixed an issue that could cause the IDE to crash, when trying to run and stop different Web projects using the same Debug Port
- Tabbing through the property list in the Inspector is now more reliable, particularly when navigating through the property list of specific controls such as DesktopListBox
- Fix: Now the IDE Script editor on macOS does show the last line as expected when code is longer than the editor window (71249)
- Now the code from IDE Scripts, added as a Build Step to the project, is also printed when choosing the Print command
- Fixed an IllegalCastException that could occur when the Database Connection items are in the process of becoming deselected
- Added Ptr, WString, PString, CString and CFStringRef as datatypes for standardize format to case correct
- Attempt to avoid a NilObjectException that seems to sometimes occur when the debugger is shutting down
- Removed the Short data type from autocomplete since Short has been deprecated since 2015
- The Code Editor Syntax Help area now defaults to a fixed size of 3 lines. A scroll bar appears if there are more entries than will fit in the available area. This size can be changed in Code Editor Settings to 2, 3, 4, 5, 6 or Resizeable (which itself maxes out at 6 lines)
- Display an error if you try to use Extract Interface using the name of something that already exists in the project
- An error is now displayed if you try to Extract Superclass using the name of a class that already exists in the project
- Fixed updating properly the IDE's Navigator when un-parenting a member from a ControlSet (77001)
- Autocomplete now excludes unnecessary and unused On/Off values
- Fixed a potential NilObjectException when closing the IDE while the code editor is performing an autocomplete action
- Event Handler Descriptions are now properly saved/loaded
- Now the Document window search field visibility honors its associated tab lock state when opening a project file
- Desktop, Web and Console projects no longer show classes in autocomplete that are not applicable to the project type. For example, Desktop projects won't show Web control classes, Web projects won't show Desktop control classes and Console projects won't show either Desktop or Web control classes
- Dragging in a project item from an outside file now inserts it at the drop position in the Navigator
- When running on Mac, the web debug and console debug folders are now removed when the app is quit or terminated
- Fixed copying / pasting a WebTabPanel so the child controls keep their original TabPanelIndex value
- SQLite Database Connection items can now be added for Mobile projects (using the Insert Database Connection menu item). The selected SQLite database connection file with also be bundled along with the built app
- TargetWin32 and TargetCocoa (which both have been deprecated since 2018) no longer auto-completes
- Debugger picture viewer now correctly centers/renders pictures with Horizontal/Vertical resolutions that are greater than 72
- Autocomplete improvements: XojoVersion and XojoVersionString now show in syntax help area and autocomplete will suggest members for them. CType now shows in syntax help area. Class constants of type Number now show in syntax help area and autocomplete will suggest members for them
- Clicking the Edit Code command bar item while debugging now correctly positions the IDE to the exact line of code that the debugger is on
- Android: Xojo Android Debug Bridge app (xadb) now works when Xojo is installed on Linux using the Debian package
- Android: Cleaned up incorrect information the was showing in Code Editor syntax help for MobilePanel.RemovePanelAt method
- Android: Attempt to avoid an OutOfBoundsException that can sometimes happen when compiling globals
- Android: Includes In settings for Android mobile controls/classes are now set to indicate they are Android-only
- Android: Android projects no longer show MobileContainer instance members in autocomplete when not using an instance
- Android: Layout Editor landscape size now matches the aspect ratio of the corresponding portrait size
- Android: Fixed a build error that could occur with project names that have / in them
- iOS: Now it is not possible to resize a control in the Layout Editor when it is locked for iOS Projects
- iOS: iOS projects now autocomplete Picture.Formats.HEIC
- macOS: Fixed an issue where the IDE sometimes didn't update all Desktop project Windows when switching between light and dark mode
- macOS: Now the Inspector Panel tabs are properly shown when displayed as a floating window
- Web: WebSDKUIControl.Indicator will be Default by default now, instead of being blank
- Web: Fixed a visual issue in the IDE when previewing a WebButton having Outlined and the Link Indicator at the same time
- Web: Default event for WebPicture was missing. Downloaded will always be highlighted by default now, as it was the only one available
- Windows: Windows/Linux IDE: The readability issue of a label in the Options dialog when using dark mode has been resolved, making it easier to read now

Framework:
New Features:
- Added new functions on MemoryBlock to compress and decompress data using gzip
- New Thread.Type has been added, allowing you to specify whether a thread is cooperative or preemptive. Similarly, this new Type property has also been added for Semaphore and CriticalSection, allowing the creation of two distinct locking mechanisms: one for interactions between the main thread and preemptive threads, and another for interactions with cooperative threads
- Added ToPicture method to Desktop/Web/MobileChart
- SQLiteDatabase: added support for SOUNDEX. This is supported for all platforms except for Android
- MySQLCommunityServer: We now encode RowSet string values in UTF-8 if the database character set is set to UTF-8; otherwise, we leave the encoding as Unknown, as we did previously
- Now it is possible to programmatically resize Popovers on macOS
- Added System.CoreCount which returns the number of available cores. Note, this may not necessarily match the number of CPU cores
- Android: Added MobileToolbarButton.Handle property for Declares
- Android: Added FolderItem.Handle for Declares
- Android: Added Locale.Handle for Declares
- Android: Added TimeZone.Handle for Declares
- Android: Added Font.Handle As Ptr property for Declares
- Android: Added MobileApplication.BuildDateTime As DateTime property
- Android: Added Picture.Handle(type As HandleTypes) method and HandleTypes enum with elements: AndroidBitmap and AndroidDrawable
- Android: Added GraphicsPath.Handle As Ptr
- Android: Improvements to Declare usage with Libraries: It is now possible to call instance methods on library classes, the App Permissions can now specify additional attributes, libraries can call back to Xojo methods, added most Ptr methods
- Android: Added Graphics.Handle(HandleTypes) with HandleTypes enum
- Android: MobileTextArea/Field.SelectionStart and SelectionLength properties are now settable
- Android: Added MobileTextField/Area.FocusLost/FocusReceived events to match iOS
- Android: Added AndroidMobileTable.LastRowIndex property
- Android: Added RegEx support for Android
- Every OS: Pressed event will be fired now when pressing on Chart labels. ChartDataset.IsVisible property has been added to detect if the dataset is visible or not. Supported in Desktop, iOS and Web project types
- iOS: Now ChartCircularDataset filling is draw consistently as ChartLinearDataset does, what means that is possible to set also the desired value for the Transparency property. By default, such property changed from the previous 70% value to 50%
- iOS: Refactored MobileMessageBox on iOS to use UIAlertController as the underlying object instead of the very deprecated UIAlertView
- iOS: Now MobileImageViewer.URL loads asynchronously the image from the received URL on iOS
- iOS: Added the ability to get / set Metadata info (including Location) from Pictures on iOS. Also added the ability to save a Picture directly to the user Photo library
- Web: Updated Bootstrap to v5.3.3 and Bootstrap Icons to v1.11.3
- Web: Added WebUIControl.CSSClasses, to allow adding and removing CSS classes programmatically
- Web: Added a WebCombobox.FilteringMode property, to control the filtering behavior of the control
- Web: WebSession ClientWidth and ClientHeight properties will be updated now, when the user resizes the browser
- Web: Web Basic, Web Extended and Bootstrap named colors can be used now in the Web ColorGroup editor and, programmatically, with ColorGroup.NamedColor
- Web: Added WebRectangle support for BorderColor, BorderThickness and CornerSize
- Windows: DesktopHTMLViewer: enabled support for accessing the camera and microphone
- Resolved Issues
- DesktopMoviePlayer: the MouseDown, MouseDrag, and MouseUp events have been removed, as they were not meant to be exposed
- Fixed a PDFGraphicsPath.FillPath bug that happened when a RoundRectangle intersected another path (mostly a Rectangle or another RoundRectangle)
- XojoScript: Color.ToString and Currency.ToString now works correctly instead of raising a compile error
- XojoScript: Double.ToString now works correctly instead of raising a compile error
- Trying to invoke SelectSQL or ExecuteSQL on a closed database now throws a DatabaseException
- DesktopHTMLViewer: the MouseDown, MouseDrag, and MouseUp events have been removed, as they were not meant to be exposed
- Fixed a scenario when using PDFDocument.DrawText with a wordwrap value set (77039)
- Fixed setting the proper PDFGraphics page size internal state when the PDFDocument instance is created using the PDFDocument.PageSizes enum
- Removed unused MessagesCounted event on POP3SecureSocket. Use MessageCount instead
- Now CellAction is called again on DesktopListbox when modifier keys are held
- The REALGetPropValue(Integer/Int8/etc.) and REALSetPropValue(Integer/Int8/etc.) functions now works for enum properties
- Fixed a bug in Barcode macOS where it was not possible to display a Sheet window after using the Barcode Scan window
- Fixed a bug in PDFGraphics when the drawing is using a brush after color has been set to color.clear
- Changed parameter name in method signature for ContainerControl.ShowPopover
- Fixed a bug retrieving the LastRowIndex from a JSONItem storing an array value, under some circumstances
- Android: Fixed a compile error that would occur when assigning Dictionary.Values to a variant array
- Android: TCPSocket/SSLSocket data transmission is now more precise, particularly when dealing with encodings and binary data
- Android: Attempting to call Listen() on a TCPSocket that was previously disconnected (manually or due to an error) no longer causes an internal exception
- Android: Allow up to 6 buttons on the bottom toolbar before they start overflowing to the menu
- Android: More TCPSocket error situations, such as a connection being lost, now call the Error event handler. The SendCompleted event handler is no longer called when data was not sent due to not being connected
- Android: MobileTextControl/Label/TextField/TextArea.Alignments can now be converted to/from Integer
- Android: Graphics.LineJoinTypes Bevel and Miter integer values now match other platforms
- Android: Ensure that MobileContainer.Opening event is only called once
- Android: MobileScreen.OrientationChanged event is now called more reliably so that results are more accurate
- Android: String.IndexOf() signatures now match other platforms
- Android: Graphics.LineDashOffset type is now Double to match other platforms
- Android: MobileScreen.ContentSize() now subtracts the toolbar size even when there is no navigation bar
- Android: Graphics.Draw methods that use a LineDash now draw correctly without requiring a DrawLine() call beforehand
- Android: MobileSegmentedButton.Pressed event parameter name is now segmentedIndex to match iOS
- Android: BinaryStream.Length can now be set to truncate the file
- Android: DictionaryEntry.Key and Value properties no longer show as read-only in introspection
- Android: Fixed a compile error that could occur when casting to various Introspection types
- Android: Added missing FolderItem.DisplayName property
- Android: Picture.RGBSurface property now shows as read-only in introspection
- Android: SQLiteDatabase.LibraryVersion now shows as read-only in introspection
- Android: TCPSocket.ByteAvailable, BytesLeftToSend and RemoteAddress now show as read-only in introspection
- Android: StackFrame.Address and Name properties now show as read-only in introspection
- Android: SocketCore.IsConnected and LocalAddress now show as read-only in introspection
- Android: TypeInfo.GetElementType now works with arrays
- Android: SQLiteDatabse.IsConnected now returns True when connected to an in-memory DB
- Android: String.MiddleBytes now returns instead of an OutOfBoundsException when the values are outside the string's range
- Android: Raise an InvalidArgumentException when accessing Column values outside the RowSet range to match desktop behavior
- Android: Added ReadError() and EOF() methods to Readable interface for compatibility with other platforms. Updated the classes that use Readable (BinaryStream, TCPSocket and TextInputStream) to include the new methods
- Android: Fixed a compile error that could occur when subclassing System.DeviceData or System.VersionData
- Android: Fixed a compile error that could occur when subclassing Point
- Android: Fixed a compile error that could occur when subleasing MobileToolbarButton
- Android: Fixed a compile error that could occur when subclassing MobileSegment
- Android: Fixed a compile error that could occur when subclassing MobileMotion
- Android: Fixed a compile error that could occur when subclassing JSONItem
- Android: Fixed a compile error that could occur when subclassing FolderItem
- Desktop: Now DesktopChart honors the colors set to the BackgroundColor, TextColor and GridColor properties using the Inspector Panel in the IDE
- Every OS: Single.IsNotANumber and IsInfinite now works correctly
- Every OS: ListBox: When RequiresSelection is set to True, clicking on an empty area of the ListBox no longer causes the SelectionChanged event to trigger repeatedly
- iOS: Now Graphics.DrawText on iOS draws the text at the appropriate Y coordinate when a value is provided for the WrapWidth parameter (77171)
- iOS: Picture.FromHandle now returns Nil when given a Nil handle
- iOS: FolderItem.RemoveFolderAndContents now works properly on iOS
- iOS: Fixed setting the appropiate constraints when a MobileContainer is the source of a Popover on iOS, and the parent control is a MobileToolbarButton
- iOS: Added missing IllegalLockingException class
- iOS: Setting a MobileSegmentedButton's MobileSegment Caption on iOS honors the SelectedIndex instead of reseting it to the first one
- iOS: GraphicsPath.AddRoundRectangle offers now the same behavior that Graphics.AddRoundRectangle on iOS
- Linux: Reverted a change that affected the event order (with respect to the Resized and Opening event) of DesktopContainer. This order now more closely matches the behavior of the legacy ContainerControl
- Linux: BevelButton: now draws the caption using the specified font name instead of always using the default font
- Linux: DesktopMoviePlayer: PlaybackStarted is now triggered correctly, and PlaybackStopped is properly fired when the movie is paused
- Linux: Writing to an RGBSurface, obtained from an alpha supported Picture, now works properly
- Linux: Setting the Sound Volume and Pan now works correctly, especially when looping
- Linux: DesktopCheckBox: setting the VisualState to Indeterminate now works properly on distros like Debian 12+ (i.e. LMDE 6 Faye and Raspberry Pi)
- Linux: A disabled ListBox now draws the heading and row text properly, instead of looking like they've disappeared in light mode
- macOS: Fixed an issue with offseted contents along the Y axis when a Popover window has the background color set on macOS
- macOS: macOS/iOS: URLConnection.SendingProgressed now correctly reports the actual bytes left to send, as the parameter name suggests, rather than incorrectly reporting the total bytes
- macOS: HTMLViewer.Print no longer crashes with a failed assertion when the printing completes
- macOS: Fixed DesktopListbox.PaintCellBackground leaving a gap in the first column on macOS (77055)
- macOS: Fixed showing a Sheet type window as modal on macOS passing a parent Window as parameter, when such parent is not the frontmost one
- macOS: Removed the Focus Ring from DesktopSegmentedButton on macOS
- macOS: Fixed a bug when a ContainerControl is shown as Popover on macOS and the ContainerControl has the HasBackgroundColor set to True
- macOS: Now the Barcode class adds the required Key/Value entry in the macOS app Plist.file when it is instantiated via code
- Web: Fixed a WebRadioGroup issue causing the control to be misaligned, when locking the control to the right side
- Web: Fixed the apple-mobile-web-app-capable deprecation warning appearing in some browsers, like Chrome
- Web: Fixed a WebPagePanel and WebTabPanel issue allowing its children to grow outside of the boundaries
- Web: Fixed a ContextualMenu blink issue when trying to display the menu, using the Ctrl key, on some browsers
- Web: Fixed some WebListBox issues when working with relative widths, in the IDE preview and at runtime
- Web: Fixed a WebSearchField issue that was causing the Pressed event to be fired incorrectly
- Web: Fixed a WebListBox issue that was preventing the control from selecting the row, when displaying a contextual menu
- Web: Fixed a WebListBox visual issue happening in Safari, in Dark Mode. Part of the background was being shown as the scrollbar background
- Web: Fixed a WebPagePanel issue causing the control to raise the PanelChanged event several times, with the same SelectedPanelIndex value
- Web: Fixed an issue that could cause closing a WebDialog to enter in an infinite loop raising the Dismissed event
- Web: Fixed a WebToolbar issue causing buttons with WebMenuItem to ignore their Position property
- Web: When receiving an UnsupportedOperationException by calling WebListBox.CellTextAt with a DataSource, the message won't mention CellValueAt anymore, it will mention CellTextAt
- Web: Prevented WebCanvas to overfire the Resized event, when resizing the browser window
- Web: Fixed a WebStyle issue causing AddTransition to not be applied unless other styles are present
- Web: WebStyle.AddTransition will also add the transitions to the containing element, so compound controls can have animations in properties like Left and Top
- Web: Fixed an issue that was causing WebButton controls to not be displayed in some older browsers
- Web: Fixed a WebListBox issue causing the ProcessingMessage property to be ignored
- Web: Fixed an issue causing WebView.Overflowed event to not be fired
- Web: WebGraphics will now wrap the text in WebCanvas like it wraps it in DesktopCanvas, when using DrawText
- Web: Opening Event will be raised on WebSDKUIControl that has been added at runtime
- Web: Fixed an issue causing Popovers to be closed, when the user was interacting with WebDatePicker controls inside them
- Web: WebListBox can receive the focus now, using its SetFocus method. The navigation using the keyboard on this control has also been improved
- Web: Fixed a WebCheckbox issue causing the control to be misaligned, when locking the control to the right side
- Windows: Strings that can't be correctly encoded as UTF-8 no longer trigger a failed assertion when using APIs that didn't actually require proper UTF-8 encoding in the first place
- Windows: Fixed the regression when it is about painting the cells background in a DesktopListbox
- Windows: DebugLog no longer stops working on Windows after receiving ASCII 0
- Windows: TextEncoding.InternetName now correctly reports the internet name for all supported text encodings, rather than just a select few on Windows/Linux
- Windows: DesktopSeparator: swapped the primary color of the DesktopSeparator in dark mode to enhance its distinctiveness, especially noticeable when the width or height is just a single pixel
- Windows: DesktopHTMLViewer: changing the UserAgent now works

Compiler:
New Features:
- Android: Added Declare Import command to import a class that is referenced using the Alias in a Kotlin command so that parameter types can be cast to their correct types
- Resolved Issues
- XojoScript: The methods String.TrimLeft and String.TrimRight can now be used without causing an error
- Android: Shared computed properties in a class that is in a module now work properly
- Android: Calling a Declare on a MobileScreen from outside the screen no longer causes a compile error
- Android: Fixed a compiler error that could occur with the use of some Attributes
- Android: Declares to java.lang.* no longer cause a compile error
- Android: Incomplete Color literal values, such as &c0, are now compiled properly
- Android: Fixed a compile error regarding the Material icon dependency
- Android: Avoid a possible OutOfBoundsException that sometimes occurs when processing a single-line If expression
- Android: Added support for Using clauses on screen, class and container. The Using command in code is not supported
- Android: Var/Dim/Static declarations that use New and are followed with other variable declarations on the same line no longer cause a compile error
- Android: Fixed a compile error when implementing the Iterator method on an Iterable
- Android: Using Not without parentheses with IsA no longer results in a TypeMismatchException at runtime
- Android: Fixed an OutOfBoundsException that could occur when processing a Try/Catch block
- Android: Shared computed properties on MobileContainers now work properly
- Android: Added TargetRemoteDebugger constant, which always returns False for Android
- Android: Fixed a compile error that would occur when trying to call methods directly on a CType expression
- Android: Fixed a compile error that would occur when a generic Object was added to a MobileScreen
- Android: Overloaded methods with an extension method are now permitted on Android
- Android: Since Byte datatype is not technically deprecated yet, added support for it so that it does not cause runtime exceptions or compile errors
- Android: Fixed a compile error that could occur when a property name on App had the same name as a class in the project

Documentation:

Fixed:
- Color now appears in the Data Types section as it's an intrinsically recognized type by the compiler. Pair is now in the Language section because it's not an intrinsically recognized type by the compiler
- Web: The missing icon parameter has been added to WebPicture.BootstrapIcon
- Web: ConnectionType and FrameOption properties of WebAppSecurityOptions are both now documented

Examples:
Fixed:
- Android: Fixed Kind/Platform fields for descriptions of Android database examples


Xojo 2024 Release 2
Highlights:
- DatabaseConnection project item now available for Desktop, Web and Console projects
- Web projects now support Control Sets
- You can now add and remove panels from WebPagePanel and WebTabPanel at runtime
- Better performance when using WebListBox with large data sources
- iOS MobileDateTimePicker now supports Compact and Inline styles for better use within tables
- Apple's iOS privacy requirements can now be met with the new Privacy Manifest Editor
- String.CharacterCount returns the actual number of characters in a String, which can be useful when dealing with multi-byte characters such as emoji
- Database.AddRow has a new overload that returns the unique ID of the added row
- Barcode is now supported on Linux
- TCPSocket is now supported on Android
- Added Graphics.LineCap, LineDash, LineDashOffset, LineJoin, MiterLimit, Outline and ShadowBrush for Android

Statistics:
- Bugs fixed: 136
- Features added: 42
- Documentation changes: 1
- Examples changed: 2

IDE:
New Features:
- Fixed the minimum height of the Choose a Project dialog, so all items are displayed at first glance
- Debugger: the Picture content viewer now live scrolls when using the scrollbars
- For SQLite Database Connection items, the SQLite database file is now bundled in the Resources folder of the built app
- Desktop: New Database Connection project items can now be added to your project. These connection settings can be modified with the ability to select which connection to use and whether or not to auto-connect
- iOS: Added the AllowPopover property from MobileChart to the Inspector Panel on iOS projects
- iOS: Added a Privacy Manifest Editor in the IDE for iOS Projects
- macOS: Added DTSDKBuild key to macOS plist file
- Resolved Issues:
- Now it is possible to display the Add Event Handler panel when double-clicking a Window in the Layout Editor after deleting a Menu Handler, Property or Note from such Window in the Navigator
- Fixed an issue when exporting a previously added class via drag & drop with Command-Option keys pressed, that could lead to deleting the selected target folder if the project was not previously saved
- Script Editor no longer loses changes when quickly trying to do menu action after typing some code
- Double-clicking an empty area of the Listbox in the Add Event Handler dialog doesn't closes the window
- Now the Inspector Behavior displays previously disabled properties for intrinsic classes
- Avoid an OutOfBoundsException that could occur when using code folding in the code editor
- The Title property for a Screen object on iOS only displays the first available line of the text assigned
- Fixed a regression so {U+03BC} character can be used again as part of any of the enum values names
- The deprecated Variant.TypeInteger no longer shows up in the Autocmplete list
- Fixed a display issue with code folding when collapsing sequential Case statements within a Select Case block
- Fixed showing debugger variables in its own separate windows
- Profiling Windows/Linux 32-bit apps now works again
- Using the swap lines feature from within a Build Script code editor no longer causes an IDE exception
- Now it is not possible to paste an image in a Method Definition in the IDE on Windows
- Updating the ListBox FontSize/FontUnit now correctly updates the vertical Scrollbar to reflect this change in the layout editor
- IDE's Layout Inline Editor (popover editor) doesn't remove the first item from the control edited values (DesktopPopupMenu, DesktopListbox, DesktopRadioGroup) when it is a return character
- Fixed an exception when creating a new project that could occur on Windows if you clicked too many times on the desktop icon while starting Xojo. This could cause the Project Chooser to appear before the app had finished initializing
- Fixed an exception that could occur when changing color group properties when multiple items are selected
- Remove the Libs folder from the debug build folder of a console app on macOS after the debug app disconnects
- The name of the ColorGroup item is no longer written out twice for Binary/XML project formats
- The name of the Enumeration item is no longer written out twice for Binary/XML project formats
- Android: Settings/Preferences -> Clear Caches now deletes the entire Android cache (when available) to prevent possible library sync problems
- Android: Fixed the case of some TextEncoding properties names for autocomplete
- Desktop: DesktopScrollbar: when embedded inside a TabPanel, the scrollbar no longer always appears on the first tab when that wasn't the tab it was assigned to
- iOS: Added MaximumCharactersAllowed property to the Inspector Panel for MobileTextArea and MobileTextField on iOS projects
- iOS: Better handling of iOS Compiling errors returned as XML, so they are presented in a better / more readable way
- Linux: Linux IDE: the debugger hyper links are now more readable in dark mode. Also updated the default code editor background color so that it isn't so bright in dark mode
- macOS: SegmentedControl honors now the width value on Mac both in the Layout Editor and at runtime
- macOS: Fixed Select All when applied on a text that includes emojis on a TextField on macOS
- macOS: Fix for properly reading as a Plist file an external item that has been saved in a project using an old Xojo Release (2019) (76102)
- Web: WebSegmentedButton inspector editor won't ignore the Selection Style anymore
- Web: Fixed a WebImageViewer issue requiring to enter the URL twice in the IDE Inspector, when its Image property wasn't empty
- Web: Fixed a NilObjectException that could happen when closing a project window while another was still loading at the same time
- Web: Fixed an issue causing copying and pasting elements on web projects to lose most of their properties, on some type of controls
- Windows: The compilation build failure dialog now appears modally, instead of appearing briefly and disappearing just as quickly, when a compilation (typically a file system) error occurs
- Windows: Windows IDE: the Launching Application progress bar is no longer missing part of the bottom edge due to an errant label overlapping it

Framework:
New Features:
- Added ColorGroup support to ChartDataset.DataColor on Desktop, Web and Mobile
- Kanji support has been added to Barcode class for macOS and iOS
- Added an overloaded Database.AddRow(tableName As String, row As DatabaseRow, idColumnName As String = ) As Integer This returns a unique id of the newly inserted row. This API should be preferred over using the more specific SQLiteDatabase.LastRowID and MySQLCommunityServer.LastInsertedRowID which are now deprecated
- Added an IsConnected method to our SQLiteDatabase, ODBCDatabase, PostgreSQLDatabase, and MySQLCommunityServer database classes. This method returns true if the connection is still active, and false otherwise
- String.Characters now returns a String array. This is more optimized than our Iterator approach
- String.Codepoints now returns an array of Integers instead of an Iterable
- Added String.CharacterCount which returns the number of Characters/Glyphs in the string
- Plugins SDK: added REALInsertArrayValuePtr and REALGet/REALSetArrayValuePtr methods
- Added optional Animated parameter to ShowPopover to display the Popover with or without animation. This parameter is supported for macOS, iOS and Linux
- Android: TCPSocket is now available for Android
- Android: ShadowBrush class and Graphics.ShadowBrush property
- Android: Added Graphics.LineCap, LineCapTypes, LineJoin, LineJoinTypes, LineDash, LineDashOffset properties for Android
- Android: Added Graphics.Outline property for consistency with other platforms
- iOS: Added MobileSegmentedButton.LastSegmentIndex As Integer property to match what is on desktop and web
- iOS: #76203 - Added Inline and Compact styles to MobileDateTimePicker on iOS
- iOS: Added HEIC format support for saving Picture instances on iOS; also when used in Picture.FromData and Picture.ToData
- iOS: Now PDFViewer scales the assigned PDF document so it fully fits into the view
- iOS: Added HasInlineLabels property to ChartCircularDataset on Desktop and iOS targets
- iOS: Moved iOS Barcode implementation from iOSFramework to Barcode plugin
- iOS: Added MaximumCharactersAllowed property to MobileTextField and MobileTextArea on iOS
- iOS: Added support for Graphics.CharacterSpacing (62059)
- Linux: Added Barcode support for Linux x86_64 and arm64, which requires at minimum glibc 2.31 (i.e. Ubuntu 20.04 or later) (75841)
- Web: WebButton can now have a different height
- Web: Improved WebListBox performance when using a DataSource on large datasets
- Web: Added WebListBox support for HasBorder and GridLineStyle
- Web: Added support for DefaultRowHeight and HeaderHeight in WebListBox
- Web: Added an option to center WebDialogs vertically
- Web: Added support for ColorGroup in WebMenuItem.TextColor
- Web: Added support in WebPagePanel and WebTabPanel to Add and Remove panels at runtime. Renaming tabs is also possible in WebTabPanel. Web controls PanelIndex property can now be modified, adding support to embed controls in panels, at runtime
- Web: Individual segments of WebSegmentedButton control can have a different Indicator now
- Web: Added support for Control Sets in Web projects
- Web: Added IsGridVisible, IsYAxisVisible and IsXAxisVisible properties to Chart control on Desktop and iOS
- Web: Added a property for WebButton and WebSegmentedButton controls to make them appear outlined
- Web: WebToolbar.Icon doesn't needs to be a square now. Its width will grow as needed
- Windows: DesktopMenuItem.Visible is now supported for Windows. Note: this does not affect the deprecated MenuItem

Fixed:
- XmlNode: getting/setting properties of a non-existent node no longer crashes. This also fixes a crash when viewing the XmlNode in the debugger
- Fixed getting the appropiate values for Graphics.Width and Graphics.Height when PDFDocument.Landscape property is set
- Fixed AutocalculateYAxis for Desktop/MobileChart
- PDFDocument will only ask for the password when opening the generated PDF if the password is set for the User (PDFPermissions), and for the Owner passord if the user tries to do some of the actions disabled in the PDFPermissions settings
- Picture.Constuctor(width As Integer, height As Integer, depth As Integer) now raises a deprecation warning
- ODBCDatabase: iterating the Tables, TableIndexes, and TableColumns now works correctly because we're setting the state of AfterLastRow properly now
- TCPSocket.Flush no longer hangs in an infinite loop when the connection is lost, or when trying to reconnect/listen before Flush finished
- Fixed setting Rect HorizontalCenter/VerticalCenter so that it centers the Rect according to the newly assigned Horizontal/Vertical center instead of being half that
- ODBCDatabase: iterating an empty RowSet no longer enters the iteration loop unnecessarily
- Android: String.Middle() now returns "" when the index and/or length exceed the string in some way. This matches behavior on other platforms
- Android: String.Right() and RightBytes() behavior now matches other platforms
- Android: String.LeftBytes() behavior now matches other platforms
- Android: Fixed a runtime exception that would occur when setting shared property values via introspection
- Android: We now exclude an internal Android table from the SQLiteDatabase.Tables query
- Android: SQLiteDatabase.TableIndexes now returns the correct information
- Android: The column types for DatabaseRow columns that are not yet saved to the database are now correct
- Android: Removed MethodInfo.InvokeReturns from autocomplete as it is no longer needed
- Android: Converting a color value with an alpha to an Integer now has the expected Xojo integer value
- Android: Getting the Int32Value of a ColorValue in a MemoryBlock now matches standard Xojo behavior
- Android: You can now tap into and type text into form fields on pages in HTMLViewer
- Android: Graphics.ClearRectangle should now work properly
- Android: ConstructorInfo.Name now contains Constructor instead of being blank
- Android: TypeInfo.IsArray now recognizes ParamArray parameters as arrays
- Android: TimeZone.SecondsFromGMT now properly accounts for daylight saving time
- Android: Added Graphics.Transparency and MiterLimit properties
- Android: Marked MemoryBlock.Short and UShort as deprecated so that they do not show in autocomplete
- Android: Array.Count(index As Integer) method no longer causes a compile error
- Android: Calling GenerateJSON on a cloned Dictionary no longer causes an exception
- Android: Using Timer.Calllater and CallLaterWithValue delegates as variable types no longer cause a compile error
- Android: TypeInfo.GetMethods() no longer includes Constructors
- Android: Fixed some issues with Introspection, Constructors and IsNull() with a Variant
- Android: Using Object as the For Each loop type when iterating over an iterator now results in more accurate behavior when using IsA
- Android: Fixed a compile error that would occur when subclassing MobileToolbarButton
- Android: Fixed a compile error that would occur when subclassing MobileSegment
- Desktop: DesktopTextField sends the TextChanged event on Windows when clicking the clear button; also, doesn't fire the TextChanged event after pressing the return key
- Desktop: Fixed DesktopSearchField reporting the right value in the KeyDown event for Return / Enter on macOS
- Desktop: DesktopChart Popovers aren't clipped when the Chart area is small
- Desktop: Resizing ListBox columns, while editing a cell, now correctly resizes the editable cell
- Desktop: Assigning a DesktopToolbarButton subclass to a DesktopToolbar now works instead of raising compile errors
- Desktop: Fixed a memory leak when drawing Pictures using PDFGraphics.DrawPicture
- Desktop: No longer leaking MenuBar objects when a Window is closed
- Desktop: DesktopListBox.ScrollPosition is now updated properly when the vertical scrollbar is removed, with rows being removed after, and then the scrollbar is added back
- Desktop: DesktopSeparator now receives MouseDown, MouseDrag, and MouseUp events
- Every OS: Setting the by default background color for DesktopTextArea / DesktopTextField so controls added by code are correctly drawed when using DrawInto, or when these are added to the Window layout
- Every OS: PostgreSQLDatabase: Connect As Boolean is now marked as deprecated in favor of Connect which throws an exception on error
- Every OS: DesktopHTMLViewer now clearly indicates that WebKit is used for HTML rendering on all desktop platforms
- iOS: MobileMoviePlayer displays the the movie controller on iOS 16+
- iOS: Fixed retrieving URLPath from FolderItem saved to Temporary directory on iOS
- iOS: Mobile sharing panel is now centered in the Screen when it is displayed on an iPad
- macOS: Fixed getting the appropiate X/Y coordinates of a window shown as Popover on macOS
- macOS: Setting Window.Visible to True on macOS in a previously hidden window shows it again
- macOS: DesktopContainer returns the expected index on macOS when accessing the TabPanelIndex and PanelIndex properties
- macOS: Fixed a visual glitch when setting a CheckBox cell type in a Listbox during the Opening event
- macOS: Now, DesktopTextField scrolls the view to the visible area on macOS when using SelectionStart method to set the cursor position beyond the visible limits
- macOS: DesktopMenuItems no longer remain enabled (when they shouldn't be) after switching between windows
- Mobile: Now MobileDateTimePicker Calendar is based on user settings on iOS
- Web: Fixed an issue causing some events to lose the WebSessionContext, when using the experimental Send Events in Batches setting
- Web: Fixed an issue causing WebImageViewer to ignore its URL property, when being set from the Inspector panel
- Web: Fixed a WebChart issue causing charts of bar type to be unable to set the grid color option, or font settings
- Web: Fixed a WebFileUploader issue causing its button to ignore raw HTML content
- Web: Fixed a WebCheckBox issue causing the control to be wrongly positioned, when not being locked to the left side
- Web: Fixed an issue causing a horizontal scrollbar to appear in the WebListBox control unnecessary
- Web: Fixed an issue causing WebListBox to be unable to remove rows after changing the column count
- Web: Fixed an issue causing calling applyTooltip() from the Web SDK to raise a JavaScript exception, when the element was undefined at runtime
- Web: Fixed a WebUIControl issue causing setting Width or Height properties at runtime to be ignored sometimes
- Web: Deprecated System.WebCursors in favor of WebStyle.Cursors
- Web: The debugger won't break anymore, when receiving a malformed request for events
- Web: Fixed a WebDatePicker issue that could cause the control to throw exceptions, when the language code wasn't recognized
- Web: Fixed an issue causing the WebFileUploader control to be able to raise the UploadFinished event before UploadStarted
- Web: WebTabPanel.HasBorder can now be changed at runtime
- Web: Fixed an issue causing WebDialogs to not be completely cleared after closing its parent control
- Web: Improved the internal Xojo Web server to make a more efficient use of the CPU
- Web: Fixed a WebListBox issue when trying to get the row tag of a row that has not been shown yet, when using a WebDataSource
- Web: Fixed a WebListBox issue causing the control to ignore selecting the first row, when using DataSources with zero based PrimaryKey
- Windows: Labels, on a TabPanel, no longer longer draw with an incorrect background color when a high contrast theme is selected
- Windows: Popover window no longer shows up in the taskbar when DesktopWindow.ShowPopover is called
- Windows: Fixed getting the proper font descriptor for PDFDocument on Windows when setting the Bold property for the same font name
- Windows: DesktopSearchField fires the TextChanged event on Windows after pasting text
- Windows: Popovers, initiated with DesktopContainer.Popover, now appear over global floating windows. Popovers that are initiated with DesktopWindow.Popover now appear over global floating windows only if the DesktopWindow.Type is set to Global Floating Window
- Windows: Graphics.Rotate now correctly draws items at the correct position when printing
- Windows: Locked controls no longer lose their positions when the DPI changes
- Windows: In specific cases where you need to draw the outline of the text on top of already rendered text, we've added the ability to opt into this specific way of rendering text by setting up the XOJO_GRAPHICS_DRAWTEXT_MODE environment variable. A value of 1 will enable Graphics.DrawText to render the text with similar metrics, regardless of whether Outline is enabled or not. This environment variable must be setup before the Graphics object is instantiated
- Windows: The RadioButtons in the DesktopRadioGroup now honors the transparency setting
- Windows: Graphics.DrawText now properly renders colored emojis on Windows and Linux. This also affects the ListBox output as well

Compiler:
Fixed:
- Static variables, of the same name, in overloaded methods are no longer treated as a single variable between the various overloaded methods. Static variables are independent within their scope, even for overloaded methods, as they should be
- Toolbar: assigning an Icon to a Toolbar button no longer throws a compile error if the name of the Picture conflicts with a property of the same name (such as Index)
- Android: CType usage with Boolean and numeric constants no longer causes a compile error
- Android: Introspection.MethodInfo.IsShared is now correct for shared methods
- Android: Fixed a compile error that could occur when using Me or Self in Container events
- Android: Fixed a compile error that could occur with methods that had attributes
- Android: Fixed a compile error that could occur with methods on a screen that declare a multidimensional array parameter
- Android: Fixed a compile error that would occur when assign an enum value to a variable
- Android: Fixed a compile error that could occur when using ByVal on some module methods
- Android: Fixed a compile error that could occur with Delegates that specify parameter default values
- Android: Fixed a compile error that could occur when using Color default values in a method declaration
- Android: Fixed compiler issues related to casting to interfaces within modules and casting to MobileSlider
- Android: Fixed some compile errors related to casting to MobileUIControl and when parsing hidden class members
- Android: Fixed an issue when using AddHandler to call an event method that is not on the class itself
- Android: Display a better compile error message when there is a type mismatch error caused by incompatible Declare syntax
- Android: Shared computed properties now work properly


Xojo 2024 Release 1.1
Highlights:
- Building for Linux is now included in the free IDE
- Lite licenses can now save in Version Control format
- Popovers for iOS, Desktop, and Web projects
- Creating / scanning Barcodes for macOS, Windows and iOS projects
- SQLite updated to 3.45.1
- Updated iOS SDK to 17.2
- Zip now includes standard password support
- Font and Font Size can now be set independently for the debugger
- Plugins can now include external shared library dependencies

Statistics:
- Bugs fixed: 7

IDE:
Fixed:
- Debugger: the globals Window list now includes all instantiated windows, and not just the front most window

Framework:
Fixed:
- Linux: MoviePlayer.AutoRepeat now works correctly to start playing the movie from the beginning, instead of at some random point in the movie
- macOS: Now Barcode.Image honors the Height on macOS and iOS when the barcode type is set to Barcode128
- macOS: Now a CheckBox celltype updates correctly its visual state when the user clicks on it and the DesktopListbox is displayed in a Popover window on macOS.
- macOS: Fixed click x/y coordinates for DesktopListbox and DesktopCanvas on macOS when instances of these are displayed in a Popover Window. This was impeding right selection of the clicked row and reordering rows in a DesktopListbox; plus offering the right value for Y coordinate on DesktopCanvas.
- macOS: Round button style on macOS looks now right again at runtime on macOS
- Windows: Popovers no longer exhibit a translucency effect, which affected the background color setting


Xojo 2024 Release 1
Highlights:
- Building for Linux is now included in the free IDE
- Lite licenses can now save in Version Control format
- Popovers for iOS, Desktop, and Web projects
- Creating / scanning Barcodes for macOS, Windows and iOS projects
- SQLite updated to 3.45.1
- Updated iOS SDK to 17.2
- Zip now includes standard password support
- Font and Font Size can now be set independently for the debugger
- Plugins can now include external shared library dependencies

IDE:
New Features:
- Added PasswordField to the Library on iOS and Android, so it is consistent with Desktop and Web
- Deprecated interfaces are no longer listed in the Interfaces dialog list, unless already implemented
- Added a new Preference so the user can set the Font / Font Size used by the Debugger panel
- Removed various unused iOS related resources from the Windows/Linux IDE

Fixed:
- Help text area background color properly updates when changing Dark/Light mode
- Duplicating a GroupBox on a TabPanel now properly duplicates its child controls
- Allow controls on a panel of TabPanel/PagePanel to be copied and then pasted onto a different panel, instead of being copied onto the same panel they were copied from
- Now it is possible to set the name of a control instance to the same name of a class created in the project
- Prevent an IllegalCastException that could occur in some situations when copying a database project item to another project
- Debugger variable listbox columns can no longer be resized to 0 width
- Added a new check when adding new enum items, so they can't start with a number or sign, or contain non alphanumeric characters when the previous rules are meet
- Prevent code block selection from changing in some situations when expanding/collapsing the block
- Avoid an OutOfBoundsException that could occur when adding blocks to existing code
- Unified ColorGroup editor in the Inspector Panel for iOS projects, so it is the same used in Desktop / Web projects
- The code editor autocomplete no longer mistakenly colors object property/method names that start with REM
- Brought back the limit to display only last 1500 messages in the Messages Panel. Also added an option in the Messages Panel to save the full list of messages to a file, not just the last 1500 ones
- ProjectConsole, ProjectDesktop, ProjectWeb, ProjectiOS methods for use with Code Asssistants now work properly. Added ProjectAndroid and ProjectMobile now returns True for iOS or Android
- To better match standard macOS behavior, on Ventura and later the Settings window title bar text now reflects the name of the setting group that is selected
- Fixed a NilObjectException when trying to paste other content than a picture from the Clipboard in the Icon Editor
- Avoid an OutOfBoundsException when double-clicking in an empty area of the Inspector Behavior property list
- Avoid an OutOfBoundsException that could possibly occur when changing signatures of overloaded methods
- Fixed an OutOfBoundsException that could occur when processing doc entries for some properties on nested modules
- Fixed a OutOfBoundsException that could possibly occur when dragging code in the code editor
- Fixed a possible exception that could occur during IDE searching with Match Case selected
- Fixed an OutOfBoundsException that could possibly occur when reordering Structure fields
- Debug runs now always use Default optimization level (aka no optimization). This prevents odd debugging behavior. The Optimization Level setting will now only be used when Building
- Fixed an OutOfBoundsException that could occur when typing (or pasting) unusual text into the Constant Editor name field
- Reduced the time it takes to duplicate controls in a large control set
- Avoid a NilObjectException that could occur when stopping the debug run of an app while things are still starting up
- Attempt to avoid a NilObjectException that could occur when adding a control from the Library to a layout
- Avoid a NilObjectException that could occur when there is a startup/connection error when launching an iOS app
- Attempt to avoid a NilObjectException that could occur when drawing resize handles in the layout editor
- Attempt to avoid a NilObjectException that could occur when adding an event handler
- The contrast has been increased in the Add item icon from the Toolbar editor in the IDE, so it doesn't look like disabled
- Fixed a possible exception that could occur when the IDE (or a project window) is closed while debugging
- Fixed an issue where some changes made to a control, for Web projects, did not get saved properly
- We now clear out all the Plugin cache if just one of them has changed, since this one change may also affect other related Plugins too
- Prevent NilObjectExceptions from occurring in certain situations where the Navigator tries to display an item that does not exist
- Attempt to fix an exception that could sometimes occur when shutting down the IDE while debugging
- Attempt to fix an unreproducible exception that occurs for some when switching to show a layout editor
- In the Layout Editor, when dragging or resizing controls these keyboard keys are now ignored: Enter/Return, Tab, arrows. Previously these were processed leading to odd behavior and the occasional exception (particularly with pressing tab)
- Fixed a NilObjectException that could occur when entering an invalid Xojo Cloud app name
- Prevent a desktop menu bar from being dragged to a non-desktop project. Prevent a Color Group from being dragged to an Android project
- Autocomplete no longer shows Delegate methods that are marked as Hidden
- The Code Editor doesn't display cropped the last line of a long method when the code is displayed while debugging
- Debugger no longer crashes when viewing the contents of an object that is going out of scope
- Android: Code signing an Android app on Windows for the Google Play Store is now working again
- Android: Debugger is now better able to display information about some end-user classes
- Android: Android Debug Device list no longer shows a useless INFO entry when newer versions of Android Studio are installed
- Android: Fixed regression on iOS projects that was impedding to set the super of a ContainerControl to another ContainerControl class
- Android: Fixed an issue with resizing Android container controls that could cause an IDE exception
- Android: MobileScreen in the Android Library now has a contextual menu to create a subclass
- Android: Stopping the Android debugger while it is in the processing of starting up no longer causes an IDE exception
- Android: Dragging the resize handles of a MobileScreen (which does not change the screen's size) no longer adjusts the size of controls that are locked to the screen's edges
- Android: Fixed an exception that could occur with some Android compilation errors when building a standalone app
- Android: Now display a better compile error if the Java version needed for Android is incorrect. Clearing the cache (from Preferences) also clears additional Android cache folders which can sometimes cause odd compile errors when they get stale
- Android: Non-UI controls added to a screen now display a standard compile error if there is no public constructor
- Android: Prevent pasting of desktop controls, web controls and unsupported controllers onto a MobileScreen
- Android: Attempt to avoid a possible NilObjectException that might occur when terminating an Android debug session as it is starting up
- Android: iOS launch image can no longer be pasted into an Android project
- Android: An iOS Icon project item can no longer be pasted into an Android project
- Android: iOS Notification Center can no longer be pasted into an Android project
- Android: An iOS Layout can no longer be pasted into an Android project
- Android: Desktop toolbars can no longer be pasted into Android projects
- Android: A desktop report project item can no longer be pasted into an Android project
- Android: Worker project items can no longer be pasted into Android projects
- Android: Debugger tracks variable scope better and no longer attempts to show a variable value that is out of scope, which would sometimes result in the wrong value being shown or the debugger crashing
- Android: The running app no longer crashes when the debugger tries to display a value for a computed property that has raised an exception
- iOS: Now the LayoutEditor displays the text as hidden for MobileTextField on iOS when the Password property is set to True
- iOS: Within the Library on iOS, creating a new subclass using the contextual menu from the Screen icon now sets the correct superclass of MobileScreen
- iOS: Fixed misspelled TextArea/TextField.SelectionLength on iOS
- Linux: Prevent a NilObjectException that could sometimes occur when the layout editor is resized
- macOS: Fixed DesktopButton with Round style being displayed clipped on macOS (layout and runtime)
- macOS: Improved the response to edit the entries of the Segmented and TabPanel controls in the Inspector Panel via double-clicking the listbox cells in their respective Editors
- macOS: Fixed the Inspector tip crashing the IDE when it is shown under macOS Sonoma 14.3
- Web: For Web projects, changing the Super of a control now properly updates the inspector to reflect this new change
- Web: Fixed an issue causing Unparented controls to be assigned to the closest WebView, when re-loading the project
- Web: Fixed an IDE issue happening when saving and loading Web projects with nested controls. Some properties weren't working after reloading, affecting also these controls at runtime
- Web: Fixed a compilation issue happening when using Localized String Constants in the WebRadioGroup.InitialValue property
- Web: Fixed an IDE issue causing an unneeded high CPU usage, when working on Web Projects
- Web: Fixed a bug when previewing some type of buttons in the IDE, when the Enabled property was set to False
- Web: The WebButton preview in the IDE will display an ellipsis, if the button is too narrow, to match what will happen at runtime
- Windows: Remote Debugger CheckBox label is now readable when in Dark Mode
- Windows: Windows IDE: the label heading on the Copy Files Build step editor is now readable in dark mode
- Windows: Fixed an unhandled NilObjectException that was raised in Document.GetScratchDir
- Windows: Reduced the amount of file access that occurred when moving controls and typing in the code editor. This should help improve the overall experience while performing these tasks
- Windows: IDE no longer crashes depending on what controls are on the layout and when tabs/windows are closed
- Windows: Adding a double ampersand (i.e. &&) to a multiline label now renders correctly to a single ampersand in the layout editor. This also affects calls to Label.DrawInto
- Framework:
- New Features:
- Deprecated all the numeric (Double, Integer, etc.) FromText functions in favor of FromString
- TextShape: deprecated Value in favor of Text
- Added a wait for silence time to Barcode scan on iOS, so code reads are not sent in a row when scanning the same code
- Added DatasetLastIndex and LabelLastIndex properties to Desktop/MobileChart
- Added Datasets and Labels methods to Desktop / Mobile Chart to iterate over all the Datasets and Labels of a Desktop / Mobile Chart instance
- Reduce PDF file size when the same File Attached annotation is used more than once in the same document
- Updated SQLite library to 3.45.1
- EncodeBase64 now returns a string whose text encoding is set to UTF8 instead of ASCII
- FolderItem.Zip/Unzip now supports the standard (ZipCrypto/PKWARE) Zip/Unzip password encryption
- Desktop: Added RemoveControl(control As DesktopUIControl/DesktopContainer) to DesktopWindow and DesktopContainer
- Desktop: Removed unused DesktopMoviePlayer.PlayerType property
- Every OS: Added FolderItem.RemoveFolderAndContents. Unlike FolderItem.Remove, this function will recursively remove the folder and all of its contents
- Every OS: Added FolderItem.Extension property to get/set the file extension of a file
- Every OS: Added String.ToBoolean extension method. This will return True if the string contains 1 or True and False otherwise
- iOS: Constraints added automatically to a MobileContainer shown as Popover
- iOS: Overloaded ShowPopover method on iOS so it accepts a MobileToolbarButton as its parent control
- iOS: Fix in MobileChart to deal with NaN values in Datasets (Line, Bar, Scattered, Bubble)
- iOS: Added Barcode class to iOS
- macOS: Now the user can mirror the video stream of the Barcode scan UI on macOS
- macOS: Added Barcode class support to macOS (creating QR / Bar128 codes, and scanning images)
- Web: Added WebMenuItem.PopUp to display a contextual menu programmatically, like in DesktopMenuItem
- Web: Added WebChart.Datasets and WebChart.Labels iterators, and the WebChart.LabelCount read-only computed property
- Web: Added RemoveControl(control As WebUIControl) to WebView
- Web: WebResponse will attempt to use a memory buffer now, if possible, instead of temporary files
- Web: Added WebContainer.ShowPopover, to display custom popovers

Fixed:
- The deprecated Variant.TypeDate and TypeText no longer shows up in auto-complete
- Assigning a DateTime object, to a subclass of a DateTime, now correctly preserves the nanoseconds
- Fixed DesktopChart in Line mode leaving a blank area to the right
- MySQLCommunityServer: ExecuteSQL/SelectSQL now returns a more useful error code on failure (instead of always -1), especially if the connection to the database server was lost
- ODBCDatabase.BeginTransaction no longer prevents table creation
- Fixed getting TextHeight with additional WrapWidth paramenter in PDFDocument graphic context
- Android: MobileContainer now resizes properly when locked to bottom of screen
- Android: Column names accessed on RowSet or DatabaseRow are now case-insensitive
- Android: TabPanel contents are now shown for tab panels that are on containers
- Android: Prevent an exception when attempting to display large images in MobileImageViewer
- Android: MobileImagePicker.Show now better matches iOS. Removed unused Constructor from autocomplete. Note that the Show parameter is not actually used on Android
- Android: Fixed a runtime exception that could sometimes occur when an Object variable becomes Nil
- Android: Fixed a startup crash that could occur when using System.DebugLog in the constructor of a container
- Android: Introspection no longer reports doubled method and properties on MobileScreens
- Android: MobileScreen.Size and ContentSize now more accurately exclude the status bar size
- Android: Introspection.TypeInfo.BaseType property now reports correct values for mobile classes and controls
- Android: Force MobileHTMLViewer to ask for focus when page loads to avoid possible issues with software keyboard not allowing input on some web sites
- Android: MobileTabPanel animations now run after the PanelChanged event has completed
- Android: Introspection.PropertyInfo.Value now properly uses the base parameter
- Android: MobileLocation requires Google Play Services (GPS). Added more checks to ensure that location access via GPS will work. Failure results in the state being set to AuthorizationStates.Restricted
- Android: Fixed an issue with calling certain Methods that have the same name as a Property on a class
- Android: Added MemoryBlock.Operator_Add to match other platforms
- Android: When URLConnection.AllowCertificateValidation is False, also skip checking host verification to match how other platforms work
- Android: Attempting to create a New MobileToolbar now displays a standard compile error instead of an internal Android compile error
- Android: Fixed an issue when using a For Each loop with certain ParamArray parameters
- Android: To match behavior on other platforms, Variant math operations using Nil no longer cause an Android compile error and instead raise NilObjectExceptions at runtime
- Android: TypeInfo.Name and FullName are now correct for MobileScreens
- Android: Multi-dimensional arrays now return the correct value with VarType
- Android: VarType on a currency array now returns the correct value
- Android: Fixed an issue where DatabaseColumn.NativeValue/BlobValue could have the wrong number of bytes
- Android: JSONItem.IndentSpacing now defaults to 2
- Android: With a DatabaseRow that is not connected to a RowSet, column value changes are now properly retained and retrieved
- Android: DatabaseRow.ColumnCount and LastColumnIndex are now correct for rows that are created manually
- Android: RowSet.ColumnType now returns 5 for SQLite TEXT/STRING/VARCHAR columns to match behavior on other platforms
- Android: BinaryStream.ReadCurrency now turns correct currency value
- Android: BinaryStream.ReadPString method no longer causes a compile error, but it does raise an AndroidException at runtime since PString is not a supported type
- Android: BinaryStream.BytePosition is now properly updated when reading data
- Android: BinaryStream.ReadUInt8 now returns the correct value
- Android: TextInputStream.BytePosition is now updated after calling ReadAll
- Android: MobileApplication.Actived and Deactivating events now work on Android
- Android: To match behavior on other platforms, added MemoryBlock.Long, Short and UShort methods
- Android: To match behavior on other platforms, adding two Nil values to a Variant now raises a NilObjectException
- Android: FolderItem.Locked return value is no longer reversed
- Android: Screen startup event order is more consistent across devices
- Android: Calling SQLiteDatabase.CreateDatabase with a file in an invalid location now properly raises a DatabaseException
- Android: Removing controls from MobileContainers now works properly
- Android: To match desktop behavior, added MobileTabPanel.AddPanelAt() method
- Android: To match other platforms, calling SQLiteDatabase.ExecuteSQL with an empty SQL string now does nothing instead of raising a DatabaseException
- Android: Added MobileContainer.Objects iterator
- Android: Encodings.DOSGreek1/MacDevanagari/MacEthiopic/MacExtArabic/MacGaelic/MacGeorgian/MacGujarati/MacGurmukhi no longer cause compile errors
- Android: Locale.CurrencySymbol has been updated to better match what is returned on other platforms
- Android: GenerateJSON now handles dictionaries with nested arrays properly
- Android: Fixed a compile error when using Point.DistanceTo
- Android: Fixed a compile error when using Encodings.MacDingbats
- Android: Fixed a compile error when using Encodings.MacRomanian property
- Android: Exceptions that occur within the framework now generate a more useful stack trace. Also fixed an unhandled internal SQL exception that could occur when trying to commit without a transaction
- Android: Internal RowSet properties no longer are shown in the Xojo debugger
- Android: URLConnection.SendSync() now works better with binary data. Send() now handles some text data better
- Android: Fixed a runtime exception that would occur when trying to get the value of a shared property
- Desktop: DesktopMenuItems now correctly honors the AutoEnabled state, especially when set to False
- Desktop: To match docs, DesktopListBox.CellTextAt() now accepts -1 to refer to an entire row, column or both
- Desktop: DesktopListBox: dragging an already selected row that contains an TextField/CheckBox CellType now works, instead of entering editable mode
- Desktop: Tabbing into a DesktopTextField that has a format applied to the Format property has the same behavior than when Format is empty
- Every OS: DateTime.FromString no longer throws an InvalidArgumentException when the date (without a time specified) falls within the DST transition period
- Every OS: The Pressed event has been renamed to ValueChanged on DesktopDisclosure to keep consistency with other controls. You will need to manually move your event code to the new event
- Every OS: DesktopContainer: no longer raises a Resized event before the Opening event is fired. Note: this change does not affect ContainerControls
- Every OS: Updated Integer ToHex/ToBinary/ToOctal to return String instead of Text
- iOS: Fixed an odd behavior taking place under certain circumstances when executing JavaScript on an HTMLViewer instance on iOS
- iOS: The iOS Layout honors the Dark Mode / Light Mode set on macOS, so the ColorGroups assigned to the iOS controls are correctly displayed in the Layout Editor
- Linux: Playing sounds no longer crashes on newer versions of Linux (like Ubuntu 23.10), or Raspberry Pi5
- Linux: MoviePlayer no longer crashes on newer versions of Linux (like Ubuntu 23.10 or Raspberry Pi5). However, Wayland is not supported so you will need to disable Wayland to play movies using our MoviePlayer. As an alternative you may be able to play movies using our HTMLViewer instead
- Linux: Rotated StringShape, on a Canvas/Windows Graphics, no longer draws at the wrong position
- Linux: Threads no longer eat up 100% CPU, unless the thread Priority is set to 9 or higher
- Linux: The default System font no longer looks condensed on Ubuntu 23.x
- Linux: MySQLCommunityServer can now connect to servers that require versions of TLS that is greater than 1.0 (69197)
- macOS: macOS/iOS: String functions (Left/Mid/Right/etc.) no longer uses the system encoding to do its calculations when the String.Encoding is Nil
- macOS: Calling DesktopWindow.Minimize no longer raises the Minimized event twice
- macOS: For exceptions that are triggered from a Plugin (like RegEx), the IDE now properly shows the function call stack on M1 Macs
- macOS: Assigning new Text to a DesktopTextField now maintains the current selection on Windows/Linux. This now mimics the same behavior as macOS
- Web: Fixed some reported memory leaks in the Web Framework
- Web: Fixed a WebView.Controls issue causing this iterator to return also non-visual WebSDK controls
- Web: Fixed some WebView issues causing Controls, ControlAt, ControlCount and LastControlIndex to ignore controls inside other views, like tab panels or rectangles
- Web: Fixed a WebFileUploader issue preventing the Caption property to be updated at runtime
- Web: Fixed a WebMenuItem issue causing empty row height to be much smaller than others
- Web: Fixed a WebFileUploader issue preventing the end user to drop a file into the browser control, at runtime
- Web: The Web framework won't cut the connection too early anymore, when the user is uploading a file with WebFileUploader
- Web: Fixed a WebPopupMenu issue that was causing the focus to jump into another dropdown menu, when navigating using the keyboard
- Web: The Web SDK won't discard duplicated events anymore, when using triggerServerEvent method
- Web: When navigating the layout using the keyboard, hidden WebViews won't receive the focus anymore
- Web: Fixed a WebTimer issue causing the control to ignore its Enabled property from the inspector
- Web: The web framework will prevent displaying multiple WebMessageBox above each other, when quickly pressing Enter/Esc key repeatedly
- Web: Fixed an issue causing some Web SDK controls to not appear inside WebTabPanel or WebPagePanel views
- Web: WebPopupMenu will display the focus ring now, when it receives the focus
- Web: Fixed a WebStyle bug causing AddTransition with a delay to use a wrong value
- Web: Calling SetFocus on a WebControl will wait the control to be rendered, if needed, before trying to set the focus
- Web: WebSearchField will raise TextChanged and Pressed events when the user clears the field with the clear button
- Web: Fixed a few tab engine issues that wasn't detecting the focused control, in some kind of Web SDK controls
- Web: Setting WebListBox.SelectedRowColor at runtime won't make the whole control to refresh, it will just set the new color
- Web: Fixed a WebFile issue that was raising a NilObjectException, when trying to get the underlying file from an unknown Session
- Web: Fixed an issue causing WebMapViewer.LocationSelected to pass a wrong WebMapLocation object
- Web: Fixed an issue causing the web framework to unnecessary keep in memory a temporary file path for 2 hours in some places, like in the WebApplication.HandleURL event
- Web: WebCanvas inside a WebTabPanel will be rendered faster now, when switching between tabs
- Web: Fixed an issue that could cause WebResponse.Write to raise a NilObjectException in some situations
- Web: Fixed an issue causing WebView children, like a WebDialog, to raise the Shown event before it was actually visible
- Web: Fixed the WebRequest.MIMEType issue where the value was always returning text/html, instead of the actual value
- Web: Fixed a WebListBoxImageRenderer issue that was causing HiDPI images to be shown larger than it should
- Web: WebLink.TextAlignment will also be applied when the WebLink button style is used
- Web: Fixed a WebView issue causing subclassed items to position their controls based on their super class dimensions
- Web: Fixed a WebCheckbox vertical alignment issue, causing the checkbox to appear far above than we want, when embedding the control at runtime
- Web: WebContextualMenu arrow indicator for submenus are vertically centered now
- Web: Fixed a WebSegmentedButton issue causing Enabled to not be applied at runtime. The whole control or individual segments can be disabled now
- Web: WebPopupMenu can now make use of localized constants when using the Initial Value property
- Web: Fixed a WebMessageDialog issue causing the event handlers to not be properly configured when being created with code at runtime
- Web: Modified the WebMessageDialog look and feel to match the current Bootstrap 5 guidelines
- Web: WebMapViewer can be disabled now, allowing the developer to disable user interactions on the map
- Web: Fixed a WebImageViewer issue causing updating the URL parameter to be ignored when the Image property wasn't empty
- Web: Fixed an issue causing WebUIControl to not be able to update the original Tooltip at runtime
- Web: Fixed an issue causing every new web app session to be leaking some memory
- Windows: Graphics.DrawText with Outline enabled, now properly outlines the text using fonts that are weighted (i.e. the boldness level) more heavily, like Arial Black
- Windows: Iterating through the SerialDevice list no longer causes the serial ports to be temporarily open
- Windows: Prevented multiple instances of a Popover window to show before one is completely closed
- Windows: Windows/Linux: a RuntimeException is now raised (instead of an assertion), if the Resources folder cannot be found while attempting to load up all the picture resources that were added to your project
- Windows: The DesktopUIControl.ConstructContextualMenu event no longer incorrectly fires a second time immediately after the first on various controls, like the DesktopTextArea, DesktopPushButton, etc
- Windows: DesktopChart.DrawInto no longer throws an UnsupportedOperationException on Windows/Linux
- Windows: A TextArea, that's hidden behind a non-visible page/tab of a PagePanel/TabPanel, no longer reveals itself when retrieving the StyledText.RTFData
- Windows: ODBCDatabase: storing and retrieving large BLOB values now works properly instead of raising errors or being truncated
- Windows: Window is now resized/positioned correctly when entering fullscreen mode, instead of being offset at the top and leaving visible gaps near the bottom
- Windows: DesktopNotePlayer: the Drum Kit instrument now works correctly, instead of sounding like a piano
- Windows: DateTimePicker.DrawInto now renders the control instead of drawing nothing
- Windows: TabPanel.DrawInto no longer fails to draw all controls when a DisclosureTriangle exists on the current tab
- Windows: Implemented support for TabPanel in Dark Mode
- Windows: App no longer locks up when a modal dialog is displayed while a drag is in-progress
- Windows: Passing in an (X, Y) offset to DesktopWindow.DrawInto now offsets Canvas drawing correctly

Compiler:
New Features:
- Updated iOS SDK to 17.2
- Plugins: additional library dependencies can now be included along with your plugin shared library. This allows you to include external shared library dependencies without having to build it into your main library. Refer to the Plugin Package Format in the Plugins SDK documentation for more details
- Resolved Issues:
- The deprecated Variant.DateValue no longer shows up in auto-complete
- The deprecated Variant.TextValue no longer shows up in auto-complete
- Windows app name that contains an ampersand can now be built/run properly, instead of the app not being able to launch at all
- The DateTimePicker plugin is no longer included for all built apps, unless of course it's being used
- Compiler now raises an error when it encounters enumerations that share the same name, but with different types, while rendering Windows/Controls for Desktop apps, instead of running into failed assertions at runtime
- A compile error is now raised (instead of an assertion) if we were unable to create a build folder during the compilation process
- Calling Array.Pop, on an array of Structures, no longer returns the wrong data or throws an OutOfBoundsExceptions incorrectly for ARM64 builds
- Assigning an Array of Structures (using the Array keyword) now populates the Array correctly for ARM64 builds
- Android: Fixed a compile error that could occur with some expressions within a single-line If
- Android: Fixed a compile error that can occur when overriding a method from a superclass that is not the immediate superclass
- Android: Clarified the Android duplicate method overload compiler error message and fixed an issue where arrays where not being treated as separate types when checking for duplicate method overloads
- Android: Fixed an issue when using the Array function while casting the first value
- Android: Fixed a compilation issue where some methods named like operator overloads didn't match the expected signature
- Android: Fixed an issue where certain Kotlin declares could require an unnecessary extra parenthesis
- Android: Fixed an issue when assigning certain variables initialized with Global to other values
- Android: Fixed an issue when defining certain Constants while using Global
- Android: Fixed an issue with certain uses of Global with Constructors that have parameters passed in
- Android: Fixed an issue with certain Classes that have a ParamArray in their Constructor
- Android: Fixed an issue when calling a MobileScreen Constructor from within that MobileScreen, and fixed an issue when accessing certain Class Constants from outside the Class
- Android: Fixed an issue when using an empty enumeration as a method parameter type
- Android: Fixed an issue with method parameters that use Global.Variant/Object
- Android: Fixed an issue when calling certain methods with a Variant/Object ParamArray type
- Android: Fixed an issue when using other Array methods on a ParamArray parameter
- Android: Fixed an issue when using certain Array methods on a ParamArray parameter
- Android: Fixed an issue when using certain expressions when defining constant values in code
- Android: Fixed an issue with using class constants from a shared method
- Android: Fixed certain uses of Object arrays when used as parameters
- Android: Fixed an issue when comparing certain String properties with explicit Variant.StringValue calls
- Android: Fixed an issue with using some Operator overload names in a module, as well as using App as a name of a parameter
- Android: Project Item Number Constants no longer cause a compile error if they don't have a specified default value
- Android: Fixed an issue when declaring certain Arrays with &b/&h/&o literals
- Android: Fixed an issue when declaring a single dimension array after a multi dimensional array in the same line
- Android: Fixed an issue when using Me/Self as a value during certain variable initialization
- Android: Give a clearer error message if you try to use Object with GetTypeInfo
- Android: Fixed an issue with certain multiple uses of IsA inside of a single If expression
- Android: Fixed an issue when using Raise with an Event that returns an exception
- Android: Prevent duplicate compile errors from being shown
- Android: Display a friendlier error message when there is an unknown/unresolved reference, which can happen with object Declares
- Android: Verify that the first part of the bundle ID is not the same as the App name as that can cause an Android compile error
- Android: Variables used inside or with certain for loops are now visible in the debugger
- Web: Fixed a WebListboxCellRenderer bug causing the project to refuse to compile when creating subclasses inside a Module

Documentation:
Resolved Issues:
- The Use WinUI (experimental) build option has been documented
- The code samples on the various Object2D subclass pages have been made more clear
- Added a note to Mutex.Constructor to make it clear that the name passed will be used to create a file and therefore must be a valid filename for the host OS
- MobileApplication.CurrentScreen is now documented

Examples:
Resolved Issues:
- Passing an empty Value to Barcode.Image now raises an InvalidArgumentException instead of crashing on Windows


Xojo 2023 Release 4
Highlights:
- A more responsive IDE
- Reduced build times
- Debug and built apps run faster
- Xojo web framework optimized for speed
- Plugins load more quickly
- Android Barcode Scanner Class
- Example projects now feature descriptions and new search functionality

IDE:
New Features:
- Added 'Path' entry to the information displayed when an Example Project is selected in the 'Choose a Project' panel
- Increased the Debugger by default font size to 11 points
- Now the IDE's Messages panel only displays the items matching the text typed in the Search control for better clarity
- Changes to the IDE's Debugger panel so it uses the same font size set for the Code Editor; and accesing the String debugger panel double clicking on the value row. Also other have been made to the String Debugger panel, removing the Edit Tab because now it is possible to set a new value for the string directly in the Text Tab, plus reorganizing the controls under the Text tab for a better use of the available space
- Added AllowPopover property to the Inspector Panel on DesktopChart to unify with WebChart
- Web: Layout editor preview won't render dark mode anymore in Web Projects, if the Supports Dark Mode option is turned off
- Web: Reduced the compile time when building Web projects
- Windows: Windows/Linux IDE: the default shortcut key for the Edit->Delete menu is now Del instead of Ctrl+Bksp on Windows and Bksp on Linux

Fixed:
- Plugin declared Delegates now have their compatibility flags setup properly
- For consistency, we no longer dim the layout editor when bringing up the XAML Chooser window since we're not editing the XAML content in place, only bringing up a dialog
- Changes to Plugins are now more accurately tracked so that our Plugin caches are cleared when they need to be. We also do a bit less caching when Plugins are loaded, with the side benefit being slightly faster Plugin loading times
- Fixed alignment of the Clear button in the Messages panel on macOS
- Code Editor Context Menu Go To scrolls the code editor to the matching line
- The Pragma reminder to implement interface methods no longer has an extra space and the #Pragma Error part honors the coding preference for Applies Standard Case
- Running a project remotely, by using the menu shortcut, no longer adds extraneous characters to the code editor
- Restored the ability to filter Window controls by name in the debugger
- We no longer include extraneous HTMLViewer resources when a Window, that contains an HTMLViewer, is not being used/referenced (i.e. when the linker has dead stripped the Window) for Windows/Linux builds
- The deprecated MSSQLServerDatabase plugin is no longer packaged in the Plugins folder. If your project still depends on this class, the plugin still exists in the Database Plugin Resources folder, found in the Extras folder
- Fixed an OutOfBoundException when adding an image to the IDE Navigator via drag & drop
- Debugger now displays generic Object variables again
- Selecting a recent search item in the IDE's Search Panel Recent Searchs menu offers the expected behavior, even if the user's preferences is set to Find/Filter Results appear After Pressing Enter or Return
- Avoid an OutOfBoundsException that can occur when pasting into the code editor when the paste buffer contains an empty string
- Fixed creating a new iOS project being marked as dirty
- Fixed: Minimum width set for the Tab Order Editor Window in the IDE
- Fixed loading user defined defaults for controls added to the IDE (74348)
- Fixed Listbox Inspector Properties bleeding through Under Inspector Header in the IDE on macOS when DarkMode is enabled
- Fix so the Enumeration editor does numbering elements correctly
- Android: Fixed an Android app crash that would occur when viewing the App object in the debugger
- Android: On macOS when debugging with an Android emulator, bring the emulator to the front when resuming
- Android: Android apps no longer show DebugLog messages from prior app runs
- Android: Fixed an internal exception that could occur when calling Timer.CancelCallLater
- Android: If an app icon cannot be converted to PNG during