mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
feat(android): edge-to-edge
Squashed from feat/edge-to-edge and resolved conflicts
This commit is contained in:
@@ -3,6 +3,7 @@ import { getNativeApp } from '../application/helpers-common';
|
||||
import { androidGetCurrentActivity } from '../application/helpers';
|
||||
import { Trace } from '../trace';
|
||||
import { topmost } from '../ui/frame/frame-stack';
|
||||
import { Color } from '../color';
|
||||
|
||||
export function dataDeserialize(nativeData?: any) {
|
||||
if (nativeData === null || typeof nativeData !== 'object') {
|
||||
@@ -294,3 +295,117 @@ export function isRealDevice(): boolean {
|
||||
|
||||
return fingerprint != null && (fingerprint.indexOf('vbox') > -1 || fingerprint.indexOf('generic') > -1);
|
||||
}
|
||||
|
||||
const DefaultLightScrim = new Color(0xe6, 0xff, 0xff, 0xff);
|
||||
const DefaultDarkScrim = new Color(0x80, 0x1b, 0x1b, 0x1b);
|
||||
|
||||
let statusBarDarkColor: Color | null = null;
|
||||
let statusBarLightColor: Color | null = null;
|
||||
|
||||
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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
if (activity) {
|
||||
enableEdgeToEdge(activity, {
|
||||
statusBarLightColor,
|
||||
statusBarDarkColor,
|
||||
navigationBarLightColor: navigationBarLightColor,
|
||||
navigationBarDarkColor: navigationBarDarkColor,
|
||||
handleDarkMode: darkModeHandler,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
if (activity) {
|
||||
enableEdgeToEdge(activity, {
|
||||
statusBarLightColor,
|
||||
statusBarDarkColor,
|
||||
navigationBarLightColor,
|
||||
navigationBarDarkColor,
|
||||
handleDarkMode: handler,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function enableEdgeToEdge(
|
||||
activity: androidx.appcompat.app.AppCompatActivity,
|
||||
options?: {
|
||||
statusBarLightColor?: Color;
|
||||
statusBarDarkColor?: Color;
|
||||
navigationBarLightColor?: Color;
|
||||
navigationBarDarkColor?: Color;
|
||||
handleDarkMode?: (bar: 'status' | 'navigation', resources: android.content.res.Resources) => boolean;
|
||||
},
|
||||
): 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);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
if (options) {
|
||||
if (typeof options.handleDarkMode === 'function') {
|
||||
handleDarkMode = new org.nativescript.widgets.Utils.HandleDarkMode({
|
||||
onHandle(bar, resources) {
|
||||
if (bar === 0) {
|
||||
return options.handleDarkMode('status', resources);
|
||||
} else {
|
||||
return options.handleDarkMode('navigation', resources);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
if (options.statusBarLightColor instanceof Color) {
|
||||
statusBarLight = options.statusBarLightColor.android;
|
||||
}
|
||||
if (options.statusBarDarkColor instanceof Color) {
|
||||
statusBarDark = options.statusBarDarkColor.android;
|
||||
}
|
||||
if (options.navigationBarLightColor instanceof Color) {
|
||||
navigationBarLight = options.navigationBarLightColor.android;
|
||||
}
|
||||
if (options.navigationBarDarkColor instanceof Color) {
|
||||
navigationBarDark = options.navigationBarDarkColor.android;
|
||||
}
|
||||
}
|
||||
|
||||
if (handleDarkMode) {
|
||||
org.nativescript.widgets.Utils.enableEdgeToEdge(activity, java.lang.Integer.valueOf(statusBarLight), java.lang.Integer.valueOf(statusBarDark), java.lang.Integer.valueOf(navigationBarLight), java.lang.Integer.valueOf(navigationBarDark), handleDarkMode);
|
||||
} else {
|
||||
org.nativescript.widgets.Utils.enableEdgeToEdge(activity, java.lang.Integer.valueOf(statusBarLight), java.lang.Integer.valueOf(statusBarDark), java.lang.Integer.valueOf(navigationBarLight), java.lang.Integer.valueOf(navigationBarDark));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { platformCheck } from './platform-check';
|
||||
|
||||
// importing this helper as a separate file avoids "android" symbol clash with the global android object
|
||||
import { resources, collections, getWindow, getApplication, getCurrentActivity, getApplicationContext, getResources, getPackageName, getInputMethodManager, showSoftInput, dismissSoftInput } from './native-helper-for-android';
|
||||
import { resources, collections, getWindow, getApplication, getCurrentActivity, getApplicationContext, getResources, getPackageName, getInputMethodManager, showSoftInput, dismissSoftInput, setStatusBarColor, setNavigationBarColor, setDarkModeHandler } from './native-helper-for-android';
|
||||
export { dataSerialize, dataDeserialize } from './native-helper-for-android';
|
||||
|
||||
export { getWindow } from './native-helper-for-android';
|
||||
@@ -18,6 +18,9 @@ export const android = {
|
||||
getInputMethodManager,
|
||||
showSoftInput,
|
||||
dismissSoftInput,
|
||||
setStatusBarColor,
|
||||
setNavigationBarColor,
|
||||
setDarkModeHandler,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
3
packages/core/utils/native-helper.d.ts
vendored
3
packages/core/utils/native-helper.d.ts
vendored
@@ -107,6 +107,9 @@ export const android: {
|
||||
* Hides the soft input method, usually a soft keyboard.
|
||||
*/
|
||||
dismissSoftInput: (nativeView?: android.view.View) => void;
|
||||
setStatusBarColor: (lightColor: Color | null = null, darkColor: Color | null = null) => void;
|
||||
setNavigationBarColor: (lightColor: Color | null = null, darkColor: Color | null = null) => void;
|
||||
setDarkModeHandler: (handler: (bar: 'status' | 'navigation', resources: android.content.res.Resources) => boolean) => void;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user