expo-pedometer 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -11
- package/android/src/main/java/expo/modules/pedometer/ExpoPedometerPermissionRationaleActivity.kt +28 -3
- package/package.json +1 -1
- package/plugin/build/index.d.ts +0 -6
- package/plugin/build/index.d.ts.map +1 -1
- package/plugin/build/index.js +13 -27
- package/plugin/build/index.js.map +1 -1
package/README.md
CHANGED
|
@@ -22,9 +22,6 @@ Add the config plugin:
|
|
|
22
22
|
"expo-pedometer",
|
|
23
23
|
{
|
|
24
24
|
"iosMotionPermission": "Allow this app to read your step count from Motion & Fitness.",
|
|
25
|
-
"androidMinSdkVersion": 26,
|
|
26
|
-
"androidHealthConnectRationaleTitle": "Step count access",
|
|
27
|
-
"androidHealthConnectRationaleDescription": "Step count is read from Health Connect to show today's walking progress.",
|
|
28
25
|
"androidHealthConnectPrivacyPolicyUrl": "https://example.com/privacy"
|
|
29
26
|
}
|
|
30
27
|
]
|
|
@@ -38,7 +35,19 @@ The plugin adds:
|
|
|
38
35
|
- iOS `NSMotionUsageDescription`.
|
|
39
36
|
- Android `android.permission.health.READ_STEPS`.
|
|
40
37
|
- Android Health Connect package query and permission rationale manifest entries.
|
|
41
|
-
|
|
38
|
+
|
|
39
|
+
AndroidX Health Connect requires Android `minSdkVersion` 26 or higher. Configure it in your app, for example with `expo-build-properties`:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
[
|
|
43
|
+
"expo-build-properties",
|
|
44
|
+
{
|
|
45
|
+
"android": {
|
|
46
|
+
"minSdkVersion": 26
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
```
|
|
42
51
|
|
|
43
52
|
## API
|
|
44
53
|
|
|
@@ -101,23 +110,27 @@ export function StepCount() {
|
|
|
101
110
|
|
|
102
111
|
## Android Rationale Localization
|
|
103
112
|
|
|
104
|
-
`androidHealthConnectRationaleTitle
|
|
105
|
-
|
|
113
|
+
`androidHealthConnectRationaleTitle` and `androidHealthConnectRationaleDescription` are optional overrides. They can be literal strings or Android string resource references.
|
|
114
|
+
|
|
115
|
+
If the overrides are omitted, the Android rationale screen reads these app string resources:
|
|
116
|
+
|
|
117
|
+
- `expo_pedometer_health_connect_rationale_title`
|
|
118
|
+
- `expo_pedometer_health_connect_rationale_description`
|
|
119
|
+
|
|
120
|
+
If those resources are not defined, built-in English defaults are used.
|
|
106
121
|
|
|
107
122
|
```json
|
|
108
123
|
[
|
|
109
124
|
"expo-pedometer",
|
|
110
125
|
{
|
|
111
|
-
"androidHealthConnectRationaleTitle": "
|
|
112
|
-
"androidHealthConnectRationaleDescription": "
|
|
126
|
+
"androidHealthConnectRationaleTitle": "Step count access",
|
|
127
|
+
"androidHealthConnectRationaleDescription": "Step count is read from Health Connect to show today's walking progress.",
|
|
113
128
|
"androidHealthConnectPrivacyPolicyUrl": "@string/privacy_policy_url"
|
|
114
129
|
}
|
|
115
130
|
]
|
|
116
131
|
```
|
|
117
132
|
|
|
118
|
-
|
|
119
|
-
`android/app/src/main/res/values/strings.xml` and
|
|
120
|
-
`android/app/src/main/res/values-ko/strings.xml`.
|
|
133
|
+
Apps using config plugins can provide localized values by generating those resource names in localized Android resource folders.
|
|
121
134
|
|
|
122
135
|
## Platform Notes
|
|
123
136
|
|
package/android/src/main/java/expo/modules/pedometer/ExpoPedometerPermissionRationaleActivity.kt
CHANGED
|
@@ -27,12 +27,17 @@ class ExpoPedometerPermissionRationaleActivity : Activity() {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
content.addView(TextView(this).apply {
|
|
30
|
-
text =
|
|
30
|
+
text = readRationaleString(metadata, META_TITLE, RATIONALE_TITLE_RESOURCE, DEFAULT_TITLE)
|
|
31
31
|
textSize = 22f
|
|
32
32
|
})
|
|
33
33
|
|
|
34
34
|
content.addView(TextView(this).apply {
|
|
35
|
-
text =
|
|
35
|
+
text = readRationaleString(
|
|
36
|
+
metadata,
|
|
37
|
+
META_DESCRIPTION,
|
|
38
|
+
RATIONALE_DESCRIPTION_RESOURCE,
|
|
39
|
+
DEFAULT_DESCRIPTION
|
|
40
|
+
)
|
|
36
41
|
textSize = 16f
|
|
37
42
|
setPadding(0, dp(16), 0, 0)
|
|
38
43
|
})
|
|
@@ -56,6 +61,17 @@ class ExpoPedometerPermissionRationaleActivity : Activity() {
|
|
|
56
61
|
return (value * resources.displayMetrics.density).toInt()
|
|
57
62
|
}
|
|
58
63
|
|
|
64
|
+
private fun readRationaleString(
|
|
65
|
+
metadata: Bundle?,
|
|
66
|
+
metadataKey: String,
|
|
67
|
+
resourceName: String,
|
|
68
|
+
fallback: String
|
|
69
|
+
): String {
|
|
70
|
+
return readStringMetaData(metadata, metadataKey)
|
|
71
|
+
?: readStringResource(resourceName)
|
|
72
|
+
?: fallback
|
|
73
|
+
}
|
|
74
|
+
|
|
59
75
|
private fun readStringMetaData(metadata: Bundle?, key: String, fallback: String? = null): String? {
|
|
60
76
|
return when (val value = metadata?.get(key)) {
|
|
61
77
|
is Int -> if (value != 0) getString(value) else fallback
|
|
@@ -72,7 +88,12 @@ class ExpoPedometerPermissionRationaleActivity : Activity() {
|
|
|
72
88
|
|
|
73
89
|
val resourceName = value.removePrefix("@string/")
|
|
74
90
|
val resourceId = resources.getIdentifier(resourceName, "string", packageName)
|
|
75
|
-
return if (resourceId != 0) getString(resourceId) else
|
|
91
|
+
return if (resourceId != 0) getString(resourceId) else null
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private fun readStringResource(resourceName: String): String? {
|
|
95
|
+
val resourceId = resources.getIdentifier(resourceName, "string", packageName)
|
|
96
|
+
return if (resourceId != 0) getString(resourceId) else null
|
|
76
97
|
}
|
|
77
98
|
|
|
78
99
|
companion object {
|
|
@@ -80,6 +101,10 @@ class ExpoPedometerPermissionRationaleActivity : Activity() {
|
|
|
80
101
|
const val META_DESCRIPTION = "expo.modules.pedometer.HEALTH_PERMISSIONS_RATIONALE_DESCRIPTION"
|
|
81
102
|
const val META_PRIVACY_POLICY_URL = "expo.modules.pedometer.PRIVACY_POLICY_URL"
|
|
82
103
|
|
|
104
|
+
private const val RATIONALE_TITLE_RESOURCE =
|
|
105
|
+
"expo_pedometer_health_connect_rationale_title"
|
|
106
|
+
private const val RATIONALE_DESCRIPTION_RESOURCE =
|
|
107
|
+
"expo_pedometer_health_connect_rationale_description"
|
|
83
108
|
private const val DEFAULT_TITLE = "Health permissions"
|
|
84
109
|
private const val DEFAULT_DESCRIPTION =
|
|
85
110
|
"Step count is read from Health Connect to show today's walking progress."
|
package/package.json
CHANGED
package/plugin/build/index.d.ts
CHANGED
|
@@ -24,7 +24,6 @@ type AndroidManifest = {
|
|
|
24
24
|
};
|
|
25
25
|
export type ExpoPedometerPluginProps = {
|
|
26
26
|
iosMotionPermission?: string;
|
|
27
|
-
androidMinSdkVersion?: number;
|
|
28
27
|
androidHealthConnectRationaleTitle?: string;
|
|
29
28
|
androidHealthConnectRationaleDescription?: string;
|
|
30
29
|
androidHealthConnectPrivacyPolicyUrl?: string;
|
|
@@ -32,11 +31,6 @@ export type ExpoPedometerPluginProps = {
|
|
|
32
31
|
};
|
|
33
32
|
export declare const withExpoPedometer: ConfigPlugin<ExpoPedometerPluginProps>;
|
|
34
33
|
export declare function setIosInfoPlist<T extends Record<string, unknown>>(infoPlist: T, props: ExpoPedometerPluginProps): T;
|
|
35
|
-
export declare function setAndroidMinSdkVersion<T extends {
|
|
36
|
-
type: string;
|
|
37
|
-
key?: string;
|
|
38
|
-
value?: string;
|
|
39
|
-
}[]>(gradleProperties: T, minSdkVersion: number): T;
|
|
40
34
|
export declare function setAndroidManifest<T extends AndroidManifest>(androidManifest: T, props: ExpoPedometerPluginProps): T;
|
|
41
35
|
export default withExpoPedometer;
|
|
42
36
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAsC,MAAM,qBAAqB,CAAC;AAa5F,KAAK,eAAe,GAAG;IACrB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;CACtC,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACvB,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;SAAE,EAAE,CAAC;QAC5C,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;QACtC,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACrC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,wCAAwC,CAAC,EAAE,MAAM,CAAC;IAClD,oCAAoC,CAAC,EAAE,MAAM,CAAC;IAC9C,qCAAqC,CAAC,EAAE,MAAM,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,wBAAwB,CAYpE,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE,wBAAwB,KAShC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAC1D,eAAe,EAAE,CAAC,EAClB,KAAK,EAAE,wBAAwB,KAahC;AAsHD,eAAe,iBAAiB,CAAC"}
|
package/plugin/build/index.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.withExpoPedometer = void 0;
|
|
4
4
|
exports.setIosInfoPlist = setIosInfoPlist;
|
|
5
|
-
exports.setAndroidMinSdkVersion = setAndroidMinSdkVersion;
|
|
6
5
|
exports.setAndroidManifest = setAndroidManifest;
|
|
7
6
|
const config_plugins_1 = require("expo/config-plugins");
|
|
8
7
|
const READ_STEPS_PERMISSION = "android.permission.health.READ_STEPS";
|
|
@@ -19,11 +18,6 @@ const withExpoPedometer = (config, props = {}) => {
|
|
|
19
18
|
config.modResults = setIosInfoPlist(config.modResults, props);
|
|
20
19
|
return config;
|
|
21
20
|
});
|
|
22
|
-
config = (0, config_plugins_1.withGradleProperties)(config, (config) => {
|
|
23
|
-
var _a;
|
|
24
|
-
config.modResults = setAndroidMinSdkVersion(config.modResults, (_a = props.androidMinSdkVersion) !== null && _a !== void 0 ? _a : 26);
|
|
25
|
-
return config;
|
|
26
|
-
});
|
|
27
21
|
config = (0, config_plugins_1.withAndroidManifest)(config, (config) => {
|
|
28
22
|
setAndroidManifest(config.modResults, props);
|
|
29
23
|
return config;
|
|
@@ -40,21 +34,6 @@ function setIosInfoPlist(infoPlist, props) {
|
|
|
40
34
|
}
|
|
41
35
|
return infoPlist;
|
|
42
36
|
}
|
|
43
|
-
function setAndroidMinSdkVersion(gradleProperties, minSdkVersion) {
|
|
44
|
-
var _a;
|
|
45
|
-
const targetValue = String(Math.max(minSdkVersion, 26));
|
|
46
|
-
const existing = gradleProperties.find((property) => property.type === "property" && property.key === "android.minSdkVersion");
|
|
47
|
-
if (existing) {
|
|
48
|
-
existing.value = String(Math.max(Number((_a = existing.value) !== null && _a !== void 0 ? _a : 0), Number(targetValue)));
|
|
49
|
-
return gradleProperties;
|
|
50
|
-
}
|
|
51
|
-
gradleProperties.push({
|
|
52
|
-
type: "property",
|
|
53
|
-
key: "android.minSdkVersion",
|
|
54
|
-
value: targetValue,
|
|
55
|
-
});
|
|
56
|
-
return gradleProperties;
|
|
57
|
-
}
|
|
58
37
|
function setAndroidManifest(androidManifest, props) {
|
|
59
38
|
var _a;
|
|
60
39
|
addNamedElement(androidManifest.manifest, "uses-permission", READ_STEPS_PERMISSION);
|
|
@@ -79,16 +58,23 @@ function getMainApplication(androidManifest) {
|
|
|
79
58
|
return androidManifest.manifest.application[0];
|
|
80
59
|
}
|
|
81
60
|
function addOrUpdateActivity(application, activityName, props) {
|
|
82
|
-
var _a, _b, _c
|
|
61
|
+
var _a, _b, _c;
|
|
83
62
|
application.activity = (_a = application.activity) !== null && _a !== void 0 ? _a : [];
|
|
84
63
|
const activity = (_b = application.activity.find((activity) => activity.$["android:name"] === activityName)) !== null && _b !== void 0 ? _b : addElement(application.activity, activityName);
|
|
85
64
|
activity.$["android:exported"] = "true";
|
|
86
65
|
activity["intent-filter"] = upsertIntentFilter(activity["intent-filter"], SHOW_PERMISSIONS_RATIONALE_ACTION);
|
|
87
|
-
|
|
88
|
-
"expo.modules.pedometer.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
66
|
+
const metadata = {
|
|
67
|
+
"expo.modules.pedometer.PRIVACY_POLICY_URL": (_c = props.androidHealthConnectPrivacyPolicyUrl) !== null && _c !== void 0 ? _c : "",
|
|
68
|
+
};
|
|
69
|
+
if (props.androidHealthConnectRationaleTitle) {
|
|
70
|
+
metadata["expo.modules.pedometer.HEALTH_PERMISSIONS_RATIONALE_TITLE"] =
|
|
71
|
+
props.androidHealthConnectRationaleTitle;
|
|
72
|
+
}
|
|
73
|
+
if (props.androidHealthConnectRationaleDescription) {
|
|
74
|
+
metadata["expo.modules.pedometer.HEALTH_PERMISSIONS_RATIONALE_DESCRIPTION"] =
|
|
75
|
+
props.androidHealthConnectRationaleDescription;
|
|
76
|
+
}
|
|
77
|
+
activity["meta-data"] = upsertMetaData(activity["meta-data"], metadata);
|
|
92
78
|
}
|
|
93
79
|
function addOrUpdatePermissionUsageAlias(application, targetActivity) {
|
|
94
80
|
var _a, _b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|