1// Copyright 2018-present 650 Industries. All rights reserved.
2
3#import <ABI47_0_0ExpoModulesCore/ABI47_0_0EXDefines.h>
4#import <ABI47_0_0ExpoModulesCore/ABI47_0_0EXTaskManagerInterface.h>
5
6#import <ABI47_0_0EXBackgroundFetch/ABI47_0_0EXBackgroundFetch.h>
7#import <ABI47_0_0EXBackgroundFetch/ABI47_0_0EXBackgroundFetchTaskConsumer.h>
8
9@interface ABI47_0_0EXBackgroundFetch ()
10
11@property (nonatomic, weak) id<ABI47_0_0EXTaskManagerInterface> taskManager;
12
13@end
14
15@implementation ABI47_0_0EXBackgroundFetch
16
17ABI47_0_0EX_EXPORT_MODULE(ExpoBackgroundFetch);
18
19- (void)setModuleRegistry:(ABI47_0_0EXModuleRegistry *)moduleRegistry
20{
21  _taskManager = [moduleRegistry getModuleImplementingProtocol:@protocol(ABI47_0_0EXTaskManagerInterface)];
22}
23
24ABI47_0_0EX_EXPORT_METHOD_AS(getStatusAsync,
25                    getStatus:(ABI47_0_0EXPromiseResolveBlock)resolve
26                    reject:(ABI47_0_0EXPromiseRejectBlock)reject)
27{
28  dispatch_async(dispatch_get_main_queue(), ^{
29    resolve(@([self _getStatus]));
30  });
31}
32
33ABI47_0_0EX_EXPORT_METHOD_AS(setMinimumIntervalAsync,
34                    setMinimumInterval:(nonnull NSNumber *)minimumInterval
35                    resolve:(ABI47_0_0EXPromiseResolveBlock)resolve
36                    reject:(ABI47_0_0EXPromiseRejectBlock)reject)
37{
38  dispatch_async(dispatch_get_main_queue(), ^{
39    NSTimeInterval timeInterval = [minimumInterval doubleValue];
40    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:timeInterval];
41    resolve(nil);
42  });
43}
44
45ABI47_0_0EX_EXPORT_METHOD_AS(registerTaskAsync,
46                    registerTaskWithName:(nonnull NSString *)taskName
47                    options:(nullable NSDictionary *)options
48                    resolve:(ABI47_0_0EXPromiseResolveBlock)resolve
49                    reject:(ABI47_0_0EXPromiseRejectBlock)reject)
50{
51  if (![_taskManager hasBackgroundModeEnabled:@"fetch"]) {
52    return reject(
53                  @"E_BACKGROUND_FETCH_DISABLED",
54                  @"Background Fetch has not been configured. To enable it, add `fetch` to `UIBackgroundModes` in the application's Info.plist file.",
55                  nil
56                  );
57  }
58
59  @try {
60    [_taskManager registerTaskWithName:taskName
61                              consumer:ABI47_0_0EXBackgroundFetchTaskConsumer.class
62                               options:options];
63  }
64  @catch (NSException *e) {
65    return reject(e.name, e.reason, nil);
66  }
67  resolve(nil);
68}
69
70ABI47_0_0EX_EXPORT_METHOD_AS(unregisterTaskAsync,
71                    unregisterTaskWithName:(nonnull NSString *)taskName
72                    resolve:(ABI47_0_0EXPromiseResolveBlock)resolve
73                    reject:(ABI47_0_0EXPromiseRejectBlock)reject)
74{
75  @try {
76    [_taskManager unregisterTaskWithName:taskName consumerClass:[ABI47_0_0EXBackgroundFetchTaskConsumer class]];
77  } @catch (NSException *e) {
78    return reject(e.name, e.reason, nil);
79  }
80  resolve(nil);
81}
82
83# pragma mark - helpers
84
85- (ABI47_0_0EXBackgroundFetchStatus)_getStatus
86{
87  UIBackgroundRefreshStatus refreshStatus = [[UIApplication sharedApplication] backgroundRefreshStatus];
88
89  switch (refreshStatus) {
90    case UIBackgroundRefreshStatusRestricted:
91      return ABI47_0_0EXBackgroundFetchStatusRestricted;
92    case UIBackgroundRefreshStatusDenied:
93      return ABI47_0_0EXBackgroundFetchStatusDenied;
94    case UIBackgroundRefreshStatusAvailable:
95      return ABI47_0_0EXBackgroundFetchStatusAvailable;
96  }
97}
98
99@end
100