@@ -6,6 +6,7 @@ module Language.Javascript.JSaddle.WKWebView
6 , runWithAppConfig
6 , runWithAppConfig
8 , mainBundleResourcePath
8 , mainBundleResourcePath
9+ , ApplicationState (..)
9 , AppDelegateConfig (..)
10 , AppDelegateConfig (..)
10 , AppDelegateNotificationConfig (..)
11 , AppDelegateNotificationConfig (..)
11 , AuthorizationOption (..)
12 , AuthorizationOption (..)
@@ -20,6 +21,7 @@ import Foreign.Marshal.Utils (fromBool)
20import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
21import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
21import System.Environment (getProgName)
22import System.Environment (getProgName)
22import Foreign.C.String (CString, withCString)
23import Foreign.C.String (CString, withCString)
24+import Foreign.C.Types (CInt)
23import Foreign.StablePtr (StablePtr, newStablePtr)
25import Foreign.StablePtr (StablePtr, newStablePtr)
24import Language.Javascript.JSaddle (JSM)
26import Language.Javascript.JSaddle (JSM)
@@ -35,6 +37,7 @@ foreign import ccall runInWKWebView
35 -> StablePtr (IO ()) -- applicationWillTerminate
37 -> StablePtr (IO ()) -- applicationWillTerminate
36 -> StablePtr (IO ()) -- applicationSignificantTimeChange
38 -> StablePtr (IO ()) -- applicationSignificantTimeChange
37 -> StablePtr (CString -> IO ()) -- applicationUniversalLink
39 -> StablePtr (CString -> IO ()) -- applicationUniversalLink
40+ -> StablePtr (CInt -> CString -> IO ()) -- applicationDidReceiveRemoteNotification
38 -> Word64 -- whether to run requestAuthorizationWithOptions
41 -> Word64 -- whether to run requestAuthorizationWithOptions
39 -> Word64 -- Ask for Badge authorization
42 -> Word64 -- Ask for Badge authorization
40 -> Word64 -- Ask for Sound authorization
43 -> Word64 -- Ask for Sound authorization
@@ -55,6 +58,7 @@ data AppDelegateConfig = AppDelegateConfig
55 , _appDelegateConfig_applicationWillTerminate :: IO ()
58 , _appDelegateConfig_applicationWillTerminate :: IO ()
56 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
59 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
57 , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
60 , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
61+ , _appDelegateConfig_applicationDidReceiveRemoteNotification :: ApplicationState -> CString -> IO ()
58 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
62 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
@@ -69,6 +73,7 @@ instance Default AppDelegateConfig where
69 , _appDelegateConfig_applicationWillTerminate = return ()
73 , _appDelegateConfig_applicationWillTerminate = return ()
70 , _appDelegateConfig_applicationSignificantTimeChange = return ()
74 , _appDelegateConfig_applicationSignificantTimeChange = return ()
71 , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
75 , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
76+ , _appDelegateConfig_applicationDidReceiveRemoteNotification = \_ _ -> return ()
72 , _appDelegateConfig_appDelegateNotificationConfig = def
77 , _appDelegateConfig_appDelegateNotificationConfig = def
@@ -78,6 +83,12 @@ data AuthorizationOption = AuthorizationOption_Badge
78 | AuthorizationOption_CarPlay
83 | AuthorizationOption_CarPlay
79 deriving (Show, Read, Eq, Ord)
84 deriving (Show, Read, Eq, Ord)
86+data ApplicationState = ApplicationState_Active
87+ | ApplicationState_Inactive
88+ | ApplicationState_Background
89+ | ApplicationState_Unknown CInt
90+ deriving (Show, Read, Eq, Ord)
81data AppDelegateNotificationConfig = AppDelegateNotificationConfig
92data AppDelegateNotificationConfig = AppDelegateNotificationConfig
82 { _appDelegateNotificationConfig_requestAuthorizationWithOptions :: Maybe (Set AuthorizationOption)
93 { _appDelegateNotificationConfig_requestAuthorizationWithOptions :: Maybe (Set AuthorizationOption)
83 , _appDelegateNotificationConfig_registerForRemoteNotifications :: Bool
94 , _appDelegateNotificationConfig_registerForRemoteNotifications :: Bool
@@ -131,6 +142,13 @@ run' mUrl cfg f = do
131 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
142 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
132 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
143 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
133 applicationUniversalLink <- newStablePtr $ _appDelegateConfig_applicationUniversalLink cfg
144 applicationUniversalLink <- newStablePtr $ _appDelegateConfig_applicationUniversalLink cfg
145+ applicationDidReceiveRemoteNotification <- newStablePtr $ \n s -> do
146+ let appState = case n of
147+ 0 -> ApplicationState_Active
148+ 1 -> ApplicationState_Inactive
149+ 2 -> ApplicationState_Background
150+ _ -> ApplicationState_Unknown n
151+ _appDelegateConfig_applicationDidReceiveRemoteNotification cfg appState s
135 -- AppDelegate notification configuration
153 -- AppDelegate notification configuration
136 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
154 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
@@ -153,6 +171,7 @@ run' mUrl cfg f = do
153 applicationWillTerminate
171 applicationWillTerminate
154 applicationSignificantTimeChange
172 applicationSignificantTimeChange
155 applicationUniversalLink
173 applicationUniversalLink
174+ applicationDidReceiveRemoteNotification
156 (fromBool requestAuthorizationWithOptions)
175 (fromBool requestAuthorizationWithOptions)
157 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
176 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
158 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)
177 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)