droid_wrap/android/
os.rs

1/*
2 * Copyright (c) 2024. The RigelA open source project team and
3 * its contributors reserve all rights.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and limitations under the License.
12 */
13
14use crate::{
15    JObjNew, JObjRef, JType, Result,
16    android::hardware::vibrator::{Effect, EffectImpl, EffectStrength, EffectStrengthImpl},
17    java::lang::Runnable,
18    java_class, java_constructor, java_method,
19};
20use std::{collections::HashSet, convert::Into, iter::Iterator, str::FromStr, string::ToString};
21
22type ConstFn<R = String> = fn() -> R;
23
24/**
25从字符串键到各种 Parcelable 值的映射。
26警告:请注意,Bundle 是一个惰性容器,因此它不实现 equals(Object) 或 hashCode()。
27*/
28#[java_class(name = "android/os/Bundle")]
29pub struct Bundle;
30
31impl Bundle {
32    /**
33    构造一个新的空 Bundle。
34    */
35    #[java_constructor]
36    pub fn new() -> Self {}
37}
38
39/**
40从设备提供对所有振动器的访问,以及以同步方式运行它们的能力。如果您的过程退出,则您开始的任何振动都将停止。
41*/
42#[java_class(name = "android/os/VibratorManager")]
43pub struct VibratorManager;
44
45impl VibratorManager {
46    /**
47    防止从框架外部进行子类化
48    */
49    #[java_constructor]
50    pub fn new() -> Self {}
51
52    /**
53    通过 ID 检索单个振动器。
54    返回:具有给定 vibratorId 的振动器,永不为空。
55    `vibrator_id` 要检索的振动器的 ID。
56    */
57    #[java_method]
58    pub fn get_vibrator(&self, vibrator_id: i32) -> Vibrator {}
59
60    /// 返回设备的默认振动器。
61    #[java_method]
62    pub fn get_default_vibrator(&self) -> Vibrator {}
63
64    /// 关掉所有振动器。
65    #[java_method]
66    pub fn cancel(&self) {}
67
68    /**
69    取消特定类型的正在进行的振动。
70    `usage_filter` 要取消的振动类型,表示为 VibrationAttributes 的按位组合。使用值。
71    */
72    #[java_method(overload=cancel)]
73    pub fn cancel_usage_filter(&self, usage_filter: i32) {}
74}
75
76/**
77操作设备上的振动器的类。如果您的进程退出,您启动的任何振动都将停止。
78*/
79#[java_class(name = "android/os/Vibrator")]
80pub struct Vibrator;
81
82impl Vibrator {
83    /// 振动强度:无振动。
84    pub const VIBRATION_INTENSITY_OFF: i32 = 0;
85
86    /// 振动强度:低。
87    pub const VIBRATION_INTENSITY_LOW: i32 = 1;
88
89    /// 振动强度:中。
90    pub const VIBRATION_INTENSITY_MEDIUM: i32 = 2;
91
92    /// 振动强度:高。
93    pub const VIBRATION_INTENSITY_HIGH: i32 = 3;
94
95    /// 振动效果支持:未知。
96    /// 硬件未报告其支持的效果,因此我们无法确定是否支持该效果。
97    pub const VIBRATION_EFFECT_SUPPORT_UNKNOWN: i32 = 0;
98
99    /// 振动效果支持:支持。
100    /// 该效果由底层硬件支持。
101    pub const VIBRATION_EFFECT_SUPPORT_YES: i32 = 1;
102
103    /// 振动效果支持:不支持。
104    /// 此效果并非底层硬件原生支持,但系统仍可播放后备振动。
105    pub const VIBRATION_EFFECT_SUPPORT_NO: i32 = 2;
106
107    /// 防止从框架外部进行子类化
108    #[java_constructor]
109    pub fn new() -> Self {}
110
111    /// 获取给定用途的默认振动强度。
112    #[java_method]
113    pub fn get_default_vibration_intensity(&self) -> i32 {}
114
115    /**
116    返回此振动器的ID。
117    返回:一个非负整数,表示此服务控制的振动器的id,或者-1表示此服务未附加任何物理振动器。
118    */
119    #[java_method]
120    pub fn get_id(&self) -> i32 {}
121
122    /**
123    检查硬件是否有振动器。
124    返回:如果硬件有振动器则返回 True,否则返回 false。
125    */
126    #[java_method]
127    pub fn has_vibrator(&self) -> bool {}
128
129    /**
130    检查振动器是否具有振幅控制。
131    返回:如果硬件可以控制振动的振幅,则返回 True,否则返回 false。
132    */
133    #[java_method]
134    pub fn has_amplitude_control(&self) -> bool {}
135
136    /**
137    检查振动器是否具有独立的频率控制。
138    返回:如果硬件可以独立于振动幅度控制振动频率,则返回 True,否则返回 false。
139    */
140    #[java_method]
141    pub fn has_frequency_control(&self) -> bool {}
142
143    /**
144    检查振动器是否支持给定 VibrationEffect 的所有组件(即振动器是否能按预期播放给定效果)。如果此方法返回 true,则 VibrationEffect 应按预期播放。 如果为 false,播放 VibrationEffect 仍可能产生振动,但振动效果可能与预期大不相同。此方法汇总功能检查方法的结果,例如 hasAmplitudeControl、areAllPrimitivesSupported(int...) 等,具体取决于 VibrationEffect 实际使用的功能。
145    返回:如果振动器可以按预期播放给定效果,则返回 true,否则返回 false。
146    `effect` 要检查是否支持的 VibrationEffect
147    */
148    #[java_method]
149    pub fn are_vibration_features_supported(&self, effect: &VibrationEffect) -> bool {}
150
151    /**
152    使用 IExternalVibratorService 检查振动器是否可由外部服务控制。
153    返回:如果硬件可由外部服务控制,则返回 True,否则返回 false。
154    */
155    #[java_method]
156    pub fn has_external_control(&self) -> bool {}
157    /**
158    获取振动器的共振频率(如果适用)。
159    返回:振动器的共振频率,如果未知、不适用或该振动器是具有不同频率的多个物理设备的组合,则返回 NaN。
160    */
161    #[java_method]
162    pub fn get_resonant_frequency(&self) -> f32 {}
163
164    /**
165    获取振动器的 Q 因子。
166    返回:振动器的 Q 因子,如果未知、不适用或该振动器是具有不同 Q 因子的多个物理设备的组合,则返回 NaN。
167    */
168    #[java_method]
169    pub fn get_q_factor(&self) -> f32 {}
170
171    /**
172    返回振动器使用音频触觉通道可以播放的最大振幅。这是一个正值,如果未知则为 NaN。如果返回正值 maxAmplitude,则来自音轨触觉通道的信号应在 [-maxAmplitude, maxAmplitude] 范围内。
173    返回:一个正值,表示设备可以从音频触觉通道播放信号的最大绝对值,如果未知则为 NaN。
174    */
175    #[java_method]
176    pub fn get_haptic_channel_maximum_amplitude(&self) -> f32 {}
177
178    /**
179    在指定的时间段内持续振动。应用应处于前台才能发生振动。
180    `milliseconds` 振动的毫秒数。
181    */
182    #[deprecated(note = "改用 vibrate(VibrationEffect)。")]
183    #[java_method]
184    pub fn vibrate(&self, milliseconds: i64) {}
185
186    /**
187    使用指定效果进行振动。应用程序应处于前台才能进行振动。
188    `vibe` 描述要执行的振动的振动效果。
189    */
190    #[java_method(overload=vibrate)]
191    pub fn vibrate_effect(&self, vibe: &VibrationEffect) {}
192
193    /// 关掉振动器。
194    #[java_method]
195    pub fn cancel(&self) {}
196
197    /**
198    取消特定类型的正在进行的振动。
199    `usage_filter` 要取消的振动类型,表示为 VibrationAttributes 的按位组合。使用值。
200    */
201    #[java_method(overload=cancel)]
202    pub fn cancel_usage_filter(&self, usage_filter: i32) {}
203
204    /**
205    检查振动器是否正在振动。
206    返回:如果硬件正在振动,则返回 True,否则返回 false。
207    */
208    #[java_method]
209    pub fn is_vibrating(&self) -> bool {}
210}
211
212/**
213VibrationEffect 描述了振动器执行的触觉效果。这些效果可以是任意数量,从单次振动到复杂波形。
214*/
215#[java_class(name = "android/os/VibrationEffect")]
216pub struct VibrationEffect;
217
218impl VibrationEffect {
219    /// 设备默认的振动强度。
220    pub const DEFAULT_AMPLITUDE: i32 = -1;
221
222    /// 最大振幅值
223    pub const MAX_AMPLITUDE: i32 = 255;
224
225    /// 点击效果。使用此效果作为基准,因为它是最常见的点击效果类型。
226    pub const EFFECT_CLICK: i32 = <EffectImpl as Effect>::CLICK;
227
228    /// 双击效果。
229    pub const EFFECT_DOUBLE_CLICK: i32 = <EffectImpl as Effect>::DOUBLE_CLICK;
230
231    /// 勾选效果。与 EFFECT_CLICK 相比,此效果强度较低。
232    pub const EFFECT_TICK: i32 = <EffectImpl as Effect>::TICK;
233
234    /// 一个轰动的效果。
235    pub const EFFECT_THUD: i32 = <EffectImpl as Effect>::THUD;
236
237    /// 具有流行效果。
238    pub const EFFECT_POP: i32 = <EffectImpl as Effect>::POP;
239
240    /// 重击效果。此效果比 EFFECT_CLICK 更强。
241    pub const EFFECT_HEAVY_CLICK: i32 = <EffectImpl as Effect>::HEAVY_CLICK;
242
243    /// 一种纹理效果,用于复制柔软的滴答声。
244    /// 与普通效果不同,纹理效果需要反复调用,通常是为了响应某些动作,以复制用户手指下方的某些纹理的感觉。
245    pub const EFFECT_TEXTURE_TICK: i32 = <EffectImpl as Effect>::TEXTURE_TICK;
246
247    #[doc(hidden)]
248    pub const EFFECT_STRENGTH_LIGHT: i32 = <EffectStrengthImpl as EffectStrength>::LIGHT as i32;
249
250    #[doc(hidden)]
251    pub const EFFECT_STRENGTH_MEDIUM: i32 = <EffectStrengthImpl as EffectStrength>::MEDIUM as i32;
252
253    #[doc(hidden)]
254    pub const EFFECT_STRENGTH_STRONG: i32 = <EffectStrengthImpl as EffectStrength>::STRONG as i32;
255
256    /**
257    防止从框架外部进行子类化
258    */
259    #[java_constructor]
260    pub fn new() -> Self {}
261
262    /**
263    创建一次性振动。一次性振动将以指定的振幅持续振动指定的时间段,然后停止。
264    返回:所需的效果。
265    `milliseconds` 振动的毫秒数。这必须是正数。
266    `amplitude` 振动的强度。这必须是 1 到 255 之间的值,或 DEFAULT_AMPLITUDE。
267    */
268    #[java_method]
269    pub fn create_one_shot(milliseconds: i64, amplitude: i32) -> Self {}
270
271    /**
272    创建预定义振动效果。预定义效果是一组常见的振动效果,无论它们来自哪个应用,它们都应该相同,以便为整个设备上的用户提供一致的体验。它们还可以根据设备硬件进行定制,以提供比使用通用构建块构建得更好的体验。如果存在通用模式,并且不存在特定于硬件的效果实现,则将回退到通用模式。
273    返回:所需的效果。
274    `effect_id` 要执行的效果的 ID:EFFECT_CLICK、EFFECT_DOUBLE_CLICK、EFFECT_TICK
275    */
276    #[java_method]
277    pub fn create_predefined(effect_id: i32) -> Self {}
278
279    /**
280    获取预定义的振动效果。预定义效果是一组常见的振动效果,无论它们来自哪个应用,它们都应该相同,以便为整个设备上的用户提供一致的体验。它们还可以根据设备硬件进行定制,以提供比使用通用构建块构建得更好的体验。如果存在通用模式,并且不存在特定于硬件的效果实现,则将回退到通用模式。
281    返回:所需的效果。
282    `effect_id` 要执行的效果的 ID:EFFECT_CLICK、EFFECT_DOUBLE_CLICK、EFFECT_TICK
283    */
284    #[java_method]
285    pub fn get(effect_id: i32) -> Self {}
286
287    /**
288    获取预定义的振动效果。预定义效果是一组常见的振动效果,无论它们来自哪个应用,它们都应该相同,以便为整个设备上的用户提供一致的体验。它们还可以根据设备硬件进行定制,以提供比使用通用构建块构建得更好的体验。您可能只想在有特定于硬件的实现时播放某些效果,因为它们可能会在不进行调整的情况下对用户造成太大的干扰。fallback 参数允许您决定是要回退到通用实现,还是仅在有经过调整的特定于硬件的实现时才播放。
289    返回:所需的效果。
290    `effect_id` 要执行的效果的 ID:EFFECT_CLICK、EFFECT_DOUBLE_CLICK、EFFECT_TICK
291    `fallback` 如果不存在特定于硬件的实现,是否回退到通用模式。
292    */
293    #[java_method(overload=get)]
294    pub fn get_with_fallback(effect_id: i32, fallback: bool) -> Self {}
295
296    #[doc(hidden)]
297    #[java_method]
298    pub fn describe_contents(&self) -> i32 {}
299
300    #[doc(hidden)]
301    #[java_method]
302    pub fn validate(&self) {}
303
304    /**
305    获取振动的预计持续时间(以毫秒为单位)。对于没有定义结束的效果(例如具有非负重复索引的波形),这将返回 Long.MAX_VALUE。对于持续时间未知的效果(例如长度取决于设备和可能取决于运行时间的预烘焙效果),这将返回 -1。
306    */
307    #[java_method]
308    pub fn get_duration(&self) -> i64 {}
309
310    /**
311    检查给定的振动器是否能按预期播放此效果。有关振动器支持哪些功能以及不支持哪些功能的更多信息,请参阅Vibrator#areVibrationFeaturesSupported(VibrationEffect)。
312    */
313    #[java_method]
314    pub fn are_vibration_features_supported(&self, vibrator: &Vibrator) -> bool {}
315
316    /**
317    将默认值解析为整数振幅数字。
318    如果振幅值已设置,则返回此值;否则,返回具有给定默认振幅的此效果的副本隐藏
319    `default_amplitude` 要应用的默认振幅,必须介于 0 和 MAX_AMPLITUDE 之间
320    */
321    #[java_method]
322    pub fn resolve(&self, default_amplitude: i32) -> Self {}
323
324    /**
325    根据给定的约束缩放振动效果强度。
326    返回:如果没有缩放,则返回此值;否则,返回此效果的副本,并缩放振动强度
327    `scale_factor` 应用于强度的缩放因子。[0,1) 内的值将缩小强度,大于 1 的值将放大
328    */
329    #[java_method]
330    pub fn scale(&self, scale_factor: f32) -> Self {}
331
332    /**
333    将给定的效果强度应用于由 VibrationEffect.EFFECT_* 之一表示的预烘焙效果。
334    返回:如果此效果没有变化,则返回此效果;否则,返回应用了效果强度的此效果的副本。
335    `effect_strength` 要应用的新效果强度,VibrationEffect.EFFECT_STRENGTH_* 之一。
336    */
337    #[java_method]
338    pub fn apply_effect_strength(&self, effect_strength: i32) -> Self {}
339
340    /**
341    根据给定的因子缩放给定的振动强度。
342    `intensity` 效果的相对强度,必须介于 0 和 1 之间
343    `scale_factor` 应用于强度的比例因子。[0,1) 内的值将降低强度,大于 1 的值将增加强度
344    */
345    #[java_method(overload=scale)]
346    pub fn scale_intensity(intensity: f32, scale_factor: f32) -> f32 {}
347
348    #[doc(hidden)]
349    #[java_method]
350    pub fn effect_id_to_string(effect_id: i32) -> String {}
351
352    #[doc(hidden)]
353    #[java_method]
354    pub fn effect_strength_to_string(effect_strength: i32) -> String {}
355}
356
357/// 从系统属性中提取的有关当前构建的信息。
358#[java_class(name = "android/os/Build")]
359pub struct Build;
360
361impl Build {
362    /// 构建属性未知时使用的值。
363    pub const UNKNOWN: &'static str = "unknown";
364
365    fn get_string(property: &str) -> String {
366        SystemProperties::get_with_default(property.to_string(), Self::UNKNOWN.to_string())
367    }
368
369    /// 可以是变更列表编号,也可以是像“M4-rc20”这样的标签。
370    pub const ID: ConstFn = || Self::get_string("ro.build.id");
371
372    /// 用于向用户显示的构建 ID 字符串
373    pub const DISPLAY: ConstFn = || Self::get_string("ro.build.display.id");
374
375    /// 整体产品的名称。
376    pub const PRODUCT: ConstFn = || Self::get_string("ro.product.name");
377    /**
378    返回证明特定属性。
379    返回属性值或 UNKNOWN
380    `property` 型号、名称、品牌、设备或制造商。
381    */
382    fn get_vendor_device_id_property(property: &str) -> String {
383        let attest_prop =
384            Self::get_string(format!("ro.product.{}_for_attestation", property).as_str());
385        if attest_prop == Self::UNKNOWN {
386            Self::get_string(format!("ro.product.vendor.{}", property).as_str())
387        } else {
388            Self::UNKNOWN.to_string()
389        }
390    }
391
392    //noinspection SpellCheckingInspection
393    /// 用于认证的产品名称。在非默认版本(如 AOSP 版本)中,“PRODUCT”系统属性的值可能与提供给 KeyMint 的值不同,而 Keymint 认证仍会认证提供给 KeyMint 的产品名称。
394    pub const PRODUCT_FOR_ATTESTATION: ConstFn = || Self::get_vendor_device_id_property("name");
395
396    //noinspection SpellCheckingInspection
397    /// 用于认证的设备名称。在非默认版本(如 AOSP 版本)中,“DEVICE”系统属性的值可能与配置给 KeyMint 的值不同,而 Keymint 认证仍会认证配置的设备名称。
398    pub const DEVICE_FOR_ATTESTATION: ConstFn = || Self::get_vendor_device_id_property("device");
399
400    /// 底层板的名称,例如“金鱼”。
401    pub const BOARD: ConstFn = || Self::get_string("ro.product.board");
402
403    //noinspection SpellCheckingInspection
404    /// 本机代码的指令集名称(CPU 类型 + ABI 约定)。
405    #[deprecated(note = "改用 SUPPORTED_ABIS。")]
406    pub const CPU_ABI: ConstFn = String::new;
407
408    //noinspection SpellCheckingInspection
409    /// 本机代码的第二个指令集 (CPU 类型 + ABI 约定) 的名称。
410    #[deprecated(note = "改用 SUPPORTED_ABIS。")]
411    pub const CPU_ABI2: ConstFn = String::new;
412
413    /// 产品/硬件的制造商。
414    pub const MANUFACTURER: ConstFn = || Self::get_string("ro.product.manufacturer");
415
416    //noinspection SpellCheckingInspection
417    /// 用于认证的制造商名称。在非默认版本(如 AOSP 版本)中,“MANUFACTURER”系统属性的值可能与提供给 KeyMint 的值不同,而 Keymint 认证仍将认证提供给所配置的制造商。
418    pub const MANUFACTURER_FOR_ATTESTATION: ConstFn =
419        || Self::get_vendor_device_id_property("manufacturer");
420
421    /// 与产品/硬件相关的消费者可见品牌(如果有)。
422    pub const BRAND: ConstFn = || Self::get_string("ro.product.brand");
423
424    //noinspection SpellCheckingInspection
425    /// 用于认证的产品品牌。在非默认版本(如 AOSP 版本)中,“BRAND”系统属性的值可能与提供给 KeyMint 的值不同,而 Keymint 认证仍将认证提供给的产品品牌。
426    pub const BRAND_FOR_ATTESTATION: ConstFn = || Self::get_vendor_device_id_property("brand");
427
428    /// 最终产品的最终用户可见的名称。
429    pub const MODEL: ConstFn = || Self::get_string("ro.product.model");
430
431    //noinspection SpellCheckingInspection
432    /// 用于认证的产品型号。在非默认版本(如 AOSP 版本)中,“MODEL”系统属性的值可能与配置给 KeyMint 的值不同,而 Keymint 认证仍会认证配置的产品型号。
433    pub const MODEL_FOR_ATTESTATION: ConstFn = || Self::get_vendor_device_id_property("model");
434
435    /// 系统引导加载程序版本号。
436    pub const BOOTLOADER: ConstFn = || Self::get_string("ro.bootloader");
437
438    /// 硬件的名称(来自内核命令行或 /proc)。
439    pub const HARDWARE: ConstFn = || Self::get_string("ro.hardware");
440
441    /**
442    硬件的 SKU(来自内核命令行)。
443    引导加载程序会报告 SKU 以配置系统软件功能。如果引导加载程序未提供任何值,则报告为“未知”。
444    */
445    pub const SKU: ConstFn = || Self::get_string("ro.boot.hardware.sku");
446
447    /**
448    原始设计制造商 (ODM) 设置的设备 SKU。
449    这是启动期间设置的运行时初始化属性,用于配置设备服务。如果未设置任何值,则报告为“未知”。
450    如果制造商生产相同设计的变体,ODM SKU 可能会针对同一系统 SKU 提供多种变体。例如,同一版本可能会发布具有不同物理键盘和/或显示硬件的变体,每个变体都有不同的 ODM SKU。
451    */
452    pub const ODM_SKU: ConstFn = || Self::get_string("ro.boot.product.hardware.sku");
453
454    /// 此版本是否适用于模拟器设备。
455    pub const IS_EMULATOR: ConstFn<bool> = || Self::get_string("ro.boot.qemu") == "1";
456
457    /// 硬件序列号(如果有)。仅限字母数字,不区分大小写。此字段始终设置为 Build#UNKNOWN。
458    #[deprecated(note = "改用 getSerial()。")]
459    // 重要提示:此字段应通过函数调用进行初始化,以防止其值在编译期间在应用程序中内联,因为我们稍后会根据应用程序的目标 SDK 将其设置为该值。
460    pub const SERIAL: ConstFn = || Self::get_string("no.such.thing");
461
462    /**
463    获取硬件序列号(如果可用)。
464    注意:root 访问权限可能允许您修改设备标识符,例如硬件序列号。如果您更改这些标识符,则无法使用密钥认证来获取设备原始标识符的证明。如果框架提供的标识符与其配置的标识符不匹配,KeyMint 将拒绝 ID 认证请求。
465    从 API 级别 29 开始,持久设备标识符受到额外限制的保护,建议应用使用可重置标识符(请参阅唯一标识符的最佳实践)。如果满足以下要求之一,则可以调用此方法:
466    如果调用应用已被授予 READ_PRIVILEGED_PHONE_STATE 权限;这是一项特权权限,只能授予设备上预加载的应用。如果调用应用在任何有效订阅上具有运营商权限(请参阅 android.telephony.TelephonyManager.hasCarrierPrivileges)。
467    如果调用应用程序是默认的 SMS 角色持有者(请参阅 android.app.role.RoleManager.isRoleHeld(String))。如果调用应用程序是完全托管设备的设备所有者、组织拥有的设备的配置文件所有者或其代表(请参阅 android.app.admin.DevicePolicyManager.getEnrollmentSpecificId())。
468    如果调用应用程序不满足这些要求之一,则此方法将按以下方式运行:
469    如果调用应用程序的目标 SDK 为 API 级别 28 或更低,并且应用程序具有 READ_PHONE_STATE 权限,则返回 UNKNOWN。如果调用应用程序的目标 SDK 为 API 级别 28 或更低,并且应用程序没有 READ_PHONE_STATE 权限,或者如果调用应用程序的目标是 API 级别 29 或更高,则抛出 SecurityException。
470    返回:序列号(如果指定)。
471    */
472    #[java_method]
473    pub fn get_serial() -> Result<String> {}
474
475    fn get_string_list(property: &str, separator: &str) -> Vec<String> {
476        let value = SystemProperties::get(property.to_string());
477        if value.is_empty() {
478            return vec![];
479        }
480        value.split(separator).map(|i| i.to_string()).collect()
481    }
482
483    //noinspection SpellCheckingInspection
484    /**
485    此设备支持的 ABI 的有序列表。最优先的 ABI 是列表中的第一个元素。
486    参见SUPPORTED_32_BIT_ABIS和SUPPORTED_64_BIT_ABIS。
487    */
488    pub const SUPPORTED_ABIS: ConstFn<Vec<String>> =
489        || Self::get_string_list("ro.product.cpu.abilist", ",");
490
491    //noinspection SpellCheckingInspection
492    /**
493    此设备支持的 32 位 ABI 的有序列表。最优先的 ABI 是列表中的第一个元素。
494    参见SUPPORTED_ABIS和SUPPORTED_64_BIT_ABIS。
495    */
496    pub const SUPPORTED_32_BIT_ABIS: ConstFn<Vec<String>> =
497        || Self::get_string_list("ro.product.cpu.abilist32", ",");
498
499    //noinspection SpellCheckingInspection
500    /**
501    此设备支持的 64 位 ABI 的有序列表。最优先的 ABI 是列表中的第一个元素。
502    参见SUPPORTED_ABIS和SUPPORTED_32_BIT_ABIS。
503    */
504    pub const SUPPORTED_64_BIT_ABIS: ConstFn<Vec<String>> =
505        || Self::get_string_list("ro.product.cpu.abilist64", ",");
506
507    #[doc(hidden)]
508    #[java_method]
509    pub fn is64bit_abi(abi: String) {}
510
511    /// 构建类型,如“user”或“eng”。
512    pub const TYPE: ConstFn = || Self::get_string("ro.build.type");
513
514    /// 用逗号分隔的标签描述构建,如“unsigned,debug”。
515    pub const TAGS: ConstFn = || Self::get_string("ro.build.tags");
516
517    /// 唯一标识此构建的字符串。请勿尝试解析此值。
518    pub const FINGERPRINT: ConstFn = || Self::derive_fingerprint();
519
520    /// 有些设备将指纹组件分成多个分区,因此我们可能会在运行时获取指纹。
521    fn derive_fingerprint() -> String {
522        let mut finger = SystemProperties::get("ro.build.fingerprint".to_string());
523        if finger.is_empty() {
524            finger = format!(
525                "{}/{}/{}:{}/{}/{}:{}/{}",
526                Self::get_string("ro.product.brand"),
527                Self::get_string("ro.product.name"),
528                Self::get_string("ro.product.device"),
529                Self::get_string("ro.build.version.release"),
530                Self::get_string("ro.build.id"),
531                Self::get_string("ro.build.version.incremental"),
532                Self::get_string("ro.build.type"),
533                Self::get_string("ro.build.tags")
534            );
535        }
536        finger
537    }
538
539    /// 确保定义了原始指纹系统属性。如果它是由 deriveFingerprint() 动态派生的,那么我们将派生值推送到属性服务中。
540    #[java_method]
541    pub fn ensure_fingerprint_property() {}
542
543    /**
544    系统上各种超时的乘数。
545    目的是针对比真实硬件慢几个数量级的软件模拟器的产品可以将其设置为较大的数字。在真实设备和硬件加速的虚拟化设备上不应设置此数字。
546    */
547    pub const HW_TIMEOUT_MULTIPLIER: ConstFn<i32> =
548        || SystemProperties::get_int("ro.hw_timeout_multiplier".to_string(), 1);
549
550    /// 如果此设备启用了 Treble 并且需要该功能,则为 True。
551    pub const IS_TREBLE_ENABLED: ConstFn<bool> =
552        || SystemProperties::get_boolean("ro.treble.enabled".to_string(), false);
553
554    //noinspection SpellCheckingInspection
555    /**
556    验证设备的当前闪存是否与构建时预期的一致。Treble 设备将验证供应商接口 (VINTF)。
557    未使用 Treble 启动的设备:1) 检查设备指纹是否已定义以及它是否与各个分区匹配。2) 验证无线电和引导加载程序分区是否是构建中预期的分区。
558    */
559    #[java_method]
560    pub fn is_build_consistent() -> bool {}
561
562    fn get_long(property: &str) -> i64 {
563        if let Ok(num) = i64::from_str(&SystemProperties::get(property.to_string())) {
564            return num;
565        }
566        -1
567    }
568
569    /// 自Unix时期以来,生产构建的时间以毫秒为单位。
570    pub const TIME: ConstFn<i64> = || Self::get_long("ro.build.date.utc") * 1000;
571
572    #[doc(hidden)]
573    pub const USER: ConstFn = || Self::get_string("ro.build.user");
574
575    #[doc(hidden)]
576    pub const HOST: ConstFn = || Self::get_string("ro.build.host");
577
578    //noinspection SpellCheckingInspection
579    /**
580    如果设备正在运行可调试版本(例如“userdebug”或“eng”),则返回 true。
581    可调试版本允许用户通过本地 shell 获得 root 访问权限、将调试器附加到任何应用程序(无论它们是否设置了“可调试”属性),或者将 selinux 降级为“宽容”模式。
582    */
583    pub const IS_DEBUGGABLE: ConstFn<bool> =
584        || SystemProperties::get_int("ro.debuggable".to_string(), 0) == 1;
585
586    //noinspection SpellCheckingInspection
587    /**
588    如果设备正在运行可调试版本(例如“userdebug”或“eng”),则返回 true。
589    可调试版本允许用户通过本地 shell 获得 root 访问权限、将调试器附加到任何应用程序(无论它们是否设置了“可调试”属性),或者将 selinux 降级为“宽容”模式。
590    */
591    pub fn is_debuggable() -> bool {
592        Self::IS_DEBUGGABLE()
593    }
594
595    #[doc(hidden)]
596    pub const IS_ENG: ConstFn<bool> = || "eng" == Self::TYPE();
597
598    //noinspection SpellCheckingInspection
599    #[doc(hidden)]
600    pub const IS_USERDEBUG: ConstFn<bool> = || "userdebug" == Self::TYPE();
601
602    #[doc(hidden)]
603    pub const IS_USER: ConstFn<bool> = || "user" == Self::TYPE();
604
605    //noinspection SpellCheckingInspection
606    /**
607    此版本是否在 ARC(适用于 Chrome 的 Android 运行时)上运行<https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md>。在 R 之前,它被实现为容器,但从 R 开始,它将是 VM。属性的名称仍为 ro.boot.conntainer,因为它在其他项目中被引用。
608    如果可能的话,我们应尽量避免检查此标记,以尽量减少 与 非容器 Android 行为的不必要差异。当低级资源不同时,检查此标记是可以接受的,例如某些功能的可用性、对系统资源的访问受到限制以及主机操作系统可能会为我们处理某些功能。对于更高级别的行为差异,应优先进行其他检查。
609    */
610    pub const IS_ARC: ConstFn<bool> =
611        || SystemProperties::get_boolean("ro.boot.container".to_string(), false);
612
613    /**
614    指定是否应在旧版应用的任何组件运行之前审核其所需的权限。旧版应用是指 targetSdkVersion < 23 的应用,即使用旧权限模型的应用。如果无需审核,则会在安装应用之前审核权限。
615    */
616    pub const PERMISSIONS_REVIEW_REQUIRED: bool = true;
617}
618
619/// 各种版本字符串。
620#[allow(non_camel_case_types)]
621#[java_class(name = "android/os/Build$VERSION")]
622pub struct Build_VERSION;
623impl Build_VERSION {
624    /// 底层源代码控制用来表示此构建的内部值。例如,perforce 变更列表编号或 git 哈希。
625    pub const INCREMENTAL: ConstFn = || Build::get_string("ro.build.version.incremental");
626
627    /**
628    用户可见版本字符串。 例如,“ 1.0”或“ 3.4B5”或“香蕉”。
629    此字段是一个不透明的字符串。不要假设其值具有任何特定结构,也不要假设不同版本的 RELEASE 值可以以某种方式排序。
630    */
631    pub const RELEASE: ConstFn = || Build::get_string("ro.build.version.release");
632
633    /// 版本字符串。如果不是最终发布版本,则可能是 RELEASE 或 CODENAME。
634    pub const RELEASE_OR_CODENAME: ConstFn =
635        || Build::get_string("ro.build.version.release_or_codename");
636
637    /// 我们向用户展示的版本字符串;如果不是最终发布版本,则可能是 RELEASE 或描述性字符串。
638    pub const RELEASE_OR_PREVIEW_DISPLAY: ConstFn =
639        || Build::get_string("ro.build.version.release_or_preview_display");
640
641    /// 产品所基于的基本操作系统构建。
642    pub const BASE_OS: ConstFn = || {
643        SystemProperties::get_with_default("ro.build.version.base_os".to_string(), String::new())
644    };
645
646    /// 用户可见的安全补丁级别。此值表示设备最近应用安全补丁的日期。
647    pub const SECURITY_PATCH: ConstFn = || {
648        SystemProperties::get_with_default(
649            "ro.build.version.security_patch".to_string(),
650            String::new(),
651        )
652    };
653
654    /// 框架的原始字符串表示形式中用户可见的 SDK 版本;请改用 SDK_INT。
655    #[deprecated(note = "使用 SDK_INT 可轻松将其作为整数获取。")]
656    pub const SDK: ConstFn = || Build::get_string("ro.build.version.sdk");
657
658    /// 此硬件设备上当前运行的软件的 SDK 版本。设备启动时此值不会改变,但硬件制造商提供 OTA 更新时此值可能会增加。可能的值在 Build.VERSION_CODES 中定义。
659    pub const SDK_INT: ConstFn<i32> =
660        || SystemProperties::get_int("ro.build.version.sdk".to_string(), 0);
661
662    /// 此硬件设备上最初搭载的软件的 SDK 版本。该版本在设备生命周期内永远不会改变,即使 SDK_INT 因 OTA 更新而增加也是如此。可能的值在 Build.VERSION_CODES 中定义。
663    pub const DEVICE_INITIAL_SDK_INT: ConstFn<i32> =
664        || SystemProperties::get_int("ro.product.first_api_level".to_string(), 0);
665
666    /**
667    预发布 SDK 的开发者预览修订版本。在生产平台版本/设备上,此值始终为 0。
668    当此值非零时,自上次正式发布 SDK_INT API 级别以来添加的任何新 API 都只能保证在该特定预览修订版本中存在。例如,API Activity.fooBar() 可能存在于预览修订版本 1 中,但在预览修订版本 2 中被重命名或完全移除,这可能会导致尝试调用它的应用在运行时崩溃。
669    针对预览 API 的实验性应用在使用任何预发布平台 API 之前,应检查此值是否与它们所针对的预览 SDK 修订版本相等 (==)。如果应用检测到的预览 SDK 修订版本不是它们所期望的特定修订版本,则应回退到仅使用之前发布的 API 级别的 API,以避免不必要的运行时异常。
670    */
671    pub const PREVIEW_SDK_INT: ConstFn<i32> =
672        || SystemProperties::get_int("ro.build.version.preview_sdk".to_string(), 0);
673
674    /**
675    给定预发布 SDK 的 SDK 指纹。此值在生产平台版本/设备上始终为“ ”。
676    当该值不是''时。
677    此属性旨在供安装程序用于更细粒度地定位软件包。针对预览 API 的应用程序不应使用此字段,而应使用 ` ` 或使用反射或其他运行时检查来检测 API 的存在或防止意外的运行时行为。
678    */
679    pub const PREVIEW_SDK_FINGERPRINT: ConstFn = || {
680        SystemProperties::get_with_default(
681            "ro.build.version.preview_sdk_fingerprint".to_string(),
682            "REL".to_string(),
683        )
684    };
685
686    /// 当前开发代号,如果这是发布版本,则为字符串“REL”。
687    pub const CODENAME: ConstFn = || Build::get_string("ro.build.version.codename");
688
689    /**
690    VERSION_CODES 中存在的所有已知代号。
691    这也包括开发代号,即如果 CODENAME 不是“REL”,那么该集合中就存在该值。
692    如果此集合中不存在特定字符串,则它不是代号,或者是未来版本的代号。例如,在 Android R 开发期间,“Tiramisu”并不是一个已知的代号。
693    */
694    pub const KNOWN_CODENAMES: ConstFn<HashSet<String>> = || {
695        HashSet::from_iter(
696            Build::get_string_list("ro.build.version.known_codenames", ",").into_iter(),
697        )
698    };
699
700    /// 应用目标 SDK 当前支持的最低值。以较低值为目标的应用可能无法在运行此 SDK 版本的设备上运行。其可能的值在 Build.VERSION_CODES 中定义。
701    pub const MIN_SUPPORTED_TARGET_SDK_INT: ConstFn<i32> =
702        || SystemProperties::get_int("ro.build.version.min_supported_target_sdk".to_string(), 0);
703}
704
705/// 当前已知的 SDK 版本代码的枚举。这些值可以在 VERSION#SDK 中找到。版本号会随着每个官方平台版本的发布而单调递增。
706#[allow(non_camel_case_types)]
707#[java_class(name = "android/os/Build$VERSION_CODES")]
708pub struct Build_VERSION_CODES;
709
710impl Build_VERSION_CODES {
711    /// 当前开发版本的魔术版本号,尚未发布正式版本。
712    /// 这必须与 VMRuntime.SDK_VERSION_CUR_DEVELOPMENT 匹配。
713    pub const CUR_DEVELOPMENT: i32 = 10000;
714
715    /**
716    Android 的原始、第一个版本。耶!
717    2008 年 9 月作为 Android 1.0 公开发布。
718    */
719    pub const BASE: i32 = 1;
720
721    /**
722    第一个Android更新。
723    2009 年 2 月作为 Android 1.1 公开发布。
724    */
725    pub const BASE_1_1: i32 = 2;
726
727    /**
728    C.
729    2009年4月公开发行为Android 1.5。
730    */
731    pub const CUPCAKE: i32 = 3;
732
733    /**
734    D.
735    于 2009 年 9 月作为 Android 1.6 公开发布。针对此版本或更高版本的应用程序将获得以下新的行为变化:
736    它们必须明确请求 android.Manifest.permission#WRITE_EXTERNAL_STORAGE 权限才能修改 SD 卡的内容。(针对早期版本的应用程序将始终请求该权限。)
737    它们必须明确请求 android.Manifest.permission#READ_PHONE_STATE 权限才能检索手机状态信息。(针对早期版本的应用程序将始终请求该权限。)
738    它们被认为支持不同的屏幕密度和尺寸。(除非另有说明,否则针对早期版本的应用程序被认为仅支持中等密度正常尺寸的屏幕)。它们仍然可以通过 supports-screens 清单标记明确指定屏幕支持。
739    android.widget.TabHost 将使用新的深色标签背景设计。
740    */
741    pub const DONUT: i32 = 4;
742
743    /**
744    E.
745    2009 年 10 月公开发布 Android 2.0。针对此版本或更高版本的应用程序将获得以下新的行为变化:
746    android.app.Service#onStartCommand Service.onStartCommand 函数将返回新的 android.app.Service#START_STICKY 行为,而不是旧的兼容性 android.app.Service#START_STICKY_COMPATIBILITY。
747    android.app.Activity 类现在将在按下按键而不是按下按键时执行后退按键,以便能够检测到虚拟按键的取消按键。
748    android.widget.TabWidget 类将使用新的选项卡配色方案。在新方案中,前景选项卡具有中等灰色背景,背景选项卡具有深灰色背景。
749    */
750    pub const ECLAIR: i32 = 5;
751
752    /**
753    E 增量更新。
754    2009 年 12 月作为 Android 2.0.1 公开发布。
755    */
756    pub const ECLAIR_0_1: i32 = 6;
757
758    /**
759    E MR1.
760    2010 年 1 月作为 Android 2.1 公开发布。
761    */
762    pub const ECLAIR_MR1: i32 = 7;
763
764    /**
765    F.
766    2010 年 5 月作为 Android 2.2 公开发布。
767    */
768    pub const FROYO: i32 = 8;
769
770    /**
771    G.
772    2010 年 12 月公开发布为 Android 2.3。针对此版本或更高版本的应用程序将获得以下新的行为变化:应用程序的通知图标将显示在新的深色状态栏背景上,因此在这种情况下必须可见。
773    */
774    pub const GINGERBREAD: i32 = 9;
775
776    /**
777    G MR1.
778    2011 年 2 月作为 Android 2.3.3 公开发布。
779    */
780    pub const GINGERBREAD_MR1: i32 = 10;
781
782    //noinspection SpellCheckingInspection
783    /**
784    H.
785    2011 年 2 月公开发布为 Android 3.0。针对此版本或更高版本的应用程序将获得以下新的行为变化:
786    应用程序的默认主题现在为深色全息:android.R.style#Theme_Holo。
787    在没有物理菜单按钮的大屏幕设备上,软(兼容性)菜单被禁用。
788    活动生命周期已根据 android.app.Activity 略有变化。如果应用程序不调用其 android.app.Activity#onPause Activity.onPause() 方法的超级实现,它将崩溃。
789    当应用程序需要访问其某个组件(活动、接收器、服务、提供程序)的权限时,当应用程序想要访问自己的组件时,此权限不再强制执行。这意味着它可以要求获得它本身并不拥有的组件的权限,但仍然可以访问该组件。
790    android.content.Context#getSharedPreferences Context.getSharedPreferences() 将不会自动重新加载存储中的首选项(除非使用 android.content.Context#MODE_MULTI_PROCESS)。
791    android.view.ViewGroup#setMotionEventSplittingEnabled 默认为 true。
792    android.view.WindowManager.LayoutParams#FLAG_SPLIT_TOUCH 在 Windows 上默认启用。
793    android.widget.PopupWindow#isSplitTouchEnabled() PopupWindow.isSplitTouchEnabled() 默认返回 true。 如果 android.widget.GridView 和 android.widget.ListView 没有实现 android.widget.Checkable,它们将对选定项目使用 android.view.View#setActivated View.setActivated。 android.widget.Scroller 将默认构建为启用“飞轮”行为。
794    */
795    pub const HONEYCOMB: i32 = 11;
796
797    /**
798    H MR1.
799    2011 年 5 月作为 Android 3.1 公开发布。
800    */
801    pub const HONEYCOMB_MR1: i32 = 12;
802
803    //noinspection SpellCheckingInspection
804    /**
805    H MR2.
806    2011 年 7 月作为 Android 3.2 公开发布。更新至 Honeycomb MR1 以支持 7 英寸平板电脑、改进屏幕兼容模式等。
807    从此版本开始,未说明是否支持 XLARGE 屏幕的应用程序只有在针对 HONEYCOMB 或更高版本时才会被假定支持;之前是 GINGERBREAD 或更高版本。不支持至少与当前屏幕一样大屏幕尺寸的应用程序将为用户提供一个 UI,以将其切换到屏幕尺寸兼容模式。
808    此版本引入了基于屏幕尺寸(单位为 dp)的新屏幕尺寸资源限定符:请参阅 android.content.res.Configuration#screenWidthDp、android.content.res.Configuration#screenHeightDp 和 android.content.res.Configuration#smallestScreenWidthDp。根据 android.content.pm.ApplicationInfo#requiresSmallestWidthDp、android.content.pm.ApplicationInfo#compatibleWidthLimitDp 和 android.content.pm.ApplicationInfo#largestWidthLimitDp 在 &lt;supports-screens&gt; 中提供这些资源限定符,优于旧屏幕尺寸存储桶,对于旧设备,将从中推断出适当的存储桶。
809    以此版本或更高版本为目标的应用将获得以下新的行为变化:此版本引入了新的 android.content.pm.PackageManager#FEATURE_SCREEN_PORTRAIT 和 android.content.pm.PackageManager#FEATURE_SCREEN_LANDSCAPE 功能。以以前的平台版本为目标的应用被认为需要设备同时支持纵向和横向;当以 Honeycomb MR1 或更高版本为目标时,应用负责指定其所需的任何特定方向。android.os.AsyncTask 在调用 android.os.AsyncTask#execute 时将默认使用串行执行器。android.content.pm.ActivityInfo#configChanges ActivityInfo.configChanges 将设置 android.content.pm.ActivityInfo#CONFIG_SCREEN_SIZE 和 android.content.pm.ActivityInfo#CONFIG_SMALLEST_SCREEN_SIZE 位;对于较旧的应用程序,需要清除这些,因为一些开发人员对该值进行了绝对比较,而不是正确屏蔽他们感兴趣的位。
810    */
811    pub const HONEYCOMB_MR2: i32 = 13;
812
813    /**
814    I.
815    2011 年 10 月公开发布为 Android 4.0。针对此版本或更高版本的应用程序将获得以下新的行为变化:
816    对于没有专用菜单键的设备,即使在手机上也不会显示软件兼容性菜单键。通过针对 Ice Cream Sandwich 或更高版本,您的 UI 必须始终在平板电脑和手机上具有自己的菜单 UI 可供性(如果需要)。
817    ActionBar 将为您处理此问题。2D 绘图硬件加速现在默认打开。您可以使用 android.R.attr#hardwareAccelerated android:hardwareAccelerated 将其关闭(如果需要),但强烈建议不要这样做,因为它会导致大屏幕设备的性能不佳。
818    应用程序的默认主题现在是“设备默认”主题:android.R.style#Theme_DeviceDefault。这可能是全息深色主题或特定设备定义的其他深色主题。android.R.style#Theme_Holo 系列不得修改,设备才被视为兼容。
819    明确请求 Holo 系列主题的应用程序将保证这些主题不会在同一平台版本内改变特性。希望与设备融合的应用程序应使用 android.R.style#Theme_DeviceDefault 系列的主题。
820    如果您直接关闭光标而不停止对它的管理,托管光标现在可能会引发异常;以前失败会被默默忽略。
821    视图上的 fadingEdge 属性将被忽略(淡入淡出边缘不再是 UI 的标准部分)。新的 requireFadingEdge 属性允许应用程序在特殊情况下强制淡入淡出边缘。
822    android.content.Context#bindService Context.bindService() 不会自动添加 android.content.Context#BIND_WAIVE_PRIORITY。
823    应用程序小部件将自动在其周围添加标准填充,而不是依赖于嵌入到小部件本身的填充。如果您在将窗口添加到窗口管理器后尝试更改窗口类型,则会引发异常。以前这会导致随机的错误行为。
824    android.view.animation.AnimationSet 会解析出定义的 duration、fillBefore、fillAfter、repeatMode 和 startOffset XML 属性。
825    android.app.ActionBar#setHomeButtonEnabled ActionBar.setHomeButtonEnabled() 默认为 false。
826    */
827    pub const ICE_CREAM_SANDWICH: i32 = 14;
828
829    /**
830    I MR1.
831    2011年12月以Android 4.03公开发布。
832    */
833    pub const ICE_CREAM_SANDWICH_MR1: i32 = 15;
834
835    //noinspection SpellCheckingInspection
836    /**
837    J.
838    2012 年 7 月公开发布,版本号为 Android 4.1。针对此版本或更高版本的应用程序将获得以下新的行为变化:
839    您必须明确请求 android.Manifest.permission#READ_CALL_LOG 和/或 android.Manifest.permission#WRITE_CALL_LOG 权限;不再通过 android.Manifest.permission#READ_CONTACTS 和 android.Manifest.permission#WRITE_CONTACTS 隐式提供对通话日志的访问权限。
840    如果为集合容器的 android.widget.RemoteViewsService 生成的视图设置 onClick 处理程序,android.widget.RemoteViews 将引发异常;以前这只会导致警告日志消息。
841    嵌入式选项卡的新 android.app.ActionBar 策略:现在,无论屏幕大小如何,嵌入式选项卡在纵向模式下始终堆叠在操作栏中。
842    android.webkit.WebSettings#setAllowFileAccessFromFileURLs(boolean) WebSettings.setAllowFileAccessFromFileURLs 和 android.webkit.WebSettings#setAllowUniversalAccessFromFileURLs(boolean) WebSettings.setAllowUniversalAccessFromFileURLs 默认为 false。
843    如果应用程序的清单中不存在给定的组件类名,则对 android.content.pm.PackageManager#setComponentEnabledSetting PackageManager.setComponentEnabledSetting 的调用现在将抛出 IllegalArgumentException。如果在 Activity 被销毁后调用,` ` 将抛出 IllegalStateException。
844    辅助功能服务必须需要新的 android.Manifest.permission#BIND_ACCESSIBILITY_SERVICE 权限,否则它们将无法使用。 android.accessibilityservice.AccessibilityServiceInfo#FLAG_INCLUDE_NOT_IMPORTANT_VIEWS 必须设置 AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS 才能将不重要的视图包含在查询中。
845    */
846    pub const JELLY_BEAN: i32 = 16;
847
848    /**
849    J MR1.
850    于 2012 年 11 月公开发布为 Android 4.2。针对此版本或更高版本的应用程序将获得以下行为新变化:内容提供程序:
851    有关详细信息,请参阅提供程序文档中的 android:exported 部分。android.view.View#getLayoutDirection() View.getLayoutDirection() 可以根据语言环境等返回不同于 android.view.View#LAYOUT_DIRECTION_LTR 的值。
852    android.webkit.WebView#addJavascriptInterface(Object, String) WebView.addJavascriptInterface 要求在方法上进行明确注释,以便可以从 Javascript 访问它们。
853    */
854    pub const JELLY_BEAN_MR1: i32 = 17;
855
856    /**
857    J MR2.
858    2013 年 7 月作为 Android 4.3 公开发布。
859    */
860    pub const JELLY_BEAN_MR2: i32 = 18;
861
862    /**
863    K.
864    2013 年 10 月公开发布为 Android 4.4。针对此版本或更高版本的应用将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android KitKat 概述。
865    android.preference.PreferenceActivity#isValidFragment(String) PreferenceActivity.isValueFragment 的默认结果变为 false 而不是 true。
866    在 android.webkit.WebView 中,针对早期版本的应用将直接评估 JS URL,并且评估的任何结果都不会替换当前页面内容。针对 KITKAT 或更高版本的加载 JS URL 的应用将让该 URL 的结果替换当前页面的内容
867    android.app.AlarmManager#set AlarmManager.set 被解释为不精确的值,以便系统在安排闹钟方面更灵活。
868    android.content.Context#getSharedPreferences(String, int) Context.getSharedPreferences 不再允许使用空名称。
869    android.widget.RelativeLayout 更改为正确计算包装的内容边距。允许绘制 android.app.ActionBar 的窗口内容叠加层。
870    android.Manifest.permission#READ_EXTERNAL_STORAGE 权限现在始终强制执行。访问属于调用应用的特定于软件包的外部存储目录不再需要 android.Manifest.permission#READ_EXTERNAL_STORAGE 或 android.Manifest.permission#WRITE_EXTERNAL_STORAGE 权限。
871    */
872    pub const KITKAT: i32 = 19;
873
874    /**
875    K for watches.
876    2014年6月以Android 4.4W公开发布。针对此或以后的版本的应用程序将获得这些新的行为更改:
877    android.app.AlertDialog如果主题未指定一个,则可能没有默认背景。
878    */
879    pub const KITKAT_WATCH: i32 = 20;
880
881    /// 临时直到我们完全切换到Lollipop。
882    pub const L: i32 = 21;
883
884    /**
885    L.
886    于 2014 年 11 月作为 Android 5.0 公开发布。针对此版本或更高版本的应用程序将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android Lollipop 概述。
887    android.content.Context#bindService Context.bindService 现在需要显式 Intent,如果给定隐式 Intent,将会引发异常。
888    android.app.Notification.Builder Notification.Builder 不会调整其各种通知元素的颜色以更好地匹配新的材料设计外观。
889    android.os.Message 将在回收消息时验证消息当前未在使用中。大多数地方将自动启用窗口中的硬件加速绘制。
890    如果连接具有多种项目类型的适配器,android.widget.Spinner 将会引发异常。
891    如果应用程序是启动器,即使用户使用公司配置文件(这要求应用程序使用 android.content.pm.LauncherApps 来正确填充其应用程序 UI),启动器也将可供用户使用。
892    调用 android.app.Service#stopForeground Service.stopForeground 并将 removeNotification 设置为 false 将修改仍在发布的通知,使其不再强制持续。
893    android.service.dreams.DreamService 必须要求 android.Manifest.permission#BIND_DREAM_SERVICE 权限才可使用。
894    */
895    pub const LOLLIPOP: i32 = 21;
896
897    /**
898    L MR1.
899    2015 年 3 月公开发布为 Android 5.1。有关此版本的更多信息,请参阅 Android 5.1 API。
900    */
901    pub const LOLLIPOP_MR1: i32 = 22;
902
903    /**
904    M.
905    2015 年 10 月公开发布为 Android 6.0。针对此版本或更高版本的应用程序将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android 6.0 Marshmallow 概述。
906    运行时权限。危险权限不再在安装时授予,但必须由应用程序在运行时通过 android.app.Activity#requestPermissions 请求。蓝牙和 Wi-Fi 扫描现在需要持有位置权限。
907    android.app.AlarmManager#setTimeZone 如果给定的时区不是 Olson,AlarmManager.setTimeZone 将失败。
908    活动转换只会将返回视图层次结构中映射的共享元素返回给调用活动。 android.view.View 允许多种可能破坏现有应用的行为:如果 restore() 调用次数过多,则 Canvas 会抛出异常;当返回 UNSPECIFIED 测量规格时,小部件可能会返回提示大小;它会尊重属性 android.R.attr#foreground、android.R.attr#foregroundGravity、android.R.attr#foregroundTint 和 android.R.attr#foregroundTintMode。
909    android.view.MotionEvent#getButtonState MotionEvent.getButtonState 将不再将 android.view.MotionEvent#BUTTON_PRIMARY 和 android.view.MotionEvent#BUTTON_SECONDARY 报告为 android.view.MotionEvent#BUTTON_STYLUS_PRIMARY 和 android.view.MotionEvent#BUTTON_STYLUS_SECONDARY 的同义词。 android.widget.ScrollView 现在会在测量时尊重布局参数边距。
910    */
911    pub const M: i32 = 23;
912
913    /**
914    N.
915    2016 年 8 月公开发布,版本号为 Android 7.0。针对此版本或更高版本的应用将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android Nougat 概述。
916    android.app.DownloadManager.Request#setAllowedNetworkTypes DownloadManager.Request.setAllowedNetworkTypes 在仅指定 android.app.DownloadManager.Request#NETWORK_WIFI 时将禁用“允许超过计量”。android.app.DownloadManager 不再允许访问原始文件路径。
917    android.app.Notification.Builder#setShowWhen 必须明确调用 Notification.Builder.setShowWhen 才能显示时间,android.app.Notification.Builder Notification.Builder 中还对通知的显示方式进行了各种其他更改。
918    android.content.Context#MODE_WORLD_READABLE 和 android.content.Context#MODE_WORLD_WRITEABLE 不再受支持。
919    android.os.FileUriExposedException 将抛出到应用程序。应用程序将根据 android.view.View#DRAG_FLAG_GLOBAL 看到全局拖放。
920    android.webkit.WebView#evaluateJavascript WebView.evaluateJavascript 不会从空的 WebView 中保留状态。
921    android.animation.AnimatorSet 不会忽略在 start() 之前对 end() 的调用。
922    android.app.AlarmManager#cancel(android.app.PendingIntent) 如果给定一个空操作,AlarmManager.cancel 将抛出一个 NullPointerException。
923    android.app.FragmentManager 将确保在将片段放入后退堆栈之前已创建片段。android.app.FragmentManager 在 android.app.Fragment#onCreate Fragment.onCreate 中恢复片段,而不是在方法返回后。
924    android.R.attr#resizeableActivity 默认为 true。android.graphics.drawable.AnimatedVectorDrawable 在打开无效的 VectorDrawable 动画时抛出异常。
925    在某些类型的布局参数之间进行转换时(例如从 android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams 到 android.widget.RelativeLayout.LayoutParams RelativeLayout.LayoutParams),android.view.ViewGroup.MarginLayoutParams 将不再被丢弃。
926    设备密度发生变化时,您的应用进程不会被终止。拖放。视图收到 android.view.DragEvent#ACTION_DRAG_ENTERED 事件后,当拖动阴影移动到可以接受数据的后代视图中时,视图会收到 android.view.DragEvent#ACTION_DRAG_EXITED 事件,并且当拖动阴影位于该后代视图内时,不会收到 android.view.DragEvent#ACTION_DRAG_LOCATION 和 android.view.DragEvent#ACTION_DROP 事件,即使后代视图从这些事件的处理程序中返回 false。
927    */
928    pub const N: i32 = 24;
929
930    /**
931    *N MR1.
932    于 2016 年 10 月作为 Android 7.1 公开发布。有关此版本的更多信息,请参阅面向开发者的 Android 7.1。
933    */
934    pub const N_MR1: i32 = 25;
935
936    /**
937    O.
938    2017 年 8 月公开发布为 Android 8.0。针对此版本或更高版本的应用程序将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android Oreo 概述。
939    后台执行限制已应用于应用程序。AccountManager 的 android.accounts.AccountManager#getAccountsByType、android.accounts.AccountManager#getAccountsByTypeAndFeatures 和 android.accounts.AccountManager#hasFeatures 的行为已更改,如那里所述。
940    android.app.ActivityManager.RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE_PRE_26 现在返回为 android.app.ActivityManager.RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE。
941    android.app.NotificationManager 现在需要使用通知通道。
942    在 Application#onCreate Application.onCreate 中设置的严格模式更改将在该函数返回后不再被破坏。
943    带有本机代码的共享库 apk 将把该本机代码包含在其客户端的库路径中。
944    android.content.Context#getSharedPreferences 凭据加密存储中的 Context.getSharedPreferences 将在用户解锁之前引发异常。
945    尝试在不支持该功能的设备上检索 Context#FINGERPRINT_SERVICE 现在将引发运行时异常。
946    当 fragment 停止时,android.app.Fragment 将停止任何活动视图动画。
947    资源中尝试使用应用可能正在使用的默认主题的某些兼容性代码将被关闭,要求应用明确请求具有正确主题的资源。
948    android.content.ContentResolver#notifyChange ContentResolver.notifyChange 和 android.content.ContentResolver#registerContentObserver 如果调用者无权访问提供程序(或提供程序不存在),ContentResolver.registerContentObserver 将引发 SecurityException;否则该调用将被默默忽略。
949    android.hardware.camera2.CameraDevice#createCaptureRequest CameraDevice.createCaptureRequest 将默认启用 android.hardware.camera2.CaptureRequest#CONTROL_ENABLE_ZSL 进行静态图像捕获。
950    如果您无法访问壁纸,WallpaperManager 的 android.app.WallpaperManager#getWallpaperFile、android.app.WallpaperManager#getDrawable、android.app.WallpaperManager#getFastDrawable、android.app.WallpaperManager#peekDrawable 和 android.app.WallpaperManager#peekFastDrawable 将引发异常。
951    android.hardware.usb.UsbDeviceConnection#requestWait UsbDeviceConnection.requestWait 的行为已根据那里的文档进行了修改。
952    StrictMode.VmPolicy.Builder#detectAll StrictMode.VmPolicy.Builder.detectAll 还将启用 StrictMode.VmPolicy.Builder#detectContentUriWithoutPermission 和 StrictMode.VmPolicy.Builder#detectUntaggedSockets。StrictMode.ThreadPolicy.Builder#detectAll StrictMode.ThreadPolicy.Builder.detectAll 还将启用 StrictMode.ThreadPolicy.Builder#detectUnbufferedIo。
953    android.provider.DocumentsContract 的各种方法将向调用者抛出失败异常,而不是返回 null。
954    View#hasFocusable() View.hasFocusable 现在包括可自动对焦的视图。
955    android.view.SurfaceView 将不再总是在底层 Surface 对象发生变化时更改它;应用程序需要查看对象的当前状态以确定他们感兴趣的哪些内容发生了变化。
956    android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY 必须用于覆盖窗口,不允许使用其他系统覆盖窗口类型。
957    android.view.ViewTreeObserver#addOnDrawListener 如果从 onDraw 内部调用 ViewTreeObserver.addOnDrawListener,将会引发异常。
958    android.graphics.Canvas#setBitmap Canvas.setBitmap 将不再保留画布的当前矩阵和剪辑堆栈。
959    android.widget.ListPopupWindow#setHeight 如果提供负高度,ListPopupWindow.setHeight 将会引发异常。
960    android.widget.TextView 将使用国际化输入数字、日期和时间。
961    必须使用 android.widget.Toast 来显示 Toast 窗口;不能直接使用 Toast 窗口类型。
962    android.net.wifi.WifiManager#getConnectionInfo WifiManager.getConnectionInfo 要求调用者持有位置权限才能返回 BSSID/SSID android.net.wifi.p2p.WifiP2pManager#requestPeers WifiP2pManager.requestPeers 要求调用者持有位置权限。
963    android.R.attr#maxAspectRatio 默认为 0,表示对应用的最大宽高比没有限制(因此可以拉伸以填充更大的屏幕)。
964    android.R.attr#focusable 默认为新状态(` `),除非明确覆盖,否则它将继承 android.R.attr#clickable 的值。
965    所有不提供焦点状态可绘制对象的视图都将提供默认的主题适当的焦点状态突出显示。可以通过将 android.R.attr#defaultFocusHighlightEnabled 设置为 false 来禁用此功能。
966    */
967    pub const O: i32 = 26;
968
969    /**
970    O MR1.
971    2017 年 12 月公开发布为 Android 8.1。针对此版本或更高版本的应用将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android 8.1 功能和 API。
972    导出和链接到 apk 共享库的应用必须以一致的顺序明确枚举所有签名证书。如果关联的活动不是全屏且不透明的,则不能使用 android.R.attr#screenOrientation 来请求固定方向。
973    */
974    pub const O_MR1: i32 = 27;
975
976    /**
977    P.
978    2018 年 8 月公开发布为 Android 9。针对此版本或更高版本的应用将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android 9 Pie 概述。
979    android.app.Service#startForeground Service.startForeground 要求应用持有权限 android.Manifest.permission#FOREGROUND_SERVICE。android.widget.LinearLayout 将始终重新测量加权子项,即使没有多余空间也是如此。
980    */
981    pub const P: i32 = 28;
982
983    /**
984    Q.
985    2019 年 9 月公开发布为 Android 10。针对此版本或更高版本的应用将获得这些新的行为变化。有关此版本的更多信息,请参阅 Android 10 概览。
986    行为变化:所有应用行为变化:针对 API 29+ 的应用
987    */
988    pub const Q: i32 = 29;
989
990    /**
991    R.
992    2020 年 9 月公开发布,版本号为 Android 11。针对此版本或更高版本的应用将获得这些新的行为变更。有关此版本的更多信息,请参阅 Android 11 概览。
993    行为变更:所有应用行为变更:针对 Android 11 的应用 Android 11 中非 SDK 接口限制的更新
994    */
995    pub const R: i32 = 30;
996
997    /**
998    S.
999    */
1000    pub const S: i32 = 31;
1001
1002    /**
1003    S V2.
1004    再一次冲向突破口,亲爱的朋友们,再一次。
1005    */
1006    pub const S_V2: i32 = 32;
1007
1008    /**
1009    Tiramisu.
1010    */
1011    pub const TIRAMISU: i32 = 33;
1012
1013    /**
1014    Upside Down Cake.
1015    */
1016    pub const UPSIDE_DOWN_CAKE: i32 = 34;
1017}
1018
1019//noinspection SpellCheckingInspection
1020/**
1021授予对系统属性存储的访问权限。系统属性存储包含字符串键值对列表。仅将此类用于本地系统属性。
1022例如,在应用、分区或模块内。对于跨边界使用的系统属性,请在 *.sysprop 文件中正式定义它们并使用自动生成的方法。有关更多信息,请参阅将系统属性实现为 API。
1023*/
1024#[java_class(name = "android/os/SystemProperties")]
1025pub struct SystemProperties;
1026
1027impl SystemProperties {
1028    /// Android O 删除了属性名称长度限制,但 com.amazon.kindle 7.8.1.5 在每次选择文本时都会使用反射来读取该属性名称长度限制(http://b/36095274)。
1029    pub const PROP_NAME_MAX: i32 = i32::MAX;
1030
1031    #[doc(hidden)]
1032    pub const PROP_VALUE_MAX: i32 = 91;
1033
1034    /**
1035    获取给定键的字符串值。
1036    `key` 查找的钥匙如果找不到键,则一个空字符串
1037    */
1038    #[java_method]
1039    pub fn get(key: String) -> String {}
1040
1041    /**
1042    获取给定键的字符串值。
1043    返回:如果未找到键,则返回 def(如果它不为空),否则返回空字符串
1044    `key` 要查找的键
1045    `def` 如果属性未设置或为空,则返回默认值
1046    */
1047    #[java_method(overload=get)]
1048    pub fn get_with_default(key: String, def: String) -> String {}
1049
1050    /**
1051    获取给定键的值,并以整数形式返回。
1052    返回:解析为整数的键,如果未找到或无法解析键,则返回 def
1053    `key` 要查找的键
1054    `def` 要返回的默认值
1055    */
1056    #[java_method]
1057    pub fn get_int(key: String, def: i32) -> i32 {}
1058
1059    /**
1060    获取给定键的值,并以长整型返回。
1061    返回:解析为长整型的键,如果未找到或无法解析键,则返回 def
1062    `key` 要查找的键
1063    `def` 要返回的默认值
1064    */
1065    #[java_method]
1066    pub fn get_long(key: String, def: i64) -> i64 {}
1067
1068    /**
1069    获取给定键的值,以布尔值形式返回。值“n”、“no”、“0”、“false”或“off”被视为假。值“y”、“yes”、“1”、“true”或“on”被视为真。(区分大小写)。如果键不存在或具有任何其他值,则返回默认结果。
1070    返回:解析为布尔值的键,如果未找到键或无法解析为布尔值,则返回 def。
1071    `key` 要查找的键
1072    `def` 要返回的默认值
1073    */
1074    #[java_method]
1075    pub fn get_boolean(key: String, def: bool) -> bool {}
1076
1077    /**
1078    将给定键的值设置为 val。
1079    抛出:
1080    IllegalArgumentException – 对于非只读属性,如果 val 超过 91 个字符
1081    RuntimeException – 如果无法设置该属性,例如,如果它被 SELinux 阻止。libc 将记录根本原因。
1082    `key` 要设置的key。
1083    `val` 要设置的值。
1084    */
1085    #[java_method]
1086    pub fn set(key: String, val: Option<String>) {}
1087
1088    /**
1089    添加一个回调,该回调将在系统属性发生任何变化时运行。
1090    `callback` 系统属性发生改变时应执行的 Runnable。
1091    */
1092    #[java_method]
1093    pub fn add_change_callback<R: Runnable>(callback: &R) {}
1094
1095    /**
1096    删除目标回调。
1097    `callback` 应删除的 Runnable。
1098    */
1099    #[java_method]
1100    pub fn remove_change_callback<R: Runnable>(callback: &R) {}
1101
1102    //noinspection SpellCheckingInspection
1103    /**
1104    通知侦听器系统属性已发生改变
1105    */
1106    #[java_method]
1107    pub fn report_sysprop_changed() {}
1108
1109    /**
1110    按名称查找属性位置。
1111    返回:属性句柄,如果未设置属性,则返回 null
1112    `name` 属性的名称
1113    */
1114    #[java_method]
1115    pub fn find(name: String) -> Option<SystemProperties_Handle> {}
1116}
1117
1118/// 预定位属性的句柄。提前查找属性句柄可以实现对单个属性的最佳重复查找。
1119#[allow(non_camel_case_types)]
1120#[java_class(name = "android/os/SystemProperties_Handle")]
1121pub struct SystemProperties_Handle;
1122
1123impl SystemProperties_Handle {
1124    /// 返回属性的值
1125    #[java_method]
1126    pub fn get(&self) -> String {}
1127
1128    /**
1129    返回int值或def在解析错误上
1130    `def` 默认值
1131    */
1132    #[java_method]
1133    pub fn get_int(&self, def: i32) -> i32 {}
1134
1135    /**
1136    返回long值或def在解析错误上
1137    `def` 默认值
1138    */
1139    #[java_method]
1140    pub fn get_long(&self, def: i64) -> i64 {}
1141
1142    /**
1143    返回boolean值或def在解析错误上
1144    `def` 默认值
1145    */
1146    #[java_method]
1147    pub fn get_boolean(&self, def: bool) -> bool {}
1148}
1149
1150/// 测试android.os
1151#[cfg(feature = "test_android_os")]
1152pub fn test() {
1153    use crate::{
1154        android::{app::Activity, content::Context},
1155        java::lang::ObjectExt,
1156    };
1157    let bundle = Bundle::new();
1158    assert!(bundle.to_string().starts_with("Bundle"));
1159    let context = Activity::fetch().unwrap();
1160    let vm: VibratorManager = context
1161        .get_system_service(Context::VIBRATOR_MANAGER_SERVICE.to_string())
1162        .unwrap()
1163        .cast()
1164        .unwrap();
1165    let effect = VibrationEffect::create_one_shot(500, VibrationEffect::DEFAULT_AMPLITUDE);
1166    vm.get_default_vibrator().vibrate_effect(&effect);
1167    let _ = dbg!(
1168        Build::PRODUCT_FOR_ATTESTATION(),
1169        Build::DISPLAY(),
1170        Build::ID(),
1171        Build::BOOTLOADER(),
1172        Build::BOARD(),
1173        Build::DEVICE_FOR_ATTESTATION(),
1174        Build::MANUFACTURER(),
1175        Build::MANUFACTURER_FOR_ATTESTATION(),
1176        Build::BRAND(),
1177        Build::BRAND_FOR_ATTESTATION(),
1178        Build::MODEL(),
1179        Build::MODEL_FOR_ATTESTATION(),
1180        Build::HARDWARE(),
1181        Build::SKU(),
1182        Build::ODM_SKU(),
1183        Build::IS_EMULATOR(),
1184        // Build::get_serial(),
1185        Build::SUPPORTED_ABIS(),
1186        Build::SUPPORTED_32_BIT_ABIS(),
1187        Build::SUPPORTED_64_BIT_ABIS()
1188    );
1189}