diff --git a/android/react_viro/react_viro-release.aar b/android/react_viro/react_viro-release.aar index bc825b43..5a5d87f9 100644 Binary files a/android/react_viro/react_viro-release.aar and b/android/react_viro/react_viro-release.aar differ diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/ReactViroPackage.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/ReactViroPackage.java index d8aa280a..86a63ba8 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/ReactViroPackage.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/ReactViroPackage.java @@ -21,9 +21,11 @@ package com.viromedia.bridge; -import android.util.Log; +import android.app.Activity; +import android.content.res.TypedArray; import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; @@ -126,7 +128,7 @@ public ReactViroPackage(ViroPlatform platform) { @Override public List createNativeModules(ReactApplicationContext reactContext) { - Log.e("Manish", "createNativeModules"); + installMaterial3AlertTheme(reactContext); List modules = new java.util.ArrayList<>(Arrays.asList( new MaterialManager(reactContext), new AnimationManager(reactContext), @@ -153,6 +155,46 @@ public List createNativeModules(ReactApplicationContext reactConte return modules; } + // RN's Alert builds an AppCompat dialog styled by the host activity theme, + // where the RN/Expo template parent (Theme.AppCompat) means Material 2. Overlay + // just alertDialogTheme with viro's Material 3-styled dialog theme. Runs on + // every host resume: addLifecycleEventListener dispatches immediately when the + // host is already resumed, and re-applying covers activity recreation. + private void installMaterial3AlertTheme(final ReactApplicationContext reactContext) { + reactContext.addLifecycleEventListener(new LifecycleEventListener() { + @Override + public void onHostResume() { + Activity activity = reactContext.getCurrentActivity(); + if (activity != null && isAppCompatTheme(activity)) { + activity.getTheme().applyStyle(R.style.ViroAlertDialogThemeOverride, true); + } + } + + @Override + public void onHostPause() { + } + + @Override + public void onHostDestroy() { + } + }); + } + + // The probe RN's AlertFragment uses to pick the AppCompat dialog path. In a + // brownfield host whose activity theme is not AppCompat-derived, RN shows a + // framework dialog instead, and the override must not reach it: the dialog + // background resolves ?attr/colorBackgroundFloating, which only AppCompat + // themes define — inflating it there crashes at alert-show time. + private static boolean isAppCompatTheme(Activity activity) { + TypedArray attributes = + activity.obtainStyledAttributes(androidx.appcompat.R.styleable.AppCompatTheme); + try { + return attributes.hasValue(androidx.appcompat.R.styleable.AppCompatTheme_windowActionBar); + } finally { + attributes.recycle(); + } + } + @Override public List createViewManagers(ReactApplicationContext reactContext) { return Arrays.asList( diff --git a/android/viro_bridge/src/main/res/drawable/viro_alert_dialog_background.xml b/android/viro_bridge/src/main/res/drawable/viro_alert_dialog_background.xml new file mode 100644 index 00000000..f57554c8 --- /dev/null +++ b/android/viro_bridge/src/main/res/drawable/viro_alert_dialog_background.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/android/viro_bridge/src/main/res/values-night/viro_alert_dialog.xml b/android/viro_bridge/src/main/res/values-night/viro_alert_dialog.xml new file mode 100644 index 00000000..a5350c80 --- /dev/null +++ b/android/viro_bridge/src/main/res/values-night/viro_alert_dialog.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/android/viro_bridge/src/main/res/values/viro_alert_dialog.xml b/android/viro_bridge/src/main/res/values/viro_alert_dialog.xml new file mode 100644 index 00000000..da667898 --- /dev/null +++ b/android/viro_bridge/src/main/res/values/viro_alert_dialog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + +