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!

πŸ§€

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Sentry mobile image

Improving mobile performance, from slow screens to app start time

Based on our experience working with thousands of mobile developer teams, we developed a mobile monitoring maturity curve.

Read more

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay