1 package expo.modules.devlauncher.modules 2 3 import android.content.Context 4 import android.content.Intent 5 import android.net.Uri 6 import androidx.browser.customtabs.CustomTabsIntent 7 import com.facebook.react.bridge.* 8 import expo.modules.devlauncher.koin.DevLauncherKoinComponent 9 10 private const val SessionKey = "expo-dev-menu.session" 11 private const val SessionStore = "expo.modules.devmenu.sessionstore" 12 13 class DevLauncherAuth(reactContext: ReactApplicationContext?) : 14 ReactContextBaseJavaModule(reactContext), DevLauncherKoinComponent { 15 16 private val localStore = reactApplicationContext.getSharedPreferences(SessionStore, Context.MODE_PRIVATE) 17 getNamenull18 override fun getName(): String { 19 return "EXDevLauncherAuth" 20 } 21 22 @ReactMethod setSessionAsyncnull23 fun setSessionAsync(session: String?, promise: Promise) { 24 saveSessionToLocalStorage(session) 25 promise.resolve(null) 26 } 27 saveSessionToLocalStoragenull28 private fun saveSessionToLocalStorage(data: String?) { 29 localStore 30 .edit() 31 .putString(SessionKey, data) 32 .apply() 33 } 34 35 @ReactMethod restoreSessionAsyncnull36 fun restoreSessionAsync(promise: Promise) { 37 if (localStore.contains(SessionKey)) { 38 val session = localStore.getString(SessionKey, null) 39 return promise.resolve(session) 40 } 41 42 return promise.resolve("") 43 } 44 45 @ReactMethod openWebBrowserAsyncnull46 fun openWebBrowserAsync(startUrl: String?, promise: Promise) { 47 requireNotNull(startUrl) 48 49 val intent = createCustomTabsIntent() 50 intent.data = Uri.parse(startUrl) 51 52 reactApplicationContext.currentActivity?.let { 53 it.startActivity(intent) 54 promise.resolve(null) 55 return 56 } 57 58 promise.reject("ERR_DEVMENU_CANNOT_OPEN_BROWSER", "Current activity is null.") 59 } 60 createCustomTabsIntentnull61 private fun createCustomTabsIntent(): Intent { 62 val builder = CustomTabsIntent.Builder() 63 builder.setShowTitle(false) 64 65 val intent = builder.build().intent 66 67 // We cannot use builder's method enableUrlBarHiding, because there is no corresponding disable method and some browsers enables it by default. 68 intent.putExtra(CustomTabsIntent.EXTRA_ENABLE_URLBAR_HIDING, false) 69 70 return intent 71 } 72 } 73