DEV Community

Cover image for A random annotation I found on androidx.annotation
Jin Lee
Jin Lee

Posted on

1 1

A random annotation I found on androidx.annotation

While working on an Android app, I found an interesting annotation called @ChecksSdkIntAtLeast. I had no idea this annotation existed under the androidx.annotation package. I got curious and started looking into how it works.


Simple way

It looks like the most simplest way of using this annotation is to use api parameters like so (source):

@ChecksSdkIntAtLeast(api = Build. VERSION_CODES. O) 
public static boolean isAtLeastO() {     
    return Build. VERSION. SDK_INT >= 26; 
}
Enter fullscreen mode Exit fullscreen mode

But I thought maybe we can reuse this into class and able to inject places where we need to.

Classy way

To make this logic somewhat reusable, I created an interface and its concrete implementation:

interface DeviceVersion {
    @ChecksSdkIntAtLeast(parameter = 0)
    fun isAtLeast(osLevel: Int): Boolean
}

class RealDeviceVersion : DeviceVersion {
    override fun isAtLeast(osLevel: Int): Boolean {
        return Build.VERSION.SDK_INT >= osLevel
    }
}
Enter fullscreen mode Exit fullscreen mode

Here, the DeviceVersion interface provides a method isAtLeast(osLevel: Int) has the @ChecksSdkIntAtLeast while RealDeviceVersion has the OS level checking logic. When injected linter will understand that DeviceVersion#isAtLeast has done the appropriate OS level checking logic. (Probably a good idea to add some unit tests around here! 👀)

Practical (sort of...) Example

Imagine you have a class that includes methods restricted to certain API levels, like this (Apology for the class/method names):

class SomeAPIRestrictedMethodClass {
    @RequiresApi(34)
    fun fooFor34() {
        // Some operation requires SDK 30
    }

    fun fooForAll() {
        // Some operation for all SDK
    }
}
Enter fullscreen mode Exit fullscreen mode

When calling fooFor34 method which can only be used for API 34 or above, you would typically do a check like this:

if (Build.VERSION.SDK_INT > 34) {
    someAPIRestrictedMethodClass.fooFor34()
}
Enter fullscreen mode Exit fullscreen mode

With the DeviceVersion interface, you can achieve the same result more cleanly:

if (deviceVersion.isAtLeast(34)) {
    someAPIRestrictClass.fooFor34()
}
Enter fullscreen mode Exit fullscreen mode

This approach could help with the unit testing if you somehow can't run AndroidTestRunner or RobolectricTestRunner for some classes/methods. Plus, the linter doesn't seem to complain about this usage!

no linter issue using the new annotation

I just found this super interesting annotation since I have not seen it before. I hope you enjoyed learning about this as much as I did. If you have encountered unique annotations feel free to share them on the comment section and have a great day!

🧀

Sentry blog image

The countdown to March 31 is on.

Make the switch from app center suck less with Sentry.

Read more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay