Skip to content

Commit

Permalink
//xplat/js/react-native-github/packages/react-native/ReactAndroid/src…
Browse files Browse the repository at this point in the history
…/main/java/com/facebook/react/modules/appearance:appearanceAndroid (#44006)

Summary:
Pull Request resolved: #44006

Changelog: [Internal]

Reviewed By: cortinico

Differential Revision: D55725334

fbshipit-source-id: 4d7ad2bb6395674d47fd5e3cd01a8515627f6cd4
  • Loading branch information
andrewdacenko authored and facebook-github-bot committed Apr 10, 2024
1 parent b9a2249 commit c8d5f0f
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 128 deletions.
12 changes: 9 additions & 3 deletions packages/react-native/ReactAndroid/api/ReactAndroid.api
Original file line number Diff line number Diff line change
Expand Up @@ -2965,17 +2965,23 @@ public class com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModul
public fun setAccessibilityFocus (D)V
}

public class com/facebook/react/modules/appearance/AppearanceModule : com/facebook/fbreact/specs/NativeAppearanceSpec {
public final class com/facebook/react/modules/appearance/AppearanceModule : com/facebook/fbreact/specs/NativeAppearanceSpec {
public static final field Companion Lcom/facebook/react/modules/appearance/AppearanceModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;Lcom/facebook/react/modules/appearance/AppearanceModule$OverrideColorScheme;)V
public synthetic fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;Lcom/facebook/react/modules/appearance/AppearanceModule$OverrideColorScheme;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun addListener (Ljava/lang/String;)V
public fun emitAppearanceChanged (Ljava/lang/String;)V
public final fun emitAppearanceChanged (Ljava/lang/String;)V
public fun getColorScheme ()Ljava/lang/String;
public fun onConfigurationChanged (Landroid/content/Context;)V
public final fun onConfigurationChanged (Landroid/content/Context;)V
public fun removeListeners (D)V
public fun setColorScheme (Ljava/lang/String;)V
}

public final class com/facebook/react/modules/appearance/AppearanceModule$Companion {
}

public abstract interface class com/facebook/react/modules/appearance/AppearanceModule$OverrideColorScheme {
public abstract fun getScheme ()Ljava/lang/String;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.modules.appearance

import android.content.Context
import android.content.res.Configuration
import androidx.appcompat.app.AppCompatDelegate
import com.facebook.fbreact.specs.NativeAppearanceSpec
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.module.annotations.ReactModule

/** Module that exposes the user's preferred color scheme. */
@ReactModule(name = NativeAppearanceSpec.NAME)
public class AppearanceModule
@JvmOverloads
constructor(
reactContext: ReactApplicationContext,
private val overrideColorScheme: OverrideColorScheme? = null
) : NativeAppearanceSpec(reactContext) {

private var colorScheme = colorSchemeForCurrentConfiguration(reactContext)

/** Optional override to the current color scheme */
public interface OverrideColorScheme {
/**
* Color scheme will use the return value instead of the current system configuration. Available
* scheme: {light, dark}
*/
public fun getScheme(): String
}

private fun colorSchemeForCurrentConfiguration(context: Context): String {
if (overrideColorScheme != null) {
return overrideColorScheme.getScheme()
}

val currentNightMode =
context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
Configuration.UI_MODE_NIGHT_NO -> return "light"
Configuration.UI_MODE_NIGHT_YES -> return "dark"
else -> return "light"
}
}

public override fun getColorScheme(): String {
// Attempt to use the Activity context first in order to get the most up to date
// scheme. This covers the scenario when AppCompatDelegate.setDefaultNightMode()
// is called directly (which can occur in Brownfield apps for example).
val activity = getCurrentActivity()
colorScheme = colorSchemeForCurrentConfiguration(activity ?: getReactApplicationContext())
return colorScheme
}

public override fun setColorScheme(style: String) {
when {
style == "dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
style == "light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
style == "unspecified" ->
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
}

/** Stub */
public override fun addListener(eventName: String): Unit = Unit

/** Stub */
public override fun removeListeners(count: Double): Unit = Unit

/*
* Call this from your root activity whenever configuration changes. If the
* color scheme has changed, an event will emitted.
*/
public fun onConfigurationChanged(currentContext: Context) {
val newColorScheme = colorSchemeForCurrentConfiguration(currentContext)
if (colorScheme != newColorScheme) {
colorScheme = newColorScheme
emitAppearanceChanged(colorScheme)
}
}

/** Sends an event to the JS instance that the preferred color scheme has changed. */
public fun emitAppearanceChanged(colorScheme: String) {
val appearancePreferences = Arguments.createMap()
appearancePreferences.putString("colorScheme", colorScheme)
val reactApplicationContext = getReactApplicationContextIfActiveOrWarn()
reactApplicationContext?.emitDeviceEvent(APPEARANCE_CHANGED_EVENT_NAME, appearancePreferences)
}

public companion object {
public const val NAME: String = NativeAppearanceSpec.NAME
private const val APPEARANCE_CHANGED_EVENT_NAME = "appearanceChanged"
}
}

0 comments on commit c8d5f0f

Please sign in to comment.