1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *  * Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *  * Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *    the documentation and/or other materials provided with the
13  *    distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #pragma once
30 
31 /**
32  * @file android/api-level.h
33  * @brief Functions and constants for dealing with multiple API levels.
34  *
35  * See
36  * https://android.googlesource.com/platform/bionic/+/master/docs/defines.md.
37  */
38 
39 #include <sys/cdefs.h>
40 
41 __BEGIN_DECLS
42 
43 /**
44  * Magic version number for an Android OS build which has not yet turned
45  * into an official release, for comparison against `__ANDROID_API__`. See
46  * https://android.googlesource.com/platform/bionic/+/master/docs/defines.md.
47  */
48 #define __ANDROID_API_FUTURE__ 10000
49 
50 /* This #ifndef should never be true except when doxygen is generating docs. */
51 #ifndef __ANDROID_API__
52 /**
53  * `__ANDROID_API__` is the API level being targeted. For the OS,
54  * this is `__ANDROID_API_FUTURE__`. For the NDK, this is set by the
55  * compiler system based on the API level you claimed to target. See
56  * https://android.googlesource.com/platform/bionic/+/master/docs/defines.md.
57  */
58 #define __ANDROID_API__ __ANDROID_API_FUTURE__
59 #endif
60 
61 /** Names the Gingerbread API level (9), for comparison against `__ANDROID_API__`. */
62 #define __ANDROID_API_G__ 9
63 
64 /** Names the Ice-Cream Sandwich API level (14), for comparison against `__ANDROID_API__`. */
65 #define __ANDROID_API_I__ 14
66 
67 /** Names the Jellybean API level (16), for comparison against `__ANDROID_API__`. */
68 #define __ANDROID_API_J__ 16
69 
70 /** Names the Jellybean MR1 API level (17), for comparison against `__ANDROID_API__`. */
71 #define __ANDROID_API_J_MR1__ 17
72 
73 /** Names the Jellybean MR2 API level (18), for comparison against `__ANDROID_API__`. */
74 #define __ANDROID_API_J_MR2__ 18
75 
76 /** Names the KitKat API level (19), for comparison against `__ANDROID_API__`. */
77 #define __ANDROID_API_K__ 19
78 
79 /** Names the Lollipop API level (21), for comparison against `__ANDROID_API__`. */
80 #define __ANDROID_API_L__ 21
81 
82 /** Names the Lollipop MR1 API level (22), for comparison against `__ANDROID_API__`. */
83 #define __ANDROID_API_L_MR1__ 22
84 
85 /** Names the Marshmallow API level (23), for comparison against `__ANDROID_API__`. */
86 #define __ANDROID_API_M__ 23
87 
88 /** Names the Nougat API level (24), for comparison against `__ANDROID_API__`. */
89 #define __ANDROID_API_N__ 24
90 
91 /** Names the Nougat MR1 API level (25), for comparison against `__ANDROID_API__`. */
92 #define __ANDROID_API_N_MR1__ 25
93 
94 /** Names the Oreo API level (26), for comparison against `__ANDROID_API__`. */
95 #define __ANDROID_API_O__ 26
96 
97 /** Names the Oreo MR1 API level (27), for comparison against `__ANDROID_API__`. */
98 #define __ANDROID_API_O_MR1__ 27
99 
100 /** Names the Pie API level (28), for comparison against `__ANDROID_API__`. */
101 #define __ANDROID_API_P__ 28
102 
103 /**
104  * Names the "Q" API level (29), for comparison against `__ANDROID_API__`.
105  * This release was called Android 10 publicly, not to be (but sure to be)
106  * confused with API level 10.
107  */
108 #define __ANDROID_API_Q__ 29
109 
110 /** Names the "R" API level (30), for comparison against `__ANDROID_API__`. */
111 #define __ANDROID_API_R__ 30
112 
113 /** Names the "S" API level (31), for comparison against `__ANDROID_API__`. */
114 #define __ANDROID_API_S__ 31
115 
116 /**
117  * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__`
118  * if there is no known target SDK version (for code not running in the
119  * context of an app).
120  *
121  * The returned values correspond to the named constants in `<android/api-level.h>`,
122  * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
123  *
124  * See also android_get_device_api_level().
125  *
126  * Available since API level 24.
127  */
128 int android_get_application_target_sdk_version() __INTRODUCED_IN(24);
129 
130 #if __ANDROID_API__ < 29
131 
132 // android_get_device_api_level is a static inline before API level 29.
133 #define __BIONIC_GET_DEVICE_API_LEVEL_INLINE static __inline
134 #include <bits/get_device_api_level_inlines.h>
135 #undef __BIONIC_GET_DEVICE_API_LEVEL_INLINE
136 
137 #else
138 
139 /**
140  * Returns the API level of the device we're actually running on, or -1 on failure.
141  * The returned values correspond to the named constants in `<android/api-level.h>`,
142  * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
143  *
144  * See also android_get_application_target_sdk_version().
145  */
146 int android_get_device_api_level() __INTRODUCED_IN(29);
147 
148 #endif
149 
150 __END_DECLS
151