@use-voltra/expo-plugin 1.3.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 +34 -0
- package/build/cjs/android/files/assets.js +259 -0
- package/build/cjs/android/files/assets.js.map +1 -0
- package/build/cjs/android/files/fonts.js +69 -0
- package/build/cjs/android/files/fonts.js.map +1 -0
- package/build/cjs/android/files/index.js +81 -0
- package/build/cjs/android/files/index.js.map +1 -0
- package/build/cjs/android/files/initialStates.js +83 -0
- package/build/cjs/android/files/initialStates.js.map +1 -0
- package/build/cjs/android/files/kotlin.js +142 -0
- package/build/cjs/android/files/kotlin.js.map +1 -0
- package/build/cjs/android/files/xml.js +247 -0
- package/build/cjs/android/files/xml.js.map +1 -0
- package/build/cjs/android/index.js +33 -0
- package/build/cjs/android/index.js.map +1 -0
- package/build/cjs/android/manifest.js +63 -0
- package/build/cjs/android/manifest.js.map +1 -0
- package/build/cjs/constants.js +48 -0
- package/build/cjs/constants.js.map +1 -0
- package/build/cjs/index.js +71 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/ios/eas.js +28 -0
- package/build/cjs/ios/eas.js.map +1 -0
- package/build/cjs/ios/entitlements.js +46 -0
- package/build/cjs/ios/entitlements.js.map +1 -0
- package/build/cjs/ios/index.js +39 -0
- package/build/cjs/ios/index.js.map +1 -0
- package/build/cjs/ios/infoPlist.js +51 -0
- package/build/cjs/ios/infoPlist.js.map +1 -0
- package/build/cjs/ios/pushNotifications.js +22 -0
- package/build/cjs/ios/pushNotifications.js.map +1 -0
- package/build/cjs/ios-widget/eas.js +66 -0
- package/build/cjs/ios-widget/eas.js.map +1 -0
- package/build/cjs/ios-widget/files/assets.js +199 -0
- package/build/cjs/ios-widget/files/assets.js.map +1 -0
- package/build/cjs/ios-widget/files/entitlements.js +77 -0
- package/build/cjs/ios-widget/files/entitlements.js.map +1 -0
- package/build/cjs/ios-widget/files/index.js +92 -0
- package/build/cjs/ios-widget/files/index.js.map +1 -0
- package/build/cjs/ios-widget/files/infoPlist.js +91 -0
- package/build/cjs/ios-widget/files/infoPlist.js.map +1 -0
- package/build/cjs/ios-widget/files/swift.js +256 -0
- package/build/cjs/ios-widget/files/swift.js.map +1 -0
- package/build/cjs/ios-widget/fonts.js +151 -0
- package/build/cjs/ios-widget/fonts.js.map +1 -0
- package/build/cjs/ios-widget/index.js +46 -0
- package/build/cjs/ios-widget/index.js.map +1 -0
- package/build/cjs/ios-widget/podfile.js +43 -0
- package/build/cjs/ios-widget/podfile.js.map +1 -0
- package/build/cjs/ios-widget/widgetPlist.js +99 -0
- package/build/cjs/ios-widget/widgetPlist.js.map +1 -0
- package/build/cjs/ios-widget/xcode/buildPhases.js +245 -0
- package/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -0
- package/build/cjs/ios-widget/xcode/configurationList.js +91 -0
- package/build/cjs/ios-widget/xcode/configurationList.js.map +1 -0
- package/build/cjs/ios-widget/xcode/groups.js +65 -0
- package/build/cjs/ios-widget/xcode/groups.js.map +1 -0
- package/build/cjs/ios-widget/xcode/index.js +155 -0
- package/build/cjs/ios-widget/xcode/index.js.map +1 -0
- package/build/cjs/ios-widget/xcode/mainAppSettings.js +71 -0
- package/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -0
- package/build/cjs/ios-widget/xcode/productFile.js +74 -0
- package/build/cjs/ios-widget/xcode/productFile.js.map +1 -0
- package/build/cjs/ios-widget/xcode/target.js +113 -0
- package/build/cjs/ios-widget/xcode/target.js.map +1 -0
- package/build/cjs/package.json +3 -0
- package/build/cjs/types.js +3 -0
- package/build/cjs/types.js.map +1 -0
- package/build/cjs/utils/entitlements.js +21 -0
- package/build/cjs/utils/entitlements.js.map +1 -0
- package/build/cjs/utils/fileDiscovery.js +107 -0
- package/build/cjs/utils/fileDiscovery.js.map +1 -0
- package/build/cjs/utils/fonts.js +75 -0
- package/build/cjs/utils/fonts.js.map +1 -0
- package/build/cjs/utils/logger.js +51 -0
- package/build/cjs/utils/logger.js.map +1 -0
- package/build/cjs/utils/prerender.js +191 -0
- package/build/cjs/utils/prerender.js.map +1 -0
- package/build/cjs/utils/urlScheme.js +40 -0
- package/build/cjs/utils/urlScheme.js.map +1 -0
- package/build/cjs/validation.js +231 -0
- package/build/cjs/validation.js.map +1 -0
- package/build/esm/android/files/assets.js +223 -0
- package/build/esm/android/files/assets.js.map +1 -0
- package/build/esm/android/files/fonts.js +33 -0
- package/build/esm/android/files/fonts.js.map +1 -0
- package/build/esm/android/files/index.js +77 -0
- package/build/esm/android/files/index.js.map +1 -0
- package/build/esm/android/files/initialStates.js +44 -0
- package/build/esm/android/files/initialStates.js.map +1 -0
- package/build/esm/android/files/kotlin.js +103 -0
- package/build/esm/android/files/kotlin.js.map +1 -0
- package/build/esm/android/files/xml.js +206 -0
- package/build/esm/android/files/xml.js.map +1 -0
- package/build/esm/android/index.js +29 -0
- package/build/esm/android/index.js.map +1 -0
- package/build/esm/android/manifest.js +59 -0
- package/build/esm/android/manifest.js.map +1 -0
- package/build/esm/constants.js +45 -0
- package/build/esm/constants.js.map +1 -0
- package/build/esm/index.js +69 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/ios/eas.js +24 -0
- package/build/esm/ios/eas.js.map +1 -0
- package/build/esm/ios/entitlements.js +42 -0
- package/build/esm/ios/entitlements.js.map +1 -0
- package/build/esm/ios/index.js +34 -0
- package/build/esm/ios/index.js.map +1 -0
- package/build/esm/ios/infoPlist.js +47 -0
- package/build/esm/ios/infoPlist.js.map +1 -0
- package/build/esm/ios/pushNotifications.js +18 -0
- package/build/esm/ios/pushNotifications.js.map +1 -0
- package/build/esm/ios-widget/eas.js +62 -0
- package/build/esm/ios-widget/eas.js.map +1 -0
- package/build/esm/ios-widget/files/assets.js +163 -0
- package/build/esm/ios-widget/files/assets.js.map +1 -0
- package/build/esm/ios-widget/files/entitlements.js +37 -0
- package/build/esm/ios-widget/files/entitlements.js.map +1 -0
- package/build/esm/ios-widget/files/index.js +55 -0
- package/build/esm/ios-widget/files/index.js.map +1 -0
- package/build/esm/ios-widget/files/infoPlist.js +55 -0
- package/build/esm/ios-widget/files/infoPlist.js.map +1 -0
- package/build/esm/ios-widget/files/swift.js +217 -0
- package/build/esm/ios-widget/files/swift.js.map +1 -0
- package/build/esm/ios-widget/fonts.js +111 -0
- package/build/esm/ios-widget/fonts.js.map +1 -0
- package/build/esm/ios-widget/index.js +42 -0
- package/build/esm/ios-widget/index.js.map +1 -0
- package/build/esm/ios-widget/podfile.js +39 -0
- package/build/esm/ios-widget/podfile.js.map +1 -0
- package/build/esm/ios-widget/widgetPlist.js +92 -0
- package/build/esm/ios-widget/widgetPlist.js.map +1 -0
- package/build/esm/ios-widget/xcode/buildPhases.js +208 -0
- package/build/esm/ios-widget/xcode/buildPhases.js.map +1 -0
- package/build/esm/ios-widget/xcode/configurationList.js +87 -0
- package/build/esm/ios-widget/xcode/configurationList.js.map +1 -0
- package/build/esm/ios-widget/xcode/groups.js +61 -0
- package/build/esm/ios-widget/xcode/groups.js.map +1 -0
- package/build/esm/ios-widget/xcode/index.js +118 -0
- package/build/esm/ios-widget/xcode/index.js.map +1 -0
- package/build/esm/ios-widget/xcode/mainAppSettings.js +68 -0
- package/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -0
- package/build/esm/ios-widget/xcode/productFile.js +70 -0
- package/build/esm/ios-widget/xcode/productFile.js.map +1 -0
- package/build/esm/ios-widget/xcode/target.js +108 -0
- package/build/esm/ios-widget/xcode/target.js.map +1 -0
- package/build/esm/package.json +3 -0
- package/build/esm/types.js +2 -0
- package/build/esm/types.js.map +1 -0
- package/build/esm/utils/entitlements.js +18 -0
- package/build/esm/utils/entitlements.js.map +1 -0
- package/build/esm/utils/fileDiscovery.js +71 -0
- package/build/esm/utils/fileDiscovery.js.map +1 -0
- package/build/esm/utils/fonts.js +39 -0
- package/build/esm/utils/fonts.js.map +1 -0
- package/build/esm/utils/logger.js +48 -0
- package/build/esm/utils/logger.js.map +1 -0
- package/build/esm/utils/prerender.js +152 -0
- package/build/esm/utils/prerender.js.map +1 -0
- package/build/esm/utils/urlScheme.js +37 -0
- package/build/esm/utils/urlScheme.js.map +1 -0
- package/build/esm/validation.js +193 -0
- package/build/esm/validation.js.map +1 -0
- package/build/types/android/files/assets.d.ts +26 -0
- package/build/types/android/files/assets.d.ts.map +1 -0
- package/build/types/android/files/fonts.d.ts +19 -0
- package/build/types/android/files/fonts.d.ts.map +1 -0
- package/build/types/android/files/index.d.ts +21 -0
- package/build/types/android/files/index.d.ts.map +1 -0
- package/build/types/android/files/initialStates.d.ts +14 -0
- package/build/types/android/files/initialStates.d.ts.map +1 -0
- package/build/types/android/files/kotlin.d.ts +11 -0
- package/build/types/android/files/kotlin.d.ts.map +1 -0
- package/build/types/android/files/xml.d.ts +25 -0
- package/build/types/android/files/xml.d.ts.map +1 -0
- package/build/types/android/index.d.ts +12 -0
- package/build/types/android/index.d.ts.map +1 -0
- package/build/types/android/manifest.d.ts +15 -0
- package/build/types/android/manifest.d.ts.map +1 -0
- package/build/types/constants.d.ts +29 -0
- package/build/types/constants.d.ts.map +1 -0
- package/build/types/index.d.ts +13 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/ios/eas.d.ts +12 -0
- package/build/types/ios/eas.d.ts.map +1 -0
- package/build/types/ios/entitlements.d.ts +14 -0
- package/build/types/ios/entitlements.d.ts.map +1 -0
- package/build/types/ios/index.d.ts +19 -0
- package/build/types/ios/index.d.ts.map +1 -0
- package/build/types/ios/infoPlist.d.ts +21 -0
- package/build/types/ios/infoPlist.d.ts.map +1 -0
- package/build/types/ios/pushNotifications.d.ts +10 -0
- package/build/types/ios/pushNotifications.d.ts.map +1 -0
- package/build/types/ios-widget/eas.d.ts +15 -0
- package/build/types/ios-widget/eas.d.ts.map +1 -0
- package/build/types/ios-widget/files/assets.d.ts +13 -0
- package/build/types/ios-widget/files/assets.d.ts.map +1 -0
- package/build/types/ios-widget/files/entitlements.d.ts +17 -0
- package/build/types/ios-widget/files/entitlements.d.ts.map +1 -0
- package/build/types/ios-widget/files/index.d.ts +24 -0
- package/build/types/ios-widget/files/index.d.ts.map +1 -0
- package/build/types/ios-widget/files/infoPlist.d.ts +10 -0
- package/build/types/ios-widget/files/infoPlist.d.ts.map +1 -0
- package/build/types/ios-widget/files/swift.d.ts +15 -0
- package/build/types/ios-widget/files/swift.d.ts.map +1 -0
- package/build/types/ios-widget/fonts.d.ts +22 -0
- package/build/types/ios-widget/fonts.d.ts.map +1 -0
- package/build/types/ios-widget/index.d.ts +31 -0
- package/build/types/ios-widget/index.d.ts.map +1 -0
- package/build/types/ios-widget/podfile.d.ts +9 -0
- package/build/types/ios-widget/podfile.d.ts.map +1 -0
- package/build/types/ios-widget/widgetPlist.d.ts +20 -0
- package/build/types/ios-widget/widgetPlist.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/buildPhases.d.ts +25 -0
- package/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/configurationList.d.ts +20 -0
- package/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/groups.d.ts +15 -0
- package/build/types/ios-widget/xcode/groups.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/index.d.ts +20 -0
- package/build/types/ios-widget/xcode/index.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/mainAppSettings.d.ts +15 -0
- package/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/productFile.d.ts +14 -0
- package/build/types/ios-widget/xcode/productFile.d.ts.map +1 -0
- package/build/types/ios-widget/xcode/target.d.ts +42 -0
- package/build/types/ios-widget/xcode/target.d.ts.map +1 -0
- package/build/types/types.d.ts +261 -0
- package/build/types/types.d.ts.map +1 -0
- package/build/types/utils/entitlements.d.ts +9 -0
- package/build/types/utils/entitlements.d.ts.map +1 -0
- package/build/types/utils/fileDiscovery.d.ts +13 -0
- package/build/types/utils/fileDiscovery.d.ts.map +1 -0
- package/build/types/utils/fonts.d.ts +2 -0
- package/build/types/utils/fonts.d.ts.map +1 -0
- package/build/types/utils/logger.d.ts +30 -0
- package/build/types/utils/logger.d.ts.map +1 -0
- package/build/types/utils/prerender.d.ts +25 -0
- package/build/types/utils/prerender.d.ts.map +1 -0
- package/build/types/utils/urlScheme.d.ts +10 -0
- package/build/types/utils/urlScheme.d.ts.map +1 -0
- package/build/types/validation.d.ts +17 -0
- package/build/types/validation.d.ts.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generateWidgetReceivers = generateWidgetReceivers;
|
|
40
|
+
const dedent_1 = __importDefault(require("dedent"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Main Function
|
|
45
|
+
// ============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Generates Kotlin receiver classes for all configured widgets
|
|
48
|
+
*/
|
|
49
|
+
async function generateWidgetReceivers(props) {
|
|
50
|
+
const { platformProjectRoot, packageName, widgets } = props;
|
|
51
|
+
// Determine the package path (e.g., com.example.app -> com/example/app)
|
|
52
|
+
const packagePath = packageName.replace(/\./g, '/');
|
|
53
|
+
const widgetDir = path.join(platformProjectRoot, 'app', 'src', 'main', 'java', packagePath, 'widget');
|
|
54
|
+
// Ensure the widget directory exists
|
|
55
|
+
if (!fs.existsSync(widgetDir)) {
|
|
56
|
+
fs.mkdirSync(widgetDir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
// Generate a receiver class for each widget
|
|
59
|
+
for (const widget of widgets) {
|
|
60
|
+
const className = `VoltraWidget_${widget.id}Receiver`;
|
|
61
|
+
const filePath = path.join(widgetDir, `${className}.kt`);
|
|
62
|
+
const content = generateWidgetReceiverClass(widget, packageName);
|
|
63
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Widget Receiver
|
|
68
|
+
// ============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Generates Kotlin code for a single widget receiver class.
|
|
71
|
+
* If the widget has serverUpdate configured, includes WorkManager scheduling.
|
|
72
|
+
*/
|
|
73
|
+
function generateWidgetReceiverClass(widget, packageName) {
|
|
74
|
+
const className = `VoltraWidget_${widget.id}Receiver`;
|
|
75
|
+
if (widget.serverUpdate) {
|
|
76
|
+
const refreshEnabled = widget.serverUpdate.refresh === true;
|
|
77
|
+
// Widget with server-driven updates: schedule WorkManager periodic task
|
|
78
|
+
return (0, dedent_1.default) `
|
|
79
|
+
package ${packageName}.widget
|
|
80
|
+
|
|
81
|
+
import android.appwidget.AppWidgetManager
|
|
82
|
+
import android.content.Context
|
|
83
|
+
import voltra.widget.VoltraWidgetReceiver
|
|
84
|
+
import voltra.widget.VoltraWidgetUpdateScheduler
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Auto-generated widget receiver for ${widget.displayName}
|
|
88
|
+
* Widget ID: ${widget.id}
|
|
89
|
+
* Server Update: ${widget.serverUpdate.url} (every ${widget.serverUpdate.intervalMinutes ?? 15} minutes)
|
|
90
|
+
* Refresh Button: ${refreshEnabled}
|
|
91
|
+
*/
|
|
92
|
+
class ${className} : VoltraWidgetReceiver() {
|
|
93
|
+
override val widgetId: String = "${widget.id}"
|
|
94
|
+
|
|
95
|
+
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
|
|
96
|
+
super.onUpdate(context, appWidgetManager, appWidgetIds)
|
|
97
|
+
|
|
98
|
+
// Schedule periodic server updates via WorkManager
|
|
99
|
+
VoltraWidgetUpdateScheduler.schedulePeriodicUpdate(
|
|
100
|
+
context = context,
|
|
101
|
+
widgetId = "${widget.id}",
|
|
102
|
+
serverUrl = "${widget.serverUpdate.url}",
|
|
103
|
+
intervalMinutes = ${widget.serverUpdate.intervalMinutes ?? 15}L,
|
|
104
|
+
refreshEnabled = ${refreshEnabled}
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
override fun onDeleted(context: Context, appWidgetIds: IntArray) {
|
|
109
|
+
super.onDeleted(context, appWidgetIds)
|
|
110
|
+
|
|
111
|
+
// Cancel periodic updates when all instances of this widget are removed
|
|
112
|
+
val remaining = appWidgetManager(context, appWidgetIds)
|
|
113
|
+
if (remaining == 0) {
|
|
114
|
+
VoltraWidgetUpdateScheduler.cancelPeriodicUpdate(context, "${widget.id}")
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private fun appWidgetManager(context: Context, deletedIds: IntArray): Int {
|
|
119
|
+
val manager = AppWidgetManager.getInstance(context)
|
|
120
|
+
val componentName = android.content.ComponentName(context, this::class.java)
|
|
121
|
+
val allIds = manager.getAppWidgetIds(componentName)
|
|
122
|
+
return allIds.count { it !in deletedIds }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
// Standard widget without server updates
|
|
128
|
+
return (0, dedent_1.default) `
|
|
129
|
+
package ${packageName}.widget
|
|
130
|
+
|
|
131
|
+
import voltra.widget.VoltraWidgetReceiver
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Auto-generated widget receiver for ${widget.displayName}
|
|
135
|
+
* Widget ID: ${widget.id}
|
|
136
|
+
*/
|
|
137
|
+
class ${className} : VoltraWidgetReceiver() {
|
|
138
|
+
override val widgetId: String = "${widget.id}"
|
|
139
|
+
}
|
|
140
|
+
`;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=kotlin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kotlin.js","sourceRoot":"","sources":["../../../../src/android/files/kotlin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,0DAoBC;AAvCD,oDAA2B;AAC3B,uCAAwB;AACxB,2CAA4B;AAU5B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACI,KAAK,UAAU,uBAAuB,CAAC,KAA+B;IAC3E,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAE3D,wEAAwE;IACxE,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAErG,qCAAqC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,gBAAgB,MAAM,CAAC,EAAE,UAAU,CAAA;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAEhE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,2BAA2B,CAAC,MAA2B,EAAE,WAAmB;IACnF,MAAM,SAAS,GAAG,gBAAgB,MAAM,CAAC,EAAE,UAAU,CAAA;IAErD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,KAAK,IAAI,CAAA;QAC3D,wEAAwE;QACxE,OAAO,IAAA,gBAAM,EAAA;gBACD,WAAW;;;;;;;;8CAQmB,MAAM,CAAC,WAAW;sBAC1C,MAAM,CAAC,EAAE;0BACL,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,MAAM,CAAC,YAAY,CAAC,eAAe,IAAI,EAAE;2BAC1E,cAAc;;cAE3B,SAAS;6CACsB,MAAM,CAAC,EAAE;;;;;;;;gCAQtB,MAAM,CAAC,EAAE;iCACR,MAAM,CAAC,YAAY,CAAC,GAAG;sCAClB,MAAM,CAAC,YAAY,CAAC,eAAe,IAAI,EAAE;qCAC1C,cAAc;;;;;;;;;;+EAU4B,MAAM,CAAC,EAAE;;;;;;;;;;;KAWnF,CAAA;IACH,CAAC;IAED,yCAAyC;IACzC,OAAO,IAAA,gBAAM,EAAA;cACD,WAAW;;;;;4CAKmB,MAAM,CAAC,WAAW;oBAC1C,MAAM,CAAC,EAAE;;YAEjB,SAAS;2CACsB,MAAM,CAAC,EAAE;;GAEjD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generateWidgetInfoFiles = generateWidgetInfoFiles;
|
|
40
|
+
exports.generateWidgetPlaceholderLayouts = generateWidgetPlaceholderLayouts;
|
|
41
|
+
exports.generateWidgetPreviewLayouts = generateWidgetPreviewLayouts;
|
|
42
|
+
const dedent_1 = __importDefault(require("dedent"));
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const logger_1 = require("../../utils/logger");
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Main Functions
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/**
|
|
50
|
+
* Generates widget info XML files for all widgets
|
|
51
|
+
*/
|
|
52
|
+
async function generateWidgetInfoFiles(props) {
|
|
53
|
+
const { platformProjectRoot, widgets } = props;
|
|
54
|
+
const xmlPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'xml');
|
|
55
|
+
const valuesPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'values');
|
|
56
|
+
// Ensure directories exist
|
|
57
|
+
if (!fs.existsSync(xmlPath)) {
|
|
58
|
+
fs.mkdirSync(xmlPath, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
if (!fs.existsSync(valuesPath)) {
|
|
61
|
+
fs.mkdirSync(valuesPath, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
// Generate string resources for all widgets
|
|
64
|
+
const stringsPath = path.join(valuesPath, 'voltra_widgets.xml');
|
|
65
|
+
const stringsContent = generateStringResourcesXml(widgets);
|
|
66
|
+
fs.writeFileSync(stringsPath, stringsContent, 'utf8');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Generates placeholder layout XML
|
|
70
|
+
*/
|
|
71
|
+
async function generateWidgetPlaceholderLayouts(props) {
|
|
72
|
+
const layoutPath = path.join(props.platformProjectRoot, 'app', 'src', 'main', 'res', 'layout');
|
|
73
|
+
if (!fs.existsSync(layoutPath)) {
|
|
74
|
+
fs.mkdirSync(layoutPath, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
const placeholderLayoutPath = path.join(layoutPath, 'voltra_widget_placeholder.xml');
|
|
77
|
+
const placeholderLayoutContent = generatePlaceholderLayoutXml();
|
|
78
|
+
fs.writeFileSync(placeholderLayoutPath, placeholderLayoutContent, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Generates preview layouts for widgets
|
|
82
|
+
*/
|
|
83
|
+
async function generateWidgetPreviewLayouts(props) {
|
|
84
|
+
const { platformProjectRoot, projectRoot, widgets, previewImageMap } = props;
|
|
85
|
+
const layoutPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'layout');
|
|
86
|
+
const xmlPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'xml');
|
|
87
|
+
if (!fs.existsSync(layoutPath)) {
|
|
88
|
+
fs.mkdirSync(layoutPath, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
// Generate preview layouts and get the map
|
|
91
|
+
const previewLayoutMap = await generatePreviewLayouts(widgets, projectRoot, layoutPath, previewImageMap);
|
|
92
|
+
// Write widget info XML for all widgets, including preview references where available
|
|
93
|
+
for (const widget of widgets) {
|
|
94
|
+
const widgetInfoPath = path.join(xmlPath, `voltra_widget_${widget.id}_info.xml`);
|
|
95
|
+
const previewImageResourceName = previewImageMap.get(widget.id);
|
|
96
|
+
const previewLayoutResourceName = previewLayoutMap.get(widget.id);
|
|
97
|
+
const widgetInfoContent = generateWidgetInfoXml(widget, previewImageResourceName, previewLayoutResourceName);
|
|
98
|
+
fs.writeFileSync(widgetInfoPath, widgetInfoContent, 'utf8');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ============================================================================
|
|
102
|
+
// Widget Info XML
|
|
103
|
+
// ============================================================================
|
|
104
|
+
/**
|
|
105
|
+
* Generates widget provider info XML for a single widget
|
|
106
|
+
*/
|
|
107
|
+
function generateWidgetInfoXml(widget, previewImageResourceName, previewLayoutResourceName) {
|
|
108
|
+
const { targetCellWidth, targetCellHeight } = widget;
|
|
109
|
+
const resizeMode = widget.resizeMode || 'horizontal|vertical';
|
|
110
|
+
const widgetCategory = widget.widgetCategory || 'home_screen';
|
|
111
|
+
let minWidth = widget.minWidth;
|
|
112
|
+
if (minWidth === undefined && widget.minCellWidth !== undefined) {
|
|
113
|
+
minWidth = widget.minCellWidth * 70 - 30;
|
|
114
|
+
}
|
|
115
|
+
let minHeight = widget.minHeight;
|
|
116
|
+
if (minHeight === undefined && widget.minCellHeight !== undefined) {
|
|
117
|
+
minHeight = widget.minCellHeight * 70 - 30;
|
|
118
|
+
}
|
|
119
|
+
const minWidthAttr = minWidth !== undefined ? `\n android:minWidth="${minWidth}dp"` : '';
|
|
120
|
+
const minHeightAttr = minHeight !== undefined ? `\n android:minHeight="${minHeight}dp"` : '';
|
|
121
|
+
const previewImageAttr = previewImageResourceName
|
|
122
|
+
? `\n android:previewImage="@drawable/${previewImageResourceName}"`
|
|
123
|
+
: '';
|
|
124
|
+
const previewLayoutAttr = previewLayoutResourceName
|
|
125
|
+
? `\n android:previewLayout="@layout/${previewLayoutResourceName}"`
|
|
126
|
+
: '';
|
|
127
|
+
return (0, dedent_1.default) `
|
|
128
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
129
|
+
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"${minWidthAttr}${minHeightAttr}
|
|
130
|
+
android:targetCellWidth="${targetCellWidth}"
|
|
131
|
+
android:targetCellHeight="${targetCellHeight}"
|
|
132
|
+
android:updatePeriodMillis="0"
|
|
133
|
+
android:initialLayout="@layout/voltra_widget_placeholder"
|
|
134
|
+
android:resizeMode="${resizeMode}"
|
|
135
|
+
android:widgetCategory="${widgetCategory}"
|
|
136
|
+
android:description="@string/voltra_widget_${widget.id}_description"${previewImageAttr}${previewLayoutAttr}>
|
|
137
|
+
</appwidget-provider>
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// String Resources XML
|
|
142
|
+
// ============================================================================
|
|
143
|
+
/**
|
|
144
|
+
* Generates string resources for widget display names and descriptions
|
|
145
|
+
*/
|
|
146
|
+
function generateStringResourcesXml(widgets) {
|
|
147
|
+
const stringEntries = widgets
|
|
148
|
+
.map((widget) => `<string name="voltra_widget_${widget.id}_label">${widget.displayName}</string>\n <string name="voltra_widget_${widget.id}_description">${widget.description}</string>`)
|
|
149
|
+
.join('\n ');
|
|
150
|
+
return (0, dedent_1.default) `
|
|
151
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
152
|
+
<resources>
|
|
153
|
+
<!-- Voltra Widget Labels and Descriptions (Auto-generated) -->
|
|
154
|
+
${stringEntries}
|
|
155
|
+
</resources>
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
// ============================================================================
|
|
159
|
+
// Placeholder Layout XML
|
|
160
|
+
// ============================================================================
|
|
161
|
+
/**
|
|
162
|
+
* Generates placeholder layout XML for widgets
|
|
163
|
+
* This will be replaced by Glance at runtime
|
|
164
|
+
*/
|
|
165
|
+
function generatePlaceholderLayoutXml() {
|
|
166
|
+
return (0, dedent_1.default) `
|
|
167
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
168
|
+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
169
|
+
android:layout_width="match_parent"
|
|
170
|
+
android:layout_height="match_parent"
|
|
171
|
+
android:background="?android:attr/colorBackground">
|
|
172
|
+
<TextView
|
|
173
|
+
android:layout_width="wrap_content"
|
|
174
|
+
android:layout_height="wrap_content"
|
|
175
|
+
android:layout_gravity="center"
|
|
176
|
+
android:text="Loading..."
|
|
177
|
+
android:textColor="?android:attr/textColorPrimary" />
|
|
178
|
+
</FrameLayout>
|
|
179
|
+
`;
|
|
180
|
+
}
|
|
181
|
+
// ============================================================================
|
|
182
|
+
// Preview Layout
|
|
183
|
+
// ============================================================================
|
|
184
|
+
/**
|
|
185
|
+
* Generates an auto-layout XML for image-based preview.
|
|
186
|
+
* This is used when previewImage is provided but no custom previewLayout.
|
|
187
|
+
*/
|
|
188
|
+
function generateAutoImagePreviewLayout(widgetId, drawableResourceName) {
|
|
189
|
+
return (0, dedent_1.default) `
|
|
190
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
191
|
+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
192
|
+
android:layout_width="match_parent"
|
|
193
|
+
android:layout_height="match_parent">
|
|
194
|
+
<ImageView
|
|
195
|
+
android:layout_width="match_parent"
|
|
196
|
+
android:layout_height="match_parent"
|
|
197
|
+
android:src="@drawable/${drawableResourceName}"
|
|
198
|
+
android:scaleType="centerCrop"
|
|
199
|
+
android:contentDescription="@string/voltra_widget_${widgetId}_description" />
|
|
200
|
+
</FrameLayout>
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Generates preview layout XML files for all widgets.
|
|
205
|
+
* Returns a map of widgetId to layout resource name.
|
|
206
|
+
*
|
|
207
|
+
* Strategy:
|
|
208
|
+
* - If previewLayout is provided: copy user's custom XML
|
|
209
|
+
* - Else if previewImage is provided: generate auto-layout with ImageView
|
|
210
|
+
* - Otherwise: no preview layout generated
|
|
211
|
+
*/
|
|
212
|
+
async function generatePreviewLayouts(widgets, projectRoot, layoutPath, previewImageMap) {
|
|
213
|
+
const previewLayoutMap = new Map();
|
|
214
|
+
// Ensure layout directory exists
|
|
215
|
+
if (!fs.existsSync(layoutPath)) {
|
|
216
|
+
fs.mkdirSync(layoutPath, { recursive: true });
|
|
217
|
+
}
|
|
218
|
+
for (const widget of widgets) {
|
|
219
|
+
let layoutContent = null;
|
|
220
|
+
const layoutResourceName = `voltra_widget_${widget.id}_preview`;
|
|
221
|
+
const layoutFilePath = path.join(layoutPath, `${layoutResourceName}.xml`);
|
|
222
|
+
// Strategy 1: User provided custom preview layout
|
|
223
|
+
if (widget.previewLayout) {
|
|
224
|
+
const sourcePath = path.join(projectRoot, widget.previewLayout);
|
|
225
|
+
if (!fs.existsSync(sourcePath)) {
|
|
226
|
+
logger_1.logger.warn(`Preview layout not found for widget '${widget.id}' at ${widget.previewLayout}`);
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
// Copy user's custom XML
|
|
230
|
+
layoutContent = fs.readFileSync(sourcePath, 'utf8');
|
|
231
|
+
logger_1.logger.info(`Using custom preview layout for widget '${widget.id}'`);
|
|
232
|
+
}
|
|
233
|
+
// Strategy 2: Auto-generate layout from preview image
|
|
234
|
+
else if (widget.previewImage && previewImageMap.has(widget.id)) {
|
|
235
|
+
const drawableResourceName = previewImageMap.get(widget.id);
|
|
236
|
+
layoutContent = generateAutoImagePreviewLayout(widget.id, drawableResourceName);
|
|
237
|
+
logger_1.logger.info(`Generated auto preview layout for widget '${widget.id}' from preview image`);
|
|
238
|
+
}
|
|
239
|
+
// Write layout file if we have content
|
|
240
|
+
if (layoutContent) {
|
|
241
|
+
fs.writeFileSync(layoutFilePath, layoutContent, 'utf8');
|
|
242
|
+
previewLayoutMap.set(widget.id, layoutResourceName);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return previewLayoutMap;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../../src/android/files/xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withAndroid = void 0;
|
|
4
|
+
const config_plugins_1 = require("@expo/config-plugins");
|
|
5
|
+
const validation_1 = require("../validation");
|
|
6
|
+
const files_1 = require("./files");
|
|
7
|
+
const manifest_1 = require("./manifest");
|
|
8
|
+
/**
|
|
9
|
+
* Main Android configuration plugin.
|
|
10
|
+
*
|
|
11
|
+
* This orchestrates all Android-related configuration in the correct order:
|
|
12
|
+
* 1. Validate widget configurations with file existence checks
|
|
13
|
+
* 2. Generate widget files (Kotlin receivers, XML metadata, resources)
|
|
14
|
+
* 3. Configure AndroidManifest (receiver entries)
|
|
15
|
+
*/
|
|
16
|
+
const withAndroid = (config, props) => {
|
|
17
|
+
const { widgets, userImagesPath, fonts } = props;
|
|
18
|
+
if (!config.android?.package) {
|
|
19
|
+
throw new Error('Voltra config plugin requires expo.android.package to be set in app.json/app.config.* to configure Android widgets.');
|
|
20
|
+
}
|
|
21
|
+
// Get project root from modRequest if available, otherwise validation will skip file checks
|
|
22
|
+
const projectRoot = config.modRequest?.projectRoot;
|
|
23
|
+
// Validate Android widgets with file existence checks
|
|
24
|
+
widgets.forEach((widget) => (0, validation_1.validateAndroidWidgetConfig)(widget, projectRoot));
|
|
25
|
+
return (0, config_plugins_1.withPlugins)(config, [
|
|
26
|
+
// 1. Generate widget files (must run first so files exist)
|
|
27
|
+
[files_1.generateAndroidWidgetFiles, { widgets, userImagesPath, fonts }],
|
|
28
|
+
// 2. Configure AndroidManifest (must run after files are generated)
|
|
29
|
+
[manifest_1.configureAndroidManifest, { widgets }],
|
|
30
|
+
]);
|
|
31
|
+
};
|
|
32
|
+
exports.withAndroid = withAndroid;
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/android/index.ts"],"names":[],"mappings":";;;AAAA,yDAAgE;AAGhE,8CAA2D;AAC3D,mCAAoD;AACpD,yCAAqD;AAErD;;;;;;;GAOG;AACI,MAAM,WAAW,GAAqC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IAC7E,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAEhD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAA;IACH,CAAC;IAED,4FAA4F;IAC5F,MAAM,WAAW,GAAI,MAAc,CAAC,UAAU,EAAE,WAAW,CAAA;IAE3D,sDAAsD;IACtD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,wCAA2B,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IAE7E,OAAO,IAAA,4BAAW,EAAC,MAAM,EAAE;QACzB,2DAA2D;QAC3D,CAAC,kCAA0B,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAEhE,oEAAoE;QACpE,CAAC,mCAAwB,EAAE,EAAE,OAAO,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC,CAAA;AAtBY,QAAA,WAAW,eAsBvB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureAndroidManifest = void 0;
|
|
4
|
+
const config_plugins_1 = require("@expo/config-plugins");
|
|
5
|
+
const config_plugins_2 = require("expo/config-plugins");
|
|
6
|
+
/**
|
|
7
|
+
* Plugin step that adds widget receiver entries to AndroidManifest.xml
|
|
8
|
+
*
|
|
9
|
+
* This adds a <receiver> entry for each widget with:
|
|
10
|
+
* - The generated receiver class name
|
|
11
|
+
* - APPWIDGET_UPDATE intent filter
|
|
12
|
+
* - Widget provider metadata reference
|
|
13
|
+
*/
|
|
14
|
+
const configureAndroidManifest = (config, props) => {
|
|
15
|
+
const { widgets } = props;
|
|
16
|
+
return (0, config_plugins_1.withAndroidManifest)(config, (config) => {
|
|
17
|
+
const mainApplication = config_plugins_2.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
|
|
18
|
+
// Add a receiver for each widget
|
|
19
|
+
for (const widget of widgets) {
|
|
20
|
+
const receiverClassName = `.widget.VoltraWidget_${widget.id}Receiver`;
|
|
21
|
+
// Check if receiver already exists
|
|
22
|
+
const existingReceivers = (mainApplication.receiver || []);
|
|
23
|
+
const alreadyExists = existingReceivers.some((receiver) => receiver.$?.['android:name'] === receiverClassName);
|
|
24
|
+
if (!alreadyExists) {
|
|
25
|
+
// Create the receiver entry
|
|
26
|
+
const receiver = {
|
|
27
|
+
$: {
|
|
28
|
+
'android:name': receiverClassName,
|
|
29
|
+
'android:exported': 'true',
|
|
30
|
+
'android:label': `@string/voltra_widget_${widget.id}_label`,
|
|
31
|
+
},
|
|
32
|
+
'intent-filter': [
|
|
33
|
+
{
|
|
34
|
+
action: [
|
|
35
|
+
{
|
|
36
|
+
$: {
|
|
37
|
+
'android:name': 'android.appwidget.action.APPWIDGET_UPDATE',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
'meta-data': [
|
|
44
|
+
{
|
|
45
|
+
$: {
|
|
46
|
+
'android:name': 'android.appwidget.provider',
|
|
47
|
+
'android:resource': `@xml/voltra_widget_${widget.id}_info`,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
// Add the receiver to the application
|
|
53
|
+
if (!mainApplication.receiver) {
|
|
54
|
+
mainApplication.receiver = [];
|
|
55
|
+
}
|
|
56
|
+
mainApplication.receiver.push(receiver);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return config;
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
exports.configureAndroidManifest = configureAndroidManifest;
|
|
63
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/android/manifest.ts"],"names":[],"mappings":";;;AAAA,yDAAwE;AACxE,wDAAmD;AAQnD;;;;;;;GAOG;AACI,MAAM,wBAAwB,GAAgD,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACrG,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAEzB,OAAO,IAAA,oCAAmB,EAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5C,MAAM,eAAe,GAAG,8BAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,MAAM,CAAC,UAAU,CAAQ,CAAA;QAClG,iCAAiC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,iBAAiB,GAAG,wBAAwB,MAAM,CAAC,EAAE,UAAU,CAAA;YAErE,mCAAmC;YACnC,MAAM,iBAAiB,GAAG,CAAC,eAAe,CAAC,QAAQ,IAAI,EAAE,CAAU,CAAA;YACnE,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAC1C,CAAC,QAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,iBAAiB,CACtE,CAAA;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,4BAA4B;gBAC5B,MAAM,QAAQ,GAAG;oBACf,CAAC,EAAE;wBACD,cAAc,EAAE,iBAAiB;wBACjC,kBAAkB,EAAE,MAAe;wBACnC,eAAe,EAAE,yBAAyB,MAAM,CAAC,EAAE,QAAQ;qBAC5D;oBACD,eAAe,EAAE;wBACf;4BACE,MAAM,EAAE;gCACN;oCACE,CAAC,EAAE;wCACD,cAAc,EAAE,2CAA2C;qCAC5D;iCACF;6BACF;yBACF;qBACF;oBACD,WAAW,EAAE;wBACX;4BACE,CAAC,EAAE;gCACD,cAAc,EAAE,4BAA4B;gCAC5C,kBAAkB,EAAE,sBAAsB,MAAM,CAAC,EAAE,OAAO;6BAC3D;yBACF;qBACF;iBACF,CAAA;gBAED,sCAAsC;gBACtC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;oBAC9B,eAAe,CAAC,QAAQ,GAAG,EAAE,CAAA;gBAC/B,CAAC;gBACD,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAtDY,QAAA,wBAAwB,4BAsDpC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MODULE_EXTENSIONS = exports.WIDGET_FAMILY_MAP = exports.DEFAULT_WIDGET_FAMILIES = exports.SUPPORTED_IMAGE_EXTENSIONS = exports.MAX_IMAGE_SIZE_BYTES = exports.DEFAULT_ANDROID_USER_IMAGES_PATH = exports.DEFAULT_USER_IMAGES_PATH = exports.IOS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Constants for the Voltra plugin
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// iOS Constants
|
|
9
|
+
// ============================================================================
|
|
10
|
+
exports.IOS = {
|
|
11
|
+
/** Minimum iOS deployment target version */
|
|
12
|
+
DEPLOYMENT_TARGET: '17.0',
|
|
13
|
+
/** Swift language version */
|
|
14
|
+
SWIFT_VERSION: '5.0',
|
|
15
|
+
/** Target device families (1 = iPhone, 2 = iPad) */
|
|
16
|
+
DEVICE_FAMILY: '1,2',
|
|
17
|
+
/** Last Swift migration version for Xcode */
|
|
18
|
+
LAST_SWIFT_MIGRATION: 1250,
|
|
19
|
+
};
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Path Constants
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/** Default path for user-provided widget images */
|
|
24
|
+
exports.DEFAULT_USER_IMAGES_PATH = './assets/voltra';
|
|
25
|
+
/** Default path for user-provided Android widget images */
|
|
26
|
+
exports.DEFAULT_ANDROID_USER_IMAGES_PATH = './assets/voltra-android';
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Widget Constants
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/** Maximum image size in bytes for Live Activities (4KB limit) */
|
|
31
|
+
exports.MAX_IMAGE_SIZE_BYTES = 4096;
|
|
32
|
+
/** Supported image extensions for widget assets */
|
|
33
|
+
exports.SUPPORTED_IMAGE_EXTENSIONS = /\.(png|jpg|jpeg)$/i;
|
|
34
|
+
/** Default widget families when not specified */
|
|
35
|
+
exports.DEFAULT_WIDGET_FAMILIES = ['systemSmall', 'systemMedium', 'systemLarge'];
|
|
36
|
+
/** Maps JS widget family names to SwiftUI WidgetFamily enum cases */
|
|
37
|
+
exports.WIDGET_FAMILY_MAP = {
|
|
38
|
+
systemSmall: '.systemSmall',
|
|
39
|
+
systemMedium: '.systemMedium',
|
|
40
|
+
systemLarge: '.systemLarge',
|
|
41
|
+
systemExtraLarge: '.systemExtraLarge',
|
|
42
|
+
accessoryCircular: '.accessoryCircular',
|
|
43
|
+
accessoryRectangular: '.accessoryRectangular',
|
|
44
|
+
accessoryInline: '.accessoryInline',
|
|
45
|
+
};
|
|
46
|
+
/** Extensions to try when resolving module paths for pre-rendering */
|
|
47
|
+
exports.MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', ''];
|
|
48
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AAEH,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAElE,QAAA,GAAG,GAAG;IACjB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM;IAEzB,6BAA6B;IAC7B,aAAa,EAAE,KAAK;IAEpB,oDAAoD;IACpD,aAAa,EAAE,KAAK;IAEpB,6CAA6C;IAC7C,oBAAoB,EAAE,IAAI;CAClB,CAAA;AAEV,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,mDAAmD;AACtC,QAAA,wBAAwB,GAAG,iBAAiB,CAAA;AAEzD,2DAA2D;AAC9C,QAAA,gCAAgC,GAAG,yBAAyB,CAAA;AAEzE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,kEAAkE;AACrD,QAAA,oBAAoB,GAAG,IAAI,CAAA;AAExC,mDAAmD;AACtC,QAAA,0BAA0B,GAAG,oBAAoB,CAAA;AAE9D,iDAAiD;AACpC,QAAA,uBAAuB,GAAmB,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;AAErG,qEAAqE;AACxD,QAAA,iBAAiB,GAAiC;IAC7D,WAAW,EAAE,cAAc;IAC3B,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,mBAAmB;IACrC,iBAAiB,EAAE,oBAAoB;IACvC,oBAAoB,EAAE,uBAAuB;IAC7C,eAAe,EAAE,kBAAkB;CACpC,CAAA;AAED,sEAAsE;AACzD,QAAA,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config_plugins_1 = require("expo/config-plugins");
|
|
4
|
+
const android_1 = require("./android");
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
const ios_1 = require("./ios");
|
|
7
|
+
const ios_widget_1 = require("./ios-widget");
|
|
8
|
+
const urlScheme_1 = require("./utils/urlScheme");
|
|
9
|
+
const validation_1 = require("./validation");
|
|
10
|
+
/**
|
|
11
|
+
* Main Voltra config plugin.
|
|
12
|
+
*
|
|
13
|
+
* This plugin configures your Expo app for:
|
|
14
|
+
* - Live Activities (Dynamic Island + Lock Screen)
|
|
15
|
+
* - Home Screen Widgets (iOS and Android)
|
|
16
|
+
* - Push Notifications for Live Activities (optional)
|
|
17
|
+
*/
|
|
18
|
+
const withVoltra = (config, props = {}) => {
|
|
19
|
+
// Validate props at entry point
|
|
20
|
+
(0, validation_1.validateProps)(props);
|
|
21
|
+
// Configure iOS if bundleIdentifier is available
|
|
22
|
+
if (config.ios?.bundleIdentifier) {
|
|
23
|
+
// Use deploymentTarget from props if provided, otherwise fall back to default
|
|
24
|
+
const deploymentTarget = props.deploymentTarget || constants_1.IOS.DEPLOYMENT_TARGET;
|
|
25
|
+
// Use custom targetName if provided, otherwise fall back to default "{AppName}LiveActivity"
|
|
26
|
+
const targetName = props.targetName || `${config_plugins_1.IOSConfig.XcodeUtils.sanitizedName(config.name)}LiveActivity`;
|
|
27
|
+
const bundleIdentifier = `${config.ios.bundleIdentifier}.${targetName}`;
|
|
28
|
+
// Extract version and buildNumber from config, defaulting to Expo defaults
|
|
29
|
+
const version = config.version || '1.0.0';
|
|
30
|
+
const buildNumber = config.ios?.buildNumber || '1';
|
|
31
|
+
// Ensure URL scheme is set for widget deep linking
|
|
32
|
+
config = (0, urlScheme_1.ensureURLScheme)(config);
|
|
33
|
+
// Derive a default keychainGroup from bundle identifier when any widget uses server-driven updates
|
|
34
|
+
const hasServerDrivenWidgets = props?.widgets?.some((w) => w.serverUpdate) ?? false;
|
|
35
|
+
const keychainGroup = props?.keychainGroup ??
|
|
36
|
+
(hasServerDrivenWidgets ? `$(AppIdentifierPrefix)${config.ios?.bundleIdentifier}` : undefined);
|
|
37
|
+
// Configure iOS main app (Info.plist, entitlements, EAS)
|
|
38
|
+
config = (0, ios_1.withIOS)(config, {
|
|
39
|
+
groupIdentifier: props?.groupIdentifier,
|
|
40
|
+
widgetIds: props?.widgets && props.widgets.length > 0 ? props.widgets.map((w) => w.id) : undefined,
|
|
41
|
+
widgets: props?.widgets,
|
|
42
|
+
keychainGroup,
|
|
43
|
+
});
|
|
44
|
+
// Configure iOS widget extension (files, xcode, podfile, plist, eas)
|
|
45
|
+
config = (0, ios_widget_1.withIOS)(config, {
|
|
46
|
+
targetName,
|
|
47
|
+
bundleIdentifier,
|
|
48
|
+
deploymentTarget,
|
|
49
|
+
widgets: props?.widgets,
|
|
50
|
+
version,
|
|
51
|
+
buildNumber,
|
|
52
|
+
...(props?.groupIdentifier ? { groupIdentifier: props.groupIdentifier } : {}),
|
|
53
|
+
...(keychainGroup ? { keychainGroup } : {}),
|
|
54
|
+
...(props?.fonts ? { fonts: props.fonts } : {}),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Apply Android configuration (files, manifest)
|
|
58
|
+
if (props.android) {
|
|
59
|
+
config = (0, android_1.withAndroid)(config, {
|
|
60
|
+
widgets: props.android.widgets ?? [],
|
|
61
|
+
...(props?.fonts ? { fonts: props.fonts } : {}),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Optionally enable push notifications
|
|
65
|
+
if (props.enablePushNotifications) {
|
|
66
|
+
config = (0, ios_1.withPushNotifications)(config);
|
|
67
|
+
}
|
|
68
|
+
return config;
|
|
69
|
+
};
|
|
70
|
+
exports.default = withVoltra;
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|