mirror of
				https://github.com/NativeScript/NativeScript.git
				synced 2025-11-04 12:58:38 +08:00 
			
		
		
		
	BREAKING CHANGES:
`Application.orientation` is no longer a function.
Migration: Remove `()` from the `Application.orientation()` call:
```diff
import { Application } from "@nativescript/core";
-console.log(Application.orientation());
+console.log(Application.orientation);
```
`Application.systemAppearance` is no longer a function.
Migration: Remove `()` from the `Application.systemAppearance()` call:
```diff
import { Application } from "@nativescript/core";
-console.log(Application.systemAppearance());
+console.log(Application.systemAppearance);
```
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Application, ApplicationEventData } from '../application';
 | 
						|
import { Observable } from '../data/observable';
 | 
						|
import { Trace } from '../trace';
 | 
						|
import * as Utils from '../utils';
 | 
						|
import { SDK_VERSION } from '../utils/constants';
 | 
						|
import { CommonA11YServiceEnabledObservable, SharedA11YObservable } from './accessibility-service-common';
 | 
						|
 | 
						|
export function getAndroidAccessibilityManager(): android.view.accessibility.AccessibilityManager | null {
 | 
						|
	const context = Utils.ad.getApplicationContext() as android.content.Context;
 | 
						|
	if (!context) {
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
 | 
						|
	return context.getSystemService(android.content.Context.ACCESSIBILITY_SERVICE) as android.view.accessibility.AccessibilityManager;
 | 
						|
}
 | 
						|
 | 
						|
const accessibilityStateEnabledPropName = 'accessibilityStateEnabled';
 | 
						|
const touchExplorationStateEnabledPropName = 'touchExplorationStateEnabled';
 | 
						|
 | 
						|
class AndroidSharedA11YObservable extends SharedA11YObservable {
 | 
						|
	[accessibilityStateEnabledPropName]: boolean;
 | 
						|
	[touchExplorationStateEnabledPropName]: boolean;
 | 
						|
 | 
						|
	// @ts-ignore todo: fix
 | 
						|
	get accessibilityServiceEnabled(): boolean {
 | 
						|
		return !!this[accessibilityStateEnabledPropName] && !!this[touchExplorationStateEnabledPropName];
 | 
						|
	}
 | 
						|
 | 
						|
	set accessibilityServiceEnabled(v) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
let accessibilityStateChangeListener: android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
 | 
						|
let touchExplorationStateChangeListener: android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener;
 | 
						|
let sharedA11YObservable: AndroidSharedA11YObservable;
 | 
						|
 | 
						|
function updateAccessibilityState(): void {
 | 
						|
	const accessibilityManager = getAndroidAccessibilityManager();
 | 
						|
	if (!accessibilityManager) {
 | 
						|
		sharedA11YObservable.set(accessibilityStateEnabledPropName, false);
 | 
						|
		sharedA11YObservable.set(touchExplorationStateEnabledPropName, false);
 | 
						|
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	sharedA11YObservable.set(accessibilityStateEnabledPropName, !!accessibilityManager.isEnabled());
 | 
						|
	sharedA11YObservable.set(touchExplorationStateEnabledPropName, !!accessibilityManager.isTouchExplorationEnabled());
 | 
						|
}
 | 
						|
 | 
						|
function ensureStateListener(): SharedA11YObservable {
 | 
						|
	if (sharedA11YObservable) {
 | 
						|
		return sharedA11YObservable;
 | 
						|
	}
 | 
						|
 | 
						|
	const accessibilityManager = getAndroidAccessibilityManager();
 | 
						|
	sharedA11YObservable = new AndroidSharedA11YObservable();
 | 
						|
 | 
						|
	if (!accessibilityManager) {
 | 
						|
		sharedA11YObservable.set(accessibilityStateEnabledPropName, false);
 | 
						|
		sharedA11YObservable.set(touchExplorationStateEnabledPropName, false);
 | 
						|
 | 
						|
		return sharedA11YObservable;
 | 
						|
	}
 | 
						|
 | 
						|
	accessibilityStateChangeListener = new android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener({
 | 
						|
		onAccessibilityStateChanged(enabled) {
 | 
						|
			updateAccessibilityState();
 | 
						|
 | 
						|
			if (Trace.isEnabled()) {
 | 
						|
				Trace.write(`AccessibilityStateChangeListener state changed to: ${!!enabled}`, Trace.categories.Accessibility);
 | 
						|
			}
 | 
						|
		},
 | 
						|
	});
 | 
						|
	accessibilityManager.addAccessibilityStateChangeListener(accessibilityStateChangeListener);
 | 
						|
 | 
						|
	if (SDK_VERSION >= 19) {
 | 
						|
		touchExplorationStateChangeListener = new android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener({
 | 
						|
			onTouchExplorationStateChanged(enabled) {
 | 
						|
				updateAccessibilityState();
 | 
						|
 | 
						|
				if (Trace.isEnabled()) {
 | 
						|
					Trace.write(`TouchExplorationStateChangeListener state changed to: ${!!enabled}`, Trace.categories.Accessibility);
 | 
						|
				}
 | 
						|
			},
 | 
						|
		});
 | 
						|
		accessibilityManager.addTouchExplorationStateChangeListener(touchExplorationStateChangeListener);
 | 
						|
	}
 | 
						|
 | 
						|
	updateAccessibilityState();
 | 
						|
 | 
						|
	Application.on(Application.resumeEvent, updateAccessibilityState);
 | 
						|
	Application.on(Application.exitEvent, (args: ApplicationEventData) => {
 | 
						|
		const activity = args.android as android.app.Activity;
 | 
						|
		if (activity && !activity.isFinishing()) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		const accessibilityManager = getAndroidAccessibilityManager();
 | 
						|
		if (accessibilityManager) {
 | 
						|
			if (accessibilityStateChangeListener) {
 | 
						|
				accessibilityManager.removeAccessibilityStateChangeListener(accessibilityStateChangeListener);
 | 
						|
			}
 | 
						|
 | 
						|
			if (touchExplorationStateChangeListener) {
 | 
						|
				accessibilityManager.removeTouchExplorationStateChangeListener(touchExplorationStateChangeListener);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		accessibilityStateChangeListener = null;
 | 
						|
		touchExplorationStateChangeListener = null;
 | 
						|
 | 
						|
		if (sharedA11YObservable) {
 | 
						|
			sharedA11YObservable.removeEventListener(Observable.propertyChangeEvent);
 | 
						|
			sharedA11YObservable = null;
 | 
						|
		}
 | 
						|
 | 
						|
		Application.off(Application.resumeEvent, updateAccessibilityState);
 | 
						|
	});
 | 
						|
 | 
						|
	return sharedA11YObservable;
 | 
						|
}
 | 
						|
 | 
						|
export function isAccessibilityServiceEnabled(): boolean {
 | 
						|
	return ensureStateListener().accessibilityServiceEnabled;
 | 
						|
}
 | 
						|
 | 
						|
export class AccessibilityServiceEnabledObservable extends CommonA11YServiceEnabledObservable {
 | 
						|
	constructor() {
 | 
						|
		super(ensureStateListener());
 | 
						|
	}
 | 
						|
}
 |