Check for has :Weather returns true although API level 3.1 doesnt have it

Hi,

I´m a little confused right now.. I initialize hasWeather with false and print it. After the check I print it again and it states true even if the simulated device is API 3.1 or lower.

System.println("########### WEATHER "+ hasWeather);
hasWeather = (Toybox has :Weather);
System.println("########### WEATHER "+ hasWeather);
Console Output:
Background: ########### WEATHER false
Background: ########### WEATHER true
  • Yes it is without music - s60 like suggested above does the same thing. 

  • It's basically there with "supported devices".  In the case of Weather, it became available in CIQ 3.2, but there are exceptions.  While the f5+ devices have 3.2, they don't support Weather.

  • Jim, it's not there! You keep saying it's there and I keep explaining it isn't there: From https://developer.garmin.com/connect-iq/compatible-devices/ or any other source I am aware of there's no way to know what is the MINIMUM possible CIQ version for a device (like what is the lowest possible version if you'll get a watch from the factory, from the 1st batch)

  • Check the doc in the SDK and not what you see online as I've said before.  The online doc doesn't show supported devices, but the doc in the SDK does.

  • I'm really not seeing why the min is so important to you.  If it's too low for your app, the store displays a message and the app can't be installed.

  • That is one way to use this information if you have it. Another way to use it is what I want:
    instead of having code like: 

    if (Toybox.Application has :Properties) {
        // foo
    } else {
        // bar
    }

    I'd like to set in monkey.jungle the minimum CIQ version for each device and then my code becomes:

    (:api_2)
    function x() {
        // foo
    }
    (:no_api_2)
    function x() {
        // bar
    }

    which first and foremost saves a few bytes in the code and also makes it run faster.
    But this can only be done safely if we know the MINIMUM possible CIQ version for each device.
  • I think you need to get a better understand of how things work.  What "Since: API Level" means, and what "Supported devices" mean.  Seems you are the only one in 7+ years having this issue.

    Maybe play around with "has" to understand that.  It's at the very top of my toolbox when it comes to multi-device/multi CIQ level support.  Loom at devices with the same CIQ level, but that have a baro or don't  You need to handle that.

    If you are worried about a few bytes here and there, you really need to look at your code over all.  You never want to be too close to the edge, where a few bytes is make it or break it.

  • I'm curious about something which Garmin has never addressed, to my knowledge.

    Considering that System 5 is:

    - For devices with API level 3.X: API level >= 3.3

    - For devices with API level 4.X: API level >= 4.1

    How is possible to the use the minApiLevel attribute in manifest.xml to include System 5 devices/firmware (and only those devices)?

    Assuming that minApiLevel works in a completely straightforward and expected manner

    1) If you specify minApiLevel >= 4.1, then you will exclude 3.3 devices (but you don't want that if you're targeting System 5)

    2) If you specify minApiLevel >= 3.3, then you will include 4.0 devices (but you don't want that if you're targeting System 5)

    As a matter of fact I tested both of these scenarios (*), and they both behaved as described. (There's really no other sane way for minApiLevel to behave)

    Please don't say "use has", since it's entirely possible that someone wants to make an app that *requires* a System 5 feature to be available, like an app that revolves around having access to the gyroscope or something.

    It seems to me that, in fact, the only way to achieve what the dev wants in this case is to use "has", and display an error message at runtime if the user has a device that's eligible for System 5 (like Venu 2s), but doesn't have it (maybe they never updated to 4.1.x, or maybe their device is APAC and doesn't have the update.)

    (*) Test procedure

    1) set minApiLevel to 4.1, try to build with fr945lte, where the max CIQ api level is 3.3.1.

    2) set minApiLevel to 3.3, try to build with wearable2021, where the max CIQ api level is 4.0.0. If you don't have wearable2021, you could temporarily edit the venu2s compiler.json file by hand to remove the reference to 4.1

  • How is possible to the use the minApiLevel attribute in manifest.xml to include System 5 devices/firmware (and only those devices)?

    Every one of my 50 or so production apps has a min ApiLevel of 1.x.  To handle the differences, I exclude targets, use "has" or in some cases, Jungles.

    I learned many years ago that setting min API caused more issues than it was worth.  I'm thinking the 2.1.x SDK was involved.  With CIQ 3.3.x and 4.1.x it's very obvious again.