crossbundle_tools/types/android/
manifest.rs

1pub use android_manifest;
2
3use super::AndroidStrategy;
4use android_manifest::*;
5
6/// Updates [`AndroidManifest`](android_manifest::AndroidManifest) with default values.
7pub fn update_android_manifest_with_default(
8    manifest: &mut AndroidManifest,
9    app_name: Option<String>,
10    package_name: &str,
11    strategy: super::AndroidStrategy,
12) {
13    if manifest.package.is_empty() {
14        manifest.package = format!("com.crossbow.{}", package_name.replace('-', "_"));
15    }
16    if manifest.version_name.is_none() {
17        manifest.version_name = Some("0.1.0".to_owned());
18    }
19    if manifest.version_code.is_none() {
20        manifest.version_code = Some(1_u32);
21    }
22    if manifest.uses_sdk.is_none() {
23        manifest.uses_sdk = Some(UsesSdk {
24            min_sdk_version: Some(19),
25            target_sdk_version: Some(31),
26            max_sdk_version: None,
27        });
28    }
29    if manifest.application.has_code.is_none() {
30        manifest.application.has_code = Some(strategy == AndroidStrategy::GradleApk);
31    }
32    if manifest.application.label.is_none() {
33        manifest.application.label = Some(StringResourceOrString::string(
34            &app_name.unwrap_or_else(|| "Crossbow".to_owned()),
35        ));
36    }
37    if manifest.application.theme.is_none() {
38        manifest.application.theme = Some(Resource::new_with_package(
39            "Theme.DeviceDefault.NoActionBar.Fullscreen",
40            Some("android".to_string()),
41        ));
42    }
43    if manifest.application.activity.is_empty() {
44        manifest.application.activity = vec![Activity::default()];
45    }
46    if manifest.application.activity.len() == 1 {
47        let mut activity = manifest.application.activity.get_mut(0).unwrap();
48        if activity.name.is_empty() {
49            activity.name = match strategy == AndroidStrategy::GradleApk {
50                true => "com.crossbow.game.CrossbowApp".to_string(),
51                false => "android.app.NativeActivity".to_string(),
52            };
53        }
54        if activity.resizeable_activity.is_none() {
55            activity.resizeable_activity = Some(true);
56        }
57        if activity.exported.is_none() {
58            activity.exported = Some(true);
59        }
60        if !activity
61            .meta_data
62            .iter()
63            .any(|m| m.name == Some("android.app.lib_name".to_string()))
64        {
65            activity.meta_data.push(MetaData {
66                name: Some("android.app.lib_name".to_string()),
67                value: Some(match strategy == AndroidStrategy::GradleApk {
68                    true => "crossbow_android".to_string(),
69                    false => package_name.replace('-', "_"),
70                }),
71                ..Default::default()
72            });
73        }
74        if activity.intent_filter.is_empty() {
75            activity.intent_filter = vec![IntentFilter {
76                action: vec![Action {
77                    name: Some("android.intent.action.MAIN".to_string()),
78                }],
79                category: vec![Category {
80                    name: Some("android.intent.category.LAUNCHER".to_string()),
81                }],
82                ..Default::default()
83            }];
84        }
85    }
86}