mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
fix: edge handling
This commit is contained in:
@@ -176,56 +176,83 @@ export function isRealDevice(): boolean {
|
||||
|
||||
const DefaultLightScrim = new Color(0xe6, 0xff, 0xff, 0xff);
|
||||
const DefaultDarkScrim = new Color(0x80, 0x1b, 0x1b, 0x1b);
|
||||
const DefaultStatusBarLight = new Color(0);
|
||||
const DefaultStatusBarDark = new Color(0);
|
||||
|
||||
let statusBarDarkColor: Color | null = null;
|
||||
let statusBarLightColor: Color | null = null;
|
||||
interface ISystemColor {
|
||||
navigationBarLight: Color;
|
||||
navigationBarDark: Color;
|
||||
statusBarLight: Color;
|
||||
statusBarDark: Color;
|
||||
handler?: (bar: 'status' | 'navigation', resources: android.content.res.Resources) => boolean;
|
||||
}
|
||||
const systemColors = new WeakMap<androidx.appcompat.app.AppCompatActivity, ISystemColor>();
|
||||
|
||||
function setEnableEdgeToEdge(activity: androidx.appcompat.app.AppCompatActivity, existingColors: ISystemColor) {
|
||||
enableEdgeToEdge(activity, {
|
||||
statusBarLightColor: existingColors.statusBarLight,
|
||||
statusBarDarkColor: existingColors.statusBarDark,
|
||||
navigationBarLightColor: existingColors.navigationBarLight,
|
||||
navigationBarDarkColor: existingColors.navigationBarDark,
|
||||
handleDarkMode: existingColors?.handler ?? null,
|
||||
});
|
||||
}
|
||||
|
||||
export function setStatusBarColor(options?: { activity?: androidx.appcompat.app.AppCompatActivity; lightColor?: Color; darkColor?: Color }): void {
|
||||
const statusBarLightColor = options?.lightColor ?? null;
|
||||
const statusBarDarkColor = options?.darkColor ?? null;
|
||||
const activity = options?.activity ?? getCurrentActivity();
|
||||
|
||||
export function setStatusBarColor(lightColor: Color | null = null, darkColor: Color | null = null): void {
|
||||
statusBarLightColor = lightColor;
|
||||
statusBarDarkColor = darkColor;
|
||||
const activity = getCurrentActivity();
|
||||
if (activity) {
|
||||
enableEdgeToEdge(activity, {
|
||||
statusBarLightColor: lightColor,
|
||||
statusBarDarkColor: darkColor,
|
||||
navigationBarLightColor,
|
||||
navigationBarDarkColor,
|
||||
handleDarkMode: darkModeHandler,
|
||||
});
|
||||
const existingColors = systemColors.get(activity) ?? {
|
||||
navigationBarLight: DefaultLightScrim,
|
||||
navigationBarDark: DefaultDarkScrim,
|
||||
statusBarLight: DefaultStatusBarLight,
|
||||
statusBarDark: DefaultStatusBarDark,
|
||||
};
|
||||
existingColors.statusBarLight ??= statusBarLightColor;
|
||||
existingColors.statusBarDark ??= statusBarDarkColor;
|
||||
systemColors.set(getCurrentActivity(), existingColors);
|
||||
|
||||
setEnableEdgeToEdge(activity, existingColors);
|
||||
}
|
||||
}
|
||||
|
||||
let navigationBarDarkColor: Color | null = null;
|
||||
let navigationBarLightColor: Color | null = null;
|
||||
|
||||
export function setNavigationBarColor(lightColor: Color | null = null, darkColor: Color | null = null): void {
|
||||
navigationBarLightColor = lightColor;
|
||||
navigationBarDarkColor = darkColor;
|
||||
const activity = getCurrentActivity();
|
||||
export function setNavigationBarColor(options?: { activity?: androidx.appcompat.app.AppCompatActivity; lightColor?: Color; darkColor?: Color }): void {
|
||||
const navigationBarLightColor = options?.lightColor ?? null;
|
||||
const navigationBarDarkColor = options?.darkColor ?? null;
|
||||
const activity = options?.activity ?? getCurrentActivity();
|
||||
if (activity) {
|
||||
enableEdgeToEdge(activity, {
|
||||
statusBarLightColor,
|
||||
statusBarDarkColor,
|
||||
navigationBarLightColor: navigationBarLightColor,
|
||||
navigationBarDarkColor: navigationBarDarkColor,
|
||||
handleDarkMode: darkModeHandler,
|
||||
});
|
||||
const existingColors = systemColors.get(activity) ?? {
|
||||
navigationBarLight: DefaultLightScrim,
|
||||
navigationBarDark: DefaultDarkScrim,
|
||||
statusBarLight: DefaultStatusBarLight,
|
||||
statusBarDark: DefaultStatusBarDark,
|
||||
};
|
||||
existingColors.navigationBarLight ??= navigationBarLightColor;
|
||||
existingColors.navigationBarDark ??= navigationBarDarkColor;
|
||||
systemColors.set(getCurrentActivity(), existingColors);
|
||||
|
||||
setEnableEdgeToEdge(activity, existingColors);
|
||||
}
|
||||
}
|
||||
|
||||
let darkModeHandler: ((bar: 'status' | 'navigation', resources: android.content.res.Resources) => boolean) | null = null;
|
||||
|
||||
export function setDarkModeHandler(handler: (bar: 'status' | 'navigation', resources: android.content.res.Resources) => boolean): void {
|
||||
darkModeHandler = handler;
|
||||
const activity = getCurrentActivity();
|
||||
export function setDarkModeHandler(options?: { activity?: androidx.appcompat.app.AppCompatActivity; handler: (bar: 'status' | 'navigation', resources: android.content.res.Resources) => boolean }): void {
|
||||
const darkModeHandler = options?.handler ?? null;
|
||||
const activity = options?.activity ?? getCurrentActivity();
|
||||
if (activity) {
|
||||
enableEdgeToEdge(activity, {
|
||||
statusBarLightColor,
|
||||
statusBarDarkColor,
|
||||
navigationBarLightColor,
|
||||
navigationBarDarkColor,
|
||||
handleDarkMode: handler,
|
||||
});
|
||||
const existingColors = systemColors.get(activity) ?? {
|
||||
navigationBarLight: DefaultLightScrim,
|
||||
navigationBarDark: DefaultDarkScrim,
|
||||
statusBarLight: DefaultStatusBarLight,
|
||||
statusBarDark: DefaultStatusBarDark,
|
||||
};
|
||||
|
||||
existingColors.handler ??= darkModeHandler;
|
||||
|
||||
systemColors.set(getCurrentActivity(), existingColors);
|
||||
|
||||
setEnableEdgeToEdge(activity, existingColors);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,21 +267,10 @@ export function enableEdgeToEdge(
|
||||
},
|
||||
): void {
|
||||
let handleDarkMode: org.nativescript.widgets.Utils.HandleDarkMode;
|
||||
let statusBarLight: number = statusBarLightColor?.android ?? 0;
|
||||
let statusBarDark: number = statusBarDarkColor?.android ?? 0;
|
||||
let navigationBarLight: number = navigationBarLightColor?.android ?? DefaultLightScrim.android;
|
||||
let navigationBarDark: number = navigationBarDarkColor?.android ?? DefaultDarkScrim.android;
|
||||
if (darkModeHandler) {
|
||||
handleDarkMode = new org.nativescript.widgets.Utils.HandleDarkMode({
|
||||
onHandle(bar, resources) {
|
||||
if (bar === 0) {
|
||||
return darkModeHandler('status', resources);
|
||||
} else {
|
||||
return darkModeHandler('navigation', resources);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
let statusBarLight: number = 0;
|
||||
let statusBarDark: number = 0;
|
||||
let navigationBarLight: number = DefaultLightScrim.android;
|
||||
let navigationBarDark: number = DefaultDarkScrim.android;
|
||||
if (options) {
|
||||
if (typeof options.handleDarkMode === 'function') {
|
||||
handleDarkMode = new org.nativescript.widgets.Utils.HandleDarkMode({
|
||||
|
||||
Reference in New Issue
Block a user