1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use serde::{Deserialize, Serialize};

/// Specifies a system permission that the user must grant in order for the app
/// to operate correctly.
///
/// Permissions are granted by the user when the application is installed (on devices
/// running Android 5.1 and lower) or while the app is running (on devices running Android
/// 6.0 and higher). For more information on permissions, see the [`Permissions`] section
/// in the introduction and the separate [`System Permissions`] API guide. A list of
/// permissions defined by the base platform can be found at
/// [`android.Manifest.permission`].
///
/// ## Note
/// In some cases, the permissions that you request through
/// `<uses-permission>` can affect how your application is filtered by Google Play.
///
/// If you request a hardware-related permission — `CAMERA`, for example — Google Play
/// assumes that your application requires the underlying hardware feature and filters the
/// application from devices that do not offer it.
///
/// To control filtering, always explicitly declare hardware features in `<uses-feature>`
/// elements, rather than relying on Google Play to "discover" the requirements in
/// `<uses-permission>` elements. Then, if you want to disable filtering for a particular
/// feature, you can add a `android:required`="`false`" attribute to the <uses-feature>
/// declaration.
///
/// For a list of permissions that imply hardware features, see the documentation for the
/// [`<uses-feature>`] element.
///
/// ## XML Syntax
/// ```xml
/// <uses-permission android:name="string"
///          android:maxSdkVersion="integer" />
/// ```
///
/// ## Contained in
/// * [`<manifest>`]
///
/// ## Introduced in
/// API Level 1
///
/// [`Permissions`]: https://developer.android.com/guide/topics/manifest/manifest-intro#perms
/// [`System Permissions`]: https://developer.android.com/guide/topics/permissions/overview
/// [`android.Manifest.permission`]: https://developer.android.com/reference/android/Manifest.permission
/// [`<uses-feature>`]: https://developer.android.com/guide/topics/manifest/uses-feature-element#permissions-features
/// [`<manifest>`]: crate::AndroidManifest
#[derive(Debug, Deserialize, Serialize, YaSerialize, YaDeserialize, PartialEq, Default, Clone)]
pub struct UsesPermission {
    /// The name of the permission. It can be a permission defined by theapplication with
    /// the [`<permission>`] element, a permission defined by another application, or
    /// one of the standard system permissions (such as [`android.permission.CAMERA`]
    /// or [`android.permission.READ_CONTACTS`]). As these examples show, a
    /// permission name typically includes the package name as a prefix.
    ///
    /// [`<permission>`]: crate::Permission
    /// [`android.permission.CAMERA`]: https://developer.android.com/reference/android/Manifest.permission#CAMERA
    /// [`android.permission.READ_CONTACTS`]: https://developer.android.com/reference/android/Manifest.permission#READ_CONTACTS
    #[yaserde(attribute, prefix = "android")]
    pub name: Option<String>,
    /// The highest API level at which this permission should be granted to your app.
    /// Setting this attribute is useful if the permission your app requires is no
    /// longer needed beginning at a certain API level.
    ///
    /// ## XML Examples
    /// Beginning with Android 4.4 (API level 19), it's no longer necessary for your app
    /// to request the [`WRITE_EXTERNAL_STORAGE`] permission when your app wants to
    /// write to its own application-specific directories on external storage (the
    /// directories provided by [`getExternalFilesDir()`]). However, the permission is
    /// required for API level 18 and lower. So you can declare that this permission
    /// is needed only up to API level 18 with a declaration such as this:
    ///
    /// ```xml
    /// <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    ///                  android:maxSdkVersion="18" />
    /// ```
    /// This way, beginning with API level 19, the system will no longer grant your app
    /// the [`WRITE_EXTERNAL_STORAGE`] permission.
    ///
    /// This attribute was added in API level 19.
    ///
    /// [`WRITE_EXTERNAL_STORAGE`]: https://developer.android.com/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE
    /// [`getExternalFilesDir()`]: https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)
    #[yaserde(attribute, prefix = "android", rename = "maxSdkVersion")]
    pub max_sdk_version: Option<u32>,
}