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