on master help sign in
Merge aa-clib-appcallbacks
commit9d6f3839ff80f708208d86d0454db03154e259e4 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateWed 31 May 2017, 13:40 (9 years ago) parentdd32c663642fd7
5 files changed+38−3
jsaddle-clib/cbits/include/jsaddle.h+1 jsaddle-clib/src-ghc/Language/Javascript/JSaddle/CLib.hs+16−3 jsaddle-clib/src/Language/Javascript/JSaddle/CLib/Internal.hsc+3 jsaddle-wkwebview/cbits-uikit/AppDelegate.m+13 jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+5
jsaddle-clib/cbits/include/jsaddle.h+1
@@ -17,6 +17,7 @@ typedef struct app_callbacks {
1717 void (* mainActivity_onStop) ();
1818 void (* mainActivity_onDestroy) ();
1919 void (* mainActivity_onRestart) ();
20+ void (* mainActivity_onNewIntent) (char *, char *);
2021 void (* firebaseInstanceIdService_sendRegistrationToServer) (char *);
2122} app_callbacks;
2223
jsaddle-clib/src-ghc/Language/Javascript/JSaddle/CLib.hs+16−3
@@ -18,9 +18,9 @@ import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
1818import Data.Default (def, Default)
1919import Data.Monoid ((<>))
2020import Data.Text (Text)
21−import qualified Data.Text as T
21+import qualified Data.Text.Encoding as T
2222
23−import Foreign.C.String (CString, newCString, peekCString)
23+import Foreign.C.String (CString, newCString)
2424import Foreign.Ptr (FunPtr, Ptr)
2525import Foreign.Storable (poke)
2626import Foreign.Marshal.Utils (new)
@@ -40,6 +40,9 @@ foreign import ccall safe "wrapper"
4040foreign import ccall safe "wrapper"
4141 wrapMessageCallback :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
4242
43+foreign import ccall safe "wrapper"
44+ wrapMessageCallback2 :: (CString -> CString -> IO ()) -> IO (FunPtr (CString -> CString -> IO ()))
45+
4346foreign import ccall safe "wrapper"
4447 wrapSyncCallback :: (CString -> IO CString) -> IO (FunPtr (CString -> IO CString))
4548
@@ -78,6 +81,7 @@ data AppConfig = AppConfig
7881 , _appConfig_mainActivityOnStop :: IO ()
7982 , _appConfig_mainActivityOnDestroy :: IO ()
8083 , _appConfig_mainActivityOnRestart :: IO ()
84+ , _appConfig_mainActivityOnNewIntent :: (Text -> Text -> IO ())
8185 , _appConfig_firebaseInstanceIdServiceSendRegistrationToServer :: Text -> IO ()
8286 }
8387
@@ -90,6 +94,7 @@ instance Default AppConfig where
9094 , _appConfig_mainActivityOnStop = return ()
9195 , _appConfig_mainActivityOnDestroy = return ()
9296 , _appConfig_mainActivityOnRestart = return ()
97+ , _appConfig_mainActivityOnNewIntent = \_ _ -> return ()
9398 , _appConfig_firebaseInstanceIdServiceSendRegistrationToServer = \_ -> return ()
9499 }
95100
@@ -102,8 +107,12 @@ appConfigToAppCallbacks c = do
102107 stop <- wrapStartCallback $ _appConfig_mainActivityOnStop c
103108 destroy <- wrapStartCallback $ _appConfig_mainActivityOnDestroy c
104109 restart <- wrapStartCallback $ _appConfig_mainActivityOnRestart c
110+ newIntent <- wrapMessageCallback2 $ \intentAction intentData -> do
111+ intentAction' <- fromUtf8CString intentAction
112+ intentData' <- fromUtf8CString intentData
113+ _appConfig_mainActivityOnNewIntent c intentAction' intentData'
105114 firebaseRegPtr <- wrapMessageCallback $ \token -> do
106− token' <- T.pack <$> peekCString token
115+ token' <- fromUtf8CString token
107116 _appConfig_firebaseInstanceIdServiceSendRegistrationToServer c token'
108117 return $ AppCallbacks
109118 { _appCallbacks_mainActivity_onCreate = create
@@ -113,9 +122,13 @@ appConfigToAppCallbacks c = do
113122 , _appCallbacks_mainActivity_onStop = stop
114123 , _appCallbacks_mainActivity_onDestroy = destroy
115124 , _appCallbacks_mainActivity_onRestart = restart
125+ , _appCallbacks_mainActivity_onNewIntent = newIntent
116126 , _appCallbacks_firebaseInstanceIdService_sendRegistrationToServer = firebaseRegPtr
117127 }
118128
129+fromUtf8CString :: CString -> IO Text
130+fromUtf8CString = fmap T.decodeUtf8 . packCString
131+
119132pokeAppConfig :: Ptr AppCallbacks -> AppConfig -> IO ()
120133pokeAppConfig ptr cfg = poke ptr =<< appConfigToAppCallbacks cfg
121134
jsaddle-clib/src/Language/Javascript/JSaddle/CLib/Internal.hsc+3
@@ -38,6 +38,7 @@ data AppCallbacks = AppCallbacks
3838 , _appCallbacks_mainActivity_onStop :: !(FunPtr (IO ()))
3939 , _appCallbacks_mainActivity_onDestroy :: !(FunPtr (IO ()))
4040 , _appCallbacks_mainActivity_onRestart :: !(FunPtr (IO ()))
41+ , _appCallbacks_mainActivity_onNewIntent :: !(FunPtr (CString -> CString -> IO ()))
4142 , _appCallbacks_firebaseInstanceIdService_sendRegistrationToServer :: !(FunPtr (CString -> IO ()))
4243 }
4344
@@ -52,6 +53,7 @@ instance Storable AppCallbacks where
5253 #{poke app_callbacks, mainActivity_onStop} p $ _appCallbacks_mainActivity_onStop nc
5354 #{poke app_callbacks, mainActivity_onDestroy} p $ _appCallbacks_mainActivity_onDestroy nc
5455 #{poke app_callbacks, mainActivity_onRestart} p $ _appCallbacks_mainActivity_onRestart nc
56+ #{poke app_callbacks, mainActivity_onNewIntent} p $ _appCallbacks_mainActivity_onNewIntent nc
5557 #{poke app_callbacks, firebaseInstanceIdService_sendRegistrationToServer} p $ _appCallbacks_firebaseInstanceIdService_sendRegistrationToServer nc
5658 peek p = AppCallbacks
5759 <$> #{peek app_callbacks, mainActivity_onCreate} p
@@ -61,4 +63,5 @@ instance Storable AppCallbacks where
6163 <*> #{peek app_callbacks, mainActivity_onStop} p
6264 <*> #{peek app_callbacks, mainActivity_onDestroy} p
6365 <*> #{peek app_callbacks, mainActivity_onRestart} p
66+ <*> #{peek app_callbacks, mainActivity_onNewIntent} p
6467 <*> #{peek app_callbacks, firebaseInstanceIdService_sendRegistrationToServer} p
jsaddle-wkwebview/cbits-uikit/AppDelegate.m+13
@@ -19,6 +19,7 @@ HsStablePtr global_applicationDidEnterBackground = 0;
1919HsStablePtr global_applicationWillEnterForeground = 0;
2020HsStablePtr global_applicationWillTerminate = 0;
2121HsStablePtr global_applicationSignificantTimeChange = 0;
22+HsStablePtr global_applicationUniversalLink = 0;
2223uint64_t global_requestAuthorizationWithOptions = 0;
2324uint64_t global_requestAuthorizationOptionBadge = 0;
2425uint64_t global_requestAuthorizationOptionSound = 0;
@@ -119,6 +120,16 @@ HsStablePtr global_didFailToRegisterForRemoteNotificationsWithError = 0;
119120 callIO(global_applicationSignificantTimeChange);
120121}
121122
123+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
124+ // TODO: Reroute universal links when they're clicked in-app.
125+ // https://developer.apple.com/reference/webkit/wknavigationdelegate/1455643-webview?language=objc
126+ if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb] && userActivity.webpageURL) {
127+ callWithCString([userActivity.webpageURL.absoluteString UTF8String], global_applicationUniversalLink);
128+ return YES;
129+ }
130+ return NO;
131+}
132+
122133@end
123134
124135void runInWKWebView(HsStablePtr handler,
@@ -131,6 +142,7 @@ void runInWKWebView(HsStablePtr handler,
131142 HsStablePtr hs_applicationWillEnterForeground,
132143 HsStablePtr hs_applicationWillTerminate,
133144 HsStablePtr hs_applicationSignificantTimeChange,
145+ HsStablePtr hs_applicationUniversalLink,
134146 const uint64_t hs_requestAuthorizationWithOptions,
135147 const uint64_t hs_requestAuthorizationOptionBadge,
136148 const uint64_t hs_requestAuthorizationOptionSound,
@@ -149,6 +161,7 @@ void runInWKWebView(HsStablePtr handler,
149161 global_applicationWillEnterForeground = hs_applicationWillEnterForeground;
150162 global_applicationWillTerminate = hs_applicationWillTerminate;
151163 global_applicationSignificantTimeChange = hs_applicationSignificantTimeChange;
164+ global_applicationUniversalLink = hs_applicationUniversalLink;
152165 global_requestAuthorizationWithOptions = hs_requestAuthorizationWithOptions;
153166 global_requestAuthorizationOptionBadge = hs_requestAuthorizationOptionBadge;
154167 global_requestAuthorizationOptionSound = hs_requestAuthorizationOptionSound;
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+5
@@ -34,6 +34,7 @@ foreign import ccall runInWKWebView
3434 -> StablePtr (IO ()) -- applicationWillEnterForeground
3535 -> StablePtr (IO ()) -- applicationWillTerminate
3636 -> StablePtr (IO ()) -- applicationSignificantTimeChange
37+ -> StablePtr (CString -> IO ()) -- applicationUniversalLink
3738 -> Word64 -- whether to run requestAuthorizationWithOptions
3839 -> Word64 -- Ask for Badge authorization
3940 -> Word64 -- Ask for Sound authorization
@@ -53,6 +54,7 @@ data AppDelegateConfig = AppDelegateConfig
5354 , _appDelegateConfig_applicationWillEnterForeground :: IO ()
5455 , _appDelegateConfig_applicationWillTerminate :: IO ()
5556 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
57+ , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
5658 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
5759 }
5860
@@ -66,6 +68,7 @@ instance Default AppDelegateConfig where
6668 , _appDelegateConfig_applicationWillEnterForeground = return ()
6769 , _appDelegateConfig_applicationWillTerminate = return ()
6870 , _appDelegateConfig_applicationSignificantTimeChange = return ()
71+ , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
6972 , _appDelegateConfig_appDelegateNotificationConfig = def
7073 }
7174
@@ -127,6 +130,7 @@ run' mUrl cfg f = do
127130 applicationWillEnterForeground <- newStablePtr $ _appDelegateConfig_applicationWillEnterForeground cfg
128131 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
129132 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
133+ applicationUniversalLink <- newStablePtr $ _appDelegateConfig_applicationUniversalLink cfg
130134
131135 -- AppDelegate notification configuration
132136 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
@@ -148,6 +152,7 @@ run' mUrl cfg f = do
148152 applicationWillEnterForeground
149153 applicationWillTerminate
150154 applicationSignificantTimeChange
155+ applicationUniversalLink
151156 (fromBool requestAuthorizationWithOptions)
152157 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
153158 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)