@purchasely/cordova-plugin-purchasely 1.1.7 → 2.0.1

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.
@@ -15,16 +15,16 @@
15
15
  NSString *apiKey = [command argumentAtIndex:0];
16
16
  NSString *userId = [command argumentAtIndex:2];
17
17
  NSInteger logLevel = [[command argumentAtIndex:3] intValue];
18
- BOOL observerMode = [[command argumentAtIndex:4] boolValue];
18
+ NSInteger runningMode = [[command argumentAtIndex:4] intValue];
19
19
 
20
- [Purchasely startWithAPIKey:apiKey appUserId:userId observerMode:observerMode eventDelegate:nil uiDelegate:nil confirmPurchaseHandler:nil logLevel:logLevel initialized:^(BOOL initialized, NSError * _Nullable error) {
21
- if (error != nil) {
22
- [self failureFor:command resultString: error.localizedDescription];
23
- } else {
24
- [self successFor:command resultBool:initialized];
25
- }
26
- }];
27
20
  [Purchasely setAppTechnology:PLYAppTechnologyCordova];
21
+ [Purchasely startWithAPIKey:apiKey appUserId:userId runningMode:runningMode eventDelegate:nil uiDelegate:nil paywallActionsInterceptor:nil logLevel:logLevel initialized:^(BOOL initialized, NSError * _Nullable error) {
22
+ if (error != nil) {
23
+ [self failureFor:command resultString: error.localizedDescription];
24
+ } else {
25
+ [self successFor:command resultBool:initialized];
26
+ }
27
+ }];
28
28
  }
29
29
 
30
30
  - (void)setLogLevel:(CDVInvokedUrlCommand*)command {
@@ -72,61 +72,82 @@
72
72
 
73
73
  - (void)presentPresentationWithIdentifier:(CDVInvokedUrlCommand*)command {
74
74
  NSString *presentationVendorId = [command argumentAtIndex:0];
75
-
76
- UIViewController *ctrl = [Purchasely presentationControllerWith:presentationVendorId completion:^(enum PLYProductViewControllerResult result, PLYPlan * _Nullable plan) {
77
- NSDictionary *resultDict = [self resultDictionaryForPresentationController:result plan:plan];
78
- [self successFor:command resultDict:resultDict];
79
- }];
80
-
81
- UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl];
82
- [navCtrl.navigationBar setTranslucent:YES];
83
- [navCtrl.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
84
- [navCtrl.navigationBar setShadowImage: [UIImage new]];
85
- [navCtrl.navigationBar setTintColor: [UIColor whiteColor]];
86
-
87
- self.presentedPresentationViewController = navCtrl;
88
-
89
- [Purchasely showController:navCtrl type: PLYUIControllerTypeProductPage];
75
+ NSString *contentId = [command argumentAtIndex:1];
76
+ BOOL isFullscreen = [[command argumentAtIndex:2] boolValue];
77
+
78
+ UIViewController *ctrl = [Purchasely presentationControllerWith:presentationVendorId contentId:contentId loaded:nil completion:^(enum PLYProductViewControllerResult result, PLYPlan * _Nullable plan) {
79
+ NSDictionary *resultDict = [self resultDictionaryForPresentationController:result plan:plan];
80
+ [self successFor:command resultDict:resultDict];
81
+ }];
82
+
83
+ if (ctrl != nil) {
84
+ UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl];
85
+ [navCtrl.navigationBar setTranslucent:YES];
86
+ [navCtrl.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
87
+ [navCtrl.navigationBar setShadowImage: [UIImage new]];
88
+ [navCtrl.navigationBar setTintColor: [UIColor whiteColor]];
89
+
90
+ self.presentedPresentationViewController = navCtrl;
91
+
92
+ if (isFullscreen) {
93
+ navCtrl.modalPresentationStyle = UIModalPresentationFullScreen;
94
+ }
95
+ [Purchasely showController:navCtrl type: PLYUIControllerTypeProductPage];
96
+ }
90
97
  }
91
98
 
92
99
  - (void)presentPlanWithIdentifier:(CDVInvokedUrlCommand*)command {
93
100
  NSString *planVendorId = [command argumentAtIndex:0];
94
101
  NSString *presentationVendorId = [command argumentAtIndex:1];
95
-
96
- UIViewController *ctrl = [Purchasely planControllerFor:planVendorId with:presentationVendorId completion:^(enum PLYProductViewControllerResult result, PLYPlan * _Nullable plan) {
102
+ NSString *contentId = [command argumentAtIndex:2];
103
+ BOOL isFullscreen = [[command argumentAtIndex:3] boolValue];
104
+
105
+ UIViewController *ctrl = [Purchasely planControllerFor:planVendorId with:presentationVendorId contentId:contentId loaded:nil completion:^(enum PLYProductViewControllerResult result, PLYPlan * _Nullable plan) {
97
106
  NSDictionary *resultDict = [self resultDictionaryForPresentationController:result plan:plan];
98
107
  [self successFor:command resultDict:resultDict];
99
108
  }];
100
109
 
101
- UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl];
102
- [navCtrl.navigationBar setTranslucent:YES];
103
- [navCtrl.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
104
- [navCtrl.navigationBar setShadowImage: [UIImage new]];
105
- [navCtrl.navigationBar setTintColor: [UIColor whiteColor]];
106
-
107
- self.presentedPresentationViewController = navCtrl;
108
-
109
- [Purchasely showController:navCtrl type: PLYUIControllerTypeProductPage];
110
+ if (ctrl != nil) {
111
+ UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl];
112
+ [navCtrl.navigationBar setTranslucent:YES];
113
+ [navCtrl.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
114
+ [navCtrl.navigationBar setShadowImage: [UIImage new]];
115
+ [navCtrl.navigationBar setTintColor: [UIColor whiteColor]];
116
+
117
+ self.presentedPresentationViewController = navCtrl;
118
+
119
+ if (isFullscreen) {
120
+ navCtrl.modalPresentationStyle = UIModalPresentationFullScreen;
121
+ }
122
+ [Purchasely showController:navCtrl type: PLYUIControllerTypeProductPage];
123
+ }
110
124
  }
111
125
 
112
126
  - (void)presentProductWithIdentifier:(CDVInvokedUrlCommand*)command {
113
127
  NSString *productVendorId = [command argumentAtIndex:0];
114
128
  NSString *presentationVendorId = [command argumentAtIndex:1];
115
-
116
- UIViewController *ctrl = [Purchasely productControllerFor:productVendorId with:presentationVendorId completion:^(enum PLYProductViewControllerResult result, PLYPlan * _Nullable plan) {
129
+ NSString *contentId = [command argumentAtIndex:2];
130
+ BOOL isFullscreen = [[command argumentAtIndex:3] boolValue];
131
+
132
+ UIViewController *ctrl = [Purchasely productControllerFor:productVendorId with:presentationVendorId contentId:contentId loaded:nil completion:^(enum PLYProductViewControllerResult result, PLYPlan * _Nullable plan) {
117
133
  NSDictionary *resultDict = [self resultDictionaryForPresentationController:result plan:plan];
118
134
  [self successFor:command resultDict:resultDict];
119
135
  }];
120
136
 
121
- UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl];
122
- [navCtrl.navigationBar setTranslucent:YES];
123
- [navCtrl.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
124
- [navCtrl.navigationBar setShadowImage: [UIImage new]];
125
- [navCtrl.navigationBar setTintColor: [UIColor whiteColor]];
126
-
127
- self.presentedPresentationViewController = navCtrl;
128
-
129
- [Purchasely showController:navCtrl type: PLYUIControllerTypeProductPage];
137
+ if (ctrl != nil) {
138
+ UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl];
139
+ [navCtrl.navigationBar setTranslucent:YES];
140
+ [navCtrl.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
141
+ [navCtrl.navigationBar setShadowImage: [UIImage new]];
142
+ [navCtrl.navigationBar setTintColor: [UIColor whiteColor]];
143
+
144
+ self.presentedPresentationViewController = navCtrl;
145
+
146
+ if (isFullscreen) {
147
+ navCtrl.modalPresentationStyle = UIModalPresentationFullScreen;
148
+ }
149
+ [Purchasely showController:navCtrl type: PLYUIControllerTypeProductPage];
150
+ }
130
151
  }
131
152
 
132
153
  - (void)presentSubscriptions:(CDVInvokedUrlCommand*)command {
@@ -163,6 +184,14 @@
163
184
  }];
164
185
  }
165
186
 
187
+ - (void)silentRestoreAllProducts:(CDVInvokedUrlCommand*)command {
188
+ [Purchasely silentRestoreAllProductsWithSuccess:^{
189
+ [self successFor:command];
190
+ } failure:^(NSError * _Nonnull error) {
191
+ [self failureFor:command resultString:error.localizedDescription];
192
+ }];
193
+ }
194
+
166
195
  - (void)purchasedSubscription:(CDVInvokedUrlCommand*)command {
167
196
  self.purchasedCommand = command;
168
197
  [[NSNotificationCenter defaultCenter] addObserver:self
@@ -249,44 +278,10 @@
249
278
  - (void)close:(CDVInvokedUrlCommand*)command {
250
279
  }
251
280
 
252
- - (void)setLoginTappedHandler:(CDVInvokedUrlCommand*)command {
253
- self.loginTappedCommand = command;
254
- [Purchasely setLoginTappedHandler:^(UIViewController * _Nonnull controller, void (^ _Nonnull closedHandler)(BOOL)) {
255
- self.loginClosedHandler = closedHandler;
256
-
257
- [self.presentedPresentationViewController dismissViewControllerAnimated:true completion:^{
258
- CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
259
- [result setKeepCallbackAsBool:YES];
260
- [self.commandDelegate sendPluginResult:result callbackId:self.loginTappedCommand.callbackId];
261
- }];
262
- }];
263
- }
264
-
265
- - (void)onUserLoggedIn:(CDVInvokedUrlCommand*)command {
266
- BOOL userDidLogin = [[command argumentAtIndex:0] boolValue];
267
-
268
- [Purchasely showController:self.presentedPresentationViewController type: PLYUIControllerTypeProductPage];
269
- self.loginClosedHandler(userDidLogin);
270
- }
271
-
272
- - (void)setConfirmPurchaseHandler:(CDVInvokedUrlCommand*)command {
273
- self.authorizePurchaseCommand = command;
274
- [Purchasely setConfirmPurchaseHandler:^(UIViewController * _Nonnull controller, void (^ _Nonnull authorizePurchaseHandler)(BOOL)) {
275
- self.authorizePurchaseHandler = authorizePurchaseHandler;
276
-
277
- [self.presentedPresentationViewController dismissViewControllerAnimated:true completion:^{
278
- CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
279
- [result setKeepCallbackAsBool:YES];
280
- [self.commandDelegate sendPluginResult:result callbackId:self.authorizePurchaseCommand.callbackId];
281
- }];
282
- }];
283
- }
284
-
285
- - (void)processToPayment:(CDVInvokedUrlCommand*)command {
286
- BOOL processToPayment = [[command argumentAtIndex:0] boolValue];
287
-
288
- [Purchasely showController:self.presentedPresentationViewController type: PLYUIControllerTypeProductPage];
289
- self.authorizePurchaseHandler(processToPayment);
281
+ - (void)setLanguage:(CDVInvokedUrlCommand*)command {
282
+ NSString *language = [command argumentAtIndex:0];
283
+ NSLocale *locale = [NSLocale localeWithLocaleIdentifier:language];
284
+ [Purchasely setLanguageFrom:locale];
290
285
  }
291
286
 
292
287
  // Helpers
@@ -315,6 +310,99 @@
315
310
  return productViewResult;
316
311
  }
317
312
 
313
+ - (NSDictionary<NSString *, NSObject *> *) resultDictionaryForActionInterceptor:(PLYPresentationAction) action
314
+ parameters: (PLYPresentationActionParameters * _Nullable) params
315
+ presentationInfos: (PLYPresentationInfo * _Nullable) infos {
316
+ NSMutableDictionary<NSString *, NSObject *> *actionInterceptorResult = [NSMutableDictionary new];
317
+
318
+ NSString* actionString;
319
+
320
+ switch (action) {
321
+ case PLYPresentationActionLogin:
322
+ actionString = @"login";
323
+ break;
324
+ case PLYPresentationActionPurchase:
325
+ actionString = @"purchase";
326
+ break;
327
+ case PLYPresentationActionClose:
328
+ actionString = @"close";
329
+ break;
330
+ case PLYPresentationActionRestore:
331
+ actionString = @"restore";
332
+ break;
333
+ case PLYPresentationActionNavigate:
334
+ actionString = @"navigate";
335
+ break;
336
+ case PLYPresentationActionPromoCode:
337
+ actionString = @"promo_code";
338
+ break;
339
+ case PLYPresentationActionOpenPresentation:
340
+ actionString = @"open_presentation";
341
+ break;
342
+ }
343
+
344
+ [actionInterceptorResult setObject:actionString forKey:@"action"];
345
+
346
+ if (infos != nil) {
347
+ NSMutableDictionary<NSString *, NSObject *> *infosResult = [NSMutableDictionary new];
348
+ if (infos.contentId != nil) {
349
+ [infosResult setObject:infos.contentId forKey:@"contentId"];
350
+ }
351
+ if (infos.presentationId != nil) {
352
+ [infosResult setObject:infos.presentationId forKey:@"presentationId"];
353
+ }
354
+ [actionInterceptorResult setObject:infosResult forKey:@"info"];
355
+ }
356
+ if (params != nil) {
357
+ NSMutableDictionary<NSString *, NSObject *> *paramsResult = [NSMutableDictionary new];
358
+ if (params.url != nil) {
359
+ [paramsResult setObject:params.url.absoluteString forKey:@"url"];
360
+ }
361
+ if (params.plan != nil) {
362
+ [paramsResult setObject:[params.plan asDictionary] forKey:@"plan"];
363
+ }
364
+ if (params.title != nil) {
365
+ [paramsResult setObject:params.title forKey:@"title"];
366
+ }
367
+ if (params.presentation != nil) {
368
+ [paramsResult setObject:params.presentation forKey:@"presentation"];
369
+ }
370
+ [actionInterceptorResult setObject:paramsResult forKey:@"parameters"];
371
+ }
372
+
373
+ return actionInterceptorResult;
374
+ }
375
+
376
+ - (void)setPaywallActionInterceptor:(CDVInvokedUrlCommand*)command {
377
+ self.paywallActionInterceptorCommand = command;
378
+ [Purchasely setPaywallActionsInterceptor:^(enum PLYPresentationAction action, PLYPresentationActionParameters * _Nullable parameters, PLYPresentationInfo * _Nullable infos, void (^ _Nonnull onProcessActionHandler)(BOOL)) {
379
+ self.onProcessActionHandler = onProcessActionHandler;
380
+ NSDictionary *resultDict = [self resultDictionaryForActionInterceptor:action parameters:parameters presentationInfos:infos];
381
+
382
+ CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:resultDict];
383
+ [pluginResult setKeepCallbackAsBool:YES];
384
+ [self.commandDelegate sendPluginResult:pluginResult callbackId:self.paywallActionInterceptorCommand.callbackId];
385
+
386
+ }];
387
+ }
388
+
389
+ - (void)onProcessAction:(CDVInvokedUrlCommand*)command {
390
+ BOOL processAction = [[command argumentAtIndex:0] boolValue];
391
+ if (self.onProcessActionHandler != nil) {
392
+ self.onProcessActionHandler(processAction);
393
+ }
394
+ }
395
+
396
+ - (void)closePaywall:(CDVInvokedUrlCommand*)command {
397
+ if (self.presentedPresentationViewController != nil) {
398
+ dispatch_async(dispatch_get_main_queue(), ^{
399
+ [self.presentedPresentationViewController dismissViewControllerAnimated:true completion:^{
400
+ self.presentedPresentationViewController = nil;
401
+ }];
402
+ });
403
+ }
404
+ }
405
+
318
406
  - (void)successFor:(CDVInvokedUrlCommand *)command {
319
407
  CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
320
408
  [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
@@ -25,6 +25,10 @@
25
25
  [dict setObject:self.name forKey:@"name"];
26
26
  }
27
27
 
28
+ if (self.appleProductId != nil) {
29
+ [dict setObject:self.appleProductId forKey:@"productId"];
30
+ }
31
+
28
32
  NSString *price = [self localizedFullPriceWithLanguage:nil];
29
33
  if (price != nil) {
30
34
  [dict setObject:price forKey:@"price"];
package/www/Purchasely.js CHANGED
@@ -2,8 +2,8 @@ var exec = require('cordova/exec');
2
2
 
3
3
  var defaultError = (e) => { console.log(e); }
4
4
 
5
- exports.startWithAPIKey = function (apiKey, stores, userId, logLevel, observerMode, success, error) {
6
- exec(success, error, 'Purchasely', 'startWithAPIKey', [apiKey, stores, userId, logLevel, observerMode]);
5
+ exports.startWithAPIKey = function (apiKey, stores, userId, logLevel, runningMode, success, error) {
6
+ exec(success, error, 'Purchasely', 'startWithAPIKey', [apiKey, stores, userId, logLevel, runningMode]);
7
7
  };
8
8
 
9
9
  exports.addEventsListener = function (success, error) {
@@ -46,28 +46,16 @@ exports.synchronize = function () {
46
46
  exec(() => {}, defaultError, 'Purchasely', 'synchronize', []);
47
47
  };
48
48
 
49
- exports.presentPresentationWithIdentifier = function (presentationId, contentId, success, error) {
50
- exec(success, error, 'Purchasely', 'presentPresentationWithIdentifier', [presentationId, contentId]);
49
+ exports.presentPresentationWithIdentifier = function (presentationId, contentId, isFullscreen, success, error) {
50
+ exec(success, error, 'Purchasely', 'presentPresentationWithIdentifier', [presentationId, contentId, isFullscreen]);
51
51
  };
52
52
 
53
- exports.presentPresentationWithIdentifier = function (presentationId, success, error) {
54
- exec(success, error, 'Purchasely', 'presentPresentationWithIdentifier', [presentationId, null]);
53
+ exports.presentProductWithIdentifier = function (productId, presentationId, contentId, isFullscreen, success, error) {
54
+ exec(success, error, 'Purchasely', 'presentProductWithIdentifier', [productId, presentationId, contentId, isFullscreen]);
55
55
  };
56
56
 
57
- exports.presentProductWithIdentifier = function (productId, presentationId, contentId, success, error) {
58
- exec(success, error, 'Purchasely', 'presentProductWithIdentifier', [productId, presentationId, contentId]);
59
- };
60
-
61
- exports.presentProductWithIdentifier = function (productId, presentationId, success, error) {
62
- exec(success, error, 'Purchasely', 'presentProductWithIdentifier', [productId, presentationId, null]);
63
- };
64
-
65
- exports.presentPlanWithIdentifier = function (planId, presentationId, contentId, success, error) {
66
- exec(success, error, 'Purchasely', 'presentPlanWithIdentifier', [planId, presentationId, contentId]);
67
- };
68
-
69
- exports.presentPlanWithIdentifier = function (planId, presentationId, success, error) {
70
- exec(success, error, 'Purchasely', 'presentPlanWithIdentifier', [planId, presentationId, null]);
57
+ exports.presentPlanWithIdentifier = function (planId, presentationId, contentId, isFullscreen, success, error) {
58
+ exec(success, error, 'Purchasely', 'presentPlanWithIdentifier', [planId, presentationId, contentId, isFullscreen]);
71
59
  };
72
60
 
73
61
  exports.presentSubscriptions = function () {
@@ -86,6 +74,10 @@ exports.restoreAllProducts = function (success, error) {
86
74
  exec(success, error, 'Purchasely', 'restoreAllProducts', []);
87
75
  };
88
76
 
77
+ exports.silentRestoreAllProducts = function (success, error) {
78
+ exec(success, error, 'Purchasely', 'silentRestoreAllProducts', []);
79
+ };
80
+
89
81
  exports.purchasedSubscription = function (success, error) {
90
82
  exec(success, error, 'Purchasely', 'purchasedSubscription', []);
91
83
  };
@@ -106,26 +98,26 @@ exports.productWithIdentifier = function (productId, success) {
106
98
  exec(success, defaultError, 'Purchasely', 'productWithIdentifier', [productId]);
107
99
  };
108
100
 
109
- exports.setLoginTappedHandler = function (success) {
110
- exec(success, defaultError, 'Purchasely', 'setLoginTappedHandler', []);
101
+ exports.setPaywallActionInterceptor = function (success) {
102
+ exec(success, defaultError, 'Purchasely', 'setPaywallActionInterceptor', []);
111
103
  };
112
104
 
113
- exports.onUserLoggedIn = function (userLoggedIn) {
114
- exec(() => {}, defaultError, 'Purchasely', 'onUserLoggedIn', [userLoggedIn]);
105
+ exports.onProcessAction = function (processAction) {
106
+ exec(() => {}, defaultError, 'Purchasely', 'onProcessAction', [processAction]);
115
107
  };
116
108
 
117
- exports.setConfirmPurchaseHandler = function (success) {
118
- exec(success, defaultError, 'Purchasely', 'setConfirmPurchaseHandler', []);
119
- };
120
-
121
- exports.processToPayment = function (processToPayment) {
122
- exec(() => {}, defaultError, 'Purchasely', 'processToPayment', [processToPayment]);
109
+ exports.closePaywall = function () {
110
+ exec(() => {}, defaultError, 'Purchasely', 'closePaywall', []);
123
111
  };
124
112
 
125
113
  exports.userSubscriptions = function (success, error) {
126
114
  exec(success, defaultError, 'Purchasely', 'userSubscriptions', []);
127
115
  };
128
116
 
117
+ exports.setLanguage = function (language) {
118
+ exec(() => {}, defaultError, 'Purchasely', 'setLanguage', [language]);
119
+ };
120
+
129
121
  exports.LogLevel = {
130
122
  DEBUG: 0,
131
123
  INFO: 1,
@@ -136,7 +128,8 @@ exports.LogLevel = {
136
128
  exports.Attribute = {
137
129
  AMPLITUDE_SESSION_ID: 0,
138
130
  FIREBASE_APP_INSTANCE_ID: 1,
139
- AIRSHIP_CHANNEL_ID: 2
131
+ AIRSHIP_CHANNEL_ID: 2,
132
+ BATCH_INSTALLATION_ID: 3
140
133
  }
141
134
 
142
135
  exports.PurchaseResult = {
@@ -160,3 +153,22 @@ exports.PlanType = {
160
153
  nonRenewingSubscription: 3,
161
154
  unknown: 4
162
155
  }
156
+
157
+
158
+ exports.RunningMode = {
159
+ transactionOnly: 0,
160
+ observer: 1,
161
+ paywallOnly: 2,
162
+ paywallObserver: 3,
163
+ full: 4
164
+ }
165
+
166
+ exports.PaywallAction = {
167
+ close: 'close',
168
+ login: 'login',
169
+ navigate: 'navigate',
170
+ purchase: 'purchase',
171
+ restore: 'restore',
172
+ open_presentation: 'open_presentation',
173
+ promo_code: 'promo_code',
174
+ }
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="RunConfigurationProducerService">
4
- <option name="ignoredProducers">
5
- <set>
6
- <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
7
- </set>
8
- </option>
9
- </component>
10
- </project>