@react-native-oh-tpl/react-native-orientation-locker
Version:
A react-native module that can listen on orientation changing of device, get current orientation, lock to preferred orientation.
173 lines (153 loc) • 6.33 kB
text/typescript
/*
* Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved
* Use of this source code is governed by a MIT license that can be
* found in the LICENSE file.
*/
import { TurboModule } from '@rnoh/react-native-openharmony/ts'
import { TM } from '@rnoh/react-native-openharmony/generated/ts'
import window from '@ohos.window'
import display from '@ohos.display'
import { BusinessError } from '@kit.BasicServicesKit'
import sensor from '@ohos.sensor';
export class RNOrientationLockerTurboModule extends TurboModule implements TM.OreitationLockerNativeModule.Spec {
private lastDeviceOrientationValue:string = this.getOrientationString(display.getDefaultDisplaySync().orientation);
private lastDeviceSensorOrientationValue:string = "";
constructor(ctx) {
super(ctx)
display.on('change', () => {
let deviceOrientationValue = this.lastDeviceOrientationValue;
let displayValue = display.getDefaultDisplaySync();
let displayValueString = this.getOrientationString(displayValue.orientation);
deviceOrientationValue = displayValueString;
if(this.lastDeviceOrientationValue != deviceOrientationValue){
this.lastDeviceOrientationValue = deviceOrientationValue;
ctx.rnInstance.emitDeviceEvent('orientationDidChange', { orientation: displayValueString })
}
})
sensor.on(sensor.SensorId.ORIENTATION, (data: sensor.OrientationResponse) => {
console.info("orientation change z value:"+data.alpha)
let deviceOrientationValue:string = this.lastDeviceSensorOrientationValue;
let orientation=data.alpha
if (orientation == -1) {
deviceOrientationValue = "UNKNOWN";
} else if (orientation > 355 || orientation < 5) {
deviceOrientationValue = "PORTRAIT";
} else if (orientation > 85 && orientation < 95) {
deviceOrientationValue = "LANDSCAPE-RIGHT";
} else if (orientation > 175 && orientation < 185) {
deviceOrientationValue = "PORTRAIT-UPSIDEDOWN";
} else if (orientation > 265 && orientation < 275) {
deviceOrientationValue = "LANDSCAPE-LEFT";
}
if (this.lastDeviceSensorOrientationValue !== deviceOrientationValue) {
ctx.rnInstance.emitDeviceEvent('deviceOrientationDidChange', { deviceOrientation: deviceOrientationValue })
this.lastDeviceSensorOrientationValue = deviceOrientationValue;
}
}, { interval: 100000000 });
}
private windowClass: window.Window | undefined = undefined
private async setWindowClass(): Promise<void> {
let context = this.ctx.uiAbilityContext;
let promise = await window.getLastWindow(context);
this.windowClass = promise;
return;
}
private getOrientationString(orientation: number): string {
if (orientation === 0) {
return 'PORTRAIT';
} else if (orientation === 1) {
return 'LANDSCAPE-RIGHT';
} else if (orientation === 2) {
return 'PORTRAIT-UPSIDEDOWN';
} else if (orientation === 3) {
return 'LANDSCAPE-LEFT';
} else {
return 'UNKNOWN';
}
}
private sendLockEvent(orientation: number) {
let orientationString = this.getOrientationString(orientation)
this.ctx.rnInstance.emitDeviceEvent('lockDidChange', { orientation: orientationString })
}
private lockToOrientation(orientation) {
this.setWindowClass().then(() => {
if (this.windowClass) {
// let orientation: window.Orientation = window.Orientation.AUTO_ROTATION_PORTRAIT;
this.windowClass.setPreferredOrientation(orientation, (err: BusinessError) => {
if (err.code) {
return;
}
// window.Orientation属性与displayValue.orientation对齐需要 orientation - 1
this.sendLockEvent(orientation - 1)
});
}
})
}
lockToPortrait(): void {
let orientation: window.Orientation = window.Orientation.PORTRAIT;
this.lockToOrientation(orientation)
}
lockToLandscape(): void {
let orientation: window.Orientation = window.Orientation.AUTO_ROTATION_LANDSCAPE_RESTRICTED;
this.lockToOrientation(orientation)
}
lockToLandscapeLeft(): void {
let orientation: window.Orientation = window.Orientation.LANDSCAPE;
this.lockToOrientation(orientation)
}
lockToAllOrientationsButUpsideDown(): void {
let orientation: window.Orientation = window.Orientation.AUTO_ROTATION_PORTRAIT;
this.lockToOrientation(orientation)
}
lockToLandscapeRight(): void {
let orientation: window.Orientation = window.Orientation.LANDSCAPE_INVERTED;
this.lockToOrientation(orientation)
}
lockToPortraitUpsideDown(): void {
let orientation: window.Orientation = window.Orientation.PORTRAIT_INVERTED;
this.lockToOrientation(orientation)
}
unlockAllOrientations(): void {
let orientation: window.Orientation = window.Orientation.AUTO_ROTATION;
this.lockToOrientation(orientation)
}
getOrientation(callback: (orientation: string) => void): void {
let displayClass: display.Display | null = null;
let err: string | null = null;
try {
displayClass = display.getDefaultDisplaySync();
let AppOrientation = this.getOrientationString(displayClass.orientation);
callback(AppOrientation);
} catch (e) {
callback(null);
}
}
getInitialOrientation(): string {
let displayClass: display.Display | null = null;
try {
displayClass = display.getDefaultDisplaySync();
let AppOrientation = this.getOrientationString(displayClass.orientation);
return AppOrientation
} catch (e) {
return 'UNKNOWN'
}
}
getDeviceOrientation(callback: (orientation: string) => void): void {
let displayClass: display.Display | null = null;
let err: string | null = null;
try {
displayClass = display.getDefaultDisplaySync();
let AppOrientation = this.getOrientationString(displayClass.orientation);
callback(AppOrientation);
} catch (e) {
callback(err);
}
}
getAutoRotateState(callback: (state: boolean) => void): void {
callback(true)
}
__onDestroy__(): void {
super.__onDestroy__()
display.off('change')
}
}