diff --git a/android/src/main/java/com/reactnativekeyboardcontroller/KeyboardControllerViewManager.kt b/android/src/main/java/com/reactnativekeyboardcontroller/KeyboardControllerViewManager.kt index ac85b9815b..380ad5fe4b 100644 --- a/android/src/main/java/com/reactnativekeyboardcontroller/KeyboardControllerViewManager.kt +++ b/android/src/main/java/com/reactnativekeyboardcontroller/KeyboardControllerViewManager.kt @@ -1,5 +1,6 @@ package com.reactnativekeyboardcontroller +import android.util.Log import androidx.appcompat.widget.FitWindowsLinearLayout import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsAnimationCompat @@ -13,6 +14,7 @@ import com.facebook.react.views.view.ReactViewManager import com.reactnativekeyboardcontroller.events.KeyboardTransitionEvent class KeyboardControllerViewManager(reactContext: ReactApplicationContext) : ReactViewManager() { + private val TAG = KeyboardControllerViewManager::class.qualifiedName private var mReactContext = reactContext private var isStatusBarTranslucent = false @@ -20,7 +22,14 @@ class KeyboardControllerViewManager(reactContext: ReactApplicationContext) : Rea override fun createViewInstance(reactContext: ThemedReactContext): ReactViewGroup { val view = EdgeToEdgeReactViewGroup(reactContext) - val window = mReactContext.currentActivity!!.window + val activity = mReactContext.currentActivity + + if (activity == null) { + Log.w(TAG, "Can not setup keyboard animation listener, since `currentActivity` is null") + return view + } + + val window = activity.window val decorView = window.decorView ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> diff --git a/android/src/main/java/com/reactnativekeyboardcontroller/StatusBarManagerCompatModule.kt b/android/src/main/java/com/reactnativekeyboardcontroller/StatusBarManagerCompatModule.kt index 3ce86b94d5..b29dc2123a 100644 --- a/android/src/main/java/com/reactnativekeyboardcontroller/StatusBarManagerCompatModule.kt +++ b/android/src/main/java/com/reactnativekeyboardcontroller/StatusBarManagerCompatModule.kt @@ -3,6 +3,7 @@ package com.reactnativekeyboardcontroller import android.animation.ArgbEvaluator import android.animation.ValueAnimator import android.os.Build +import android.util.Log import androidx.annotation.RequiresApi import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat @@ -12,6 +13,7 @@ import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.UiThreadUtil class StatusBarManagerCompatModule(private val mReactContext: ReactApplicationContext) : ReactContextBaseJavaModule(mReactContext) { + private val TAG = StatusBarManagerCompatModule::class.qualifiedName private var controller: WindowInsetsControllerCompat? = null override fun getName(): String = "StatusBarManagerCompat" @@ -30,8 +32,14 @@ class StatusBarManagerCompatModule(private val mReactContext: ReactApplicationCo @RequiresApi(Build.VERSION_CODES.LOLLIPOP) @ReactMethod private fun setColor(color: Int, animated: Boolean) { + val activity = mReactContext.currentActivity + if (activity == null) { + Log.w(TAG, "StatusBarManagerCompatModule: Ignored status bar change, current activity is null.") + return + } + UiThreadUtil.runOnUiThread { - val window = mReactContext.currentActivity!!.window + val window = activity.window if (animated) { val curColor: Int = window.statusBarColor @@ -71,7 +79,13 @@ class StatusBarManagerCompatModule(private val mReactContext: ReactApplicationCo private fun getController(): WindowInsetsControllerCompat? { if (this.controller == null) { - val window = mReactContext.currentActivity!!.window + val activity = mReactContext.currentActivity + if (activity == null) { + Log.w(TAG, "StatusBarManagerCompatModule: can not get `WindowInsetsControllerCompat` because current activity is null.") + return this.controller + } + + val window = activity.window this.controller = WindowInsetsControllerCompat(window, window.decorView) } diff --git a/android/src/main/java/com/reactnativekeyboardcontroller/TranslateDeferringInsetsAnimationCallback.kt b/android/src/main/java/com/reactnativekeyboardcontroller/TranslateDeferringInsetsAnimationCallback.kt index bf799c8e5e..083cb19451 100644 --- a/android/src/main/java/com/reactnativekeyboardcontroller/TranslateDeferringInsetsAnimationCallback.kt +++ b/android/src/main/java/com/reactnativekeyboardcontroller/TranslateDeferringInsetsAnimationCallback.kt @@ -31,7 +31,13 @@ import com.facebook.react.views.view.ReactViewGroup import com.reactnativekeyboardcontroller.events.KeyboardTransitionEvent import java.util.* -fun toDp(px: Float, context: Context): Int = (px / context.resources.displayMetrics.density).toInt() +fun toDp(px: Float, context: Context?): Int { + if (context == null) { + return 0 + } + + return (px / context.resources.displayMetrics.density).toInt() +} /** * A [WindowInsetsAnimationCompat.Callback] which will translate/move the given view during any @@ -112,7 +118,7 @@ class TranslateDeferringInsetsAnimationCallback( val navigationBar = insets?.getInsets(WindowInsetsCompat.Type.navigationBars())?.bottom ?: 0 // on hide it will be negative value, so we are using max function - return Math.max(toDp((keyboardHeight - navigationBar).toFloat(), context!!), 0) + return Math.max(toDp((keyboardHeight - navigationBar).toFloat(), context), 0) } override fun onProgress( @@ -132,7 +138,7 @@ class TranslateDeferringInsetsAnimationCallback( Insets.max(it, Insets.NONE) } val diffY = (diff.top - diff.bottom).toFloat() - val height = toDp(diffY, context!!) + val height = toDp(diffY, context) var progress = 0.0 try { @@ -143,7 +149,7 @@ class TranslateDeferringInsetsAnimationCallback( Log.i(TAG, "DiffY: $diffY $height") context - .getNativeModule(UIManagerModule::class.java) + ?.getNativeModule(UIManagerModule::class.java) ?.eventDispatcher ?.dispatchEvent(KeyboardTransitionEvent(view.id, height, progress))