From 2c27b1ac7a52c585a3e8ee576f7e56235982f166 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Tue, 8 Aug 2017 16:04:41 +0300 Subject: [PATCH] Cache android.widget.SeekBar as SeekBar for better performance (#4669) * Cache android.widget.SeekBar as SeekBar for better performance Made singleton listener for SeekBar Fix slider issue Add slider test * Futher refactoring --- tests/app/ui/slider/slider-tests.ts | 57 ++++++++---- tests/package.json | 2 +- tns-core-modules/ui/slider/slider.android.ts | 92 ++++++++++---------- 3 files changed, 89 insertions(+), 62 deletions(-) diff --git a/tests/app/ui/slider/slider-tests.ts b/tests/app/ui/slider/slider-tests.ts index 7a18954d1..79fabc54b 100644 --- a/tests/app/ui/slider/slider-tests.ts +++ b/tests/app/ui/slider/slider-tests.ts @@ -143,6 +143,35 @@ export function test_default_native_values() { helper.buildUIAndRunTest(slider, testAction); } +export function test_values_change_native_values() { + const slider = new Slider(); + slider.minValue = 0; + slider.value = 0; + slider.maxValue = 10; + function testAction(views: Array) { + TKUnit.assertEqual(getNativeValue(slider), 0, "1: wrong native slider.value"); + TKUnit.assertEqual(getNativeMaxValue(slider), 10, "1: Wrong native slider.maxValue"); + + slider.value = 5; + TKUnit.assertEqual(getNativeValue(slider), 5, "2: wrong native slider.value"); + TKUnit.assertEqual(getNativeMaxValue(slider), 10, "2: Wrong native slider.maxValue"); + + slider.minValue = 10; + TKUnit.assertEqual(getNativeValue(slider), isIOS ? 10 : 0, "3: wrong native slider.value"); + TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 10 : 0, "3: Wrong native slider.maxValue"); + + slider.maxValue = 20; + TKUnit.assertEqual(getNativeValue(slider), isIOS ? 10 : 0, "4: wrong native slider.value"); + TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 20 : 10, "4: Wrong native slider.maxValue"); + + slider.value = 15; + TKUnit.assertEqual(getNativeValue(slider), isIOS ? 15: 5, "5: wrong native slider.value"); + TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 20 : 10, "5: Wrong native slider.maxValue"); + }; + + helper.buildUIAndRunTest(slider, testAction); +} + export function test_set_min_max_value() { const slider = new Slider(); slider.minValue = MIN_TEST_VALUE; @@ -315,10 +344,9 @@ export function test_property_changed_event_when_setting_minValue_no_adjust() { function testAction(views: Array) { const changedProperties = {}; let allChanges = 0; - - attachValueChangedEvents(slider, (data: EventData) => { + attachValueChangedEvents(slider, (data: PropertyChangeData) => { allChanges++; - changedProperties[(data).propertyName] = true; + changedProperties[data.propertyName] = true; }); // Act @@ -342,9 +370,9 @@ export function test_property_changed_event_when_setting_minValue_with_adjust() function testAction(views: Array) { const changedProperties = {}; let allChanges = 0; - attachValueChangedEvents(slider, (data: EventData) => { + attachValueChangedEvents(slider, (data: PropertyChangeData) => { allChanges++; - changedProperties[(data).propertyName] = true; + changedProperties[data.propertyName] = true; }); // Act @@ -369,9 +397,9 @@ export function test_property_changed_event_when_setting_maxValue_no_adjust() { function testAction(views: Array) { const changedProperties = {}; let allChanges = 0; - attachValueChangedEvents(slider, (data: EventData) => { + attachValueChangedEvents(slider, (data: PropertyChangeData) => { allChanges++; - changedProperties[(data).propertyName] = true; + changedProperties[data.propertyName] = true; }); // Act @@ -395,9 +423,9 @@ export function test_property_changed_event_when_setting_maxValue_with_adjust() function testAction(views: Array) { const changedProperties = {}; let allChanges = 0; - attachValueChangedEvents(slider, (data: EventData) => { + attachValueChangedEvents(slider, (data: PropertyChangeData) => { allChanges++; - changedProperties[(data).propertyName] = true; + changedProperties[data.propertyName] = true; }); // Act @@ -487,20 +515,19 @@ function getNativeValue(slider: Slider): number { function getNativeMaxValue(slider: Slider): number { if (slider.android) { return slider.android.getMax(); - } - else if (slider.ios) { + } else if (slider.ios) { return slider.ios.maximumValue; } } function setNativeValue(slider: Slider, value: number) { if (slider.android) { - slider.android.setProgress(value); - } - else if (slider.ios) { + const seekBar = (slider.android); + seekBar.setProgress(value); + } else if (slider.ios) { slider.ios.value = value; // setting value trough code does not send notification, so simulate that manually. slider.ios.sendActionsForControlEvents(UIControlEvents.ValueChanged); } -} +} \ No newline at end of file diff --git a/tests/package.json b/tests/package.json index 72e2079f9..d784a5b56 100644 --- a/tests/package.json +++ b/tests/package.json @@ -9,7 +9,7 @@ "version": "3.1.0" }, "tns-android": { - "version": "3.1.0" + "version": "3.1.1" } }, "dependencies": { diff --git a/tns-core-modules/ui/slider/slider.android.ts b/tns-core-modules/ui/slider/slider.android.ts index 87c8a5b14..4a4edbb34 100644 --- a/tns-core-modules/ui/slider/slider.android.ts +++ b/tns-core-modules/ui/slider/slider.android.ts @@ -6,66 +6,70 @@ import { export * from "./slider-common"; -interface SeekBarChangeListener { - new (owner: Slider): android.widget.SeekBar.OnSeekBarChangeListener; +interface OwnerSeekBar extends android.widget.SeekBar { + owner: Slider; } -let SeekBarChangeListener: SeekBarChangeListener; +let SeekBar: typeof android.widget.SeekBar; +let SeekBarChangeListener: android.widget.SeekBar.OnSeekBarChangeListener; -function initializeSeekBarChangeListener(): void { - if (SeekBarChangeListener) { - return; +function initializeModule(): void { + if (!SeekBar) { + SeekBar = android.widget.SeekBar; } - @Interfaces([android.widget.SeekBar.OnSeekBarChangeListener]) - class SeekBarChangeListenerImpl extends java.lang.Object implements android.widget.SeekBar.OnSeekBarChangeListener { - constructor(public owner: Slider) { - super(); - return global.__native(this); - } + if (!SeekBarChangeListener) { + @Interfaces([android.widget.SeekBar.OnSeekBarChangeListener]) + class SeekBarChangeListenerImpl extends java.lang.Object implements android.widget.SeekBar.OnSeekBarChangeListener { + constructor() { + super(); + return global.__native(this); + } - onProgressChanged(seekBar: android.widget.SeekBar, progress: number, fromUser: boolean): void { - const owner = this.owner; - if (!owner._supressNativeValue) { - let newValue: number = seekBar.getProgress() + owner.minValue; - valueProperty.nativeValueChange(owner, newValue); + onProgressChanged(seekBar: OwnerSeekBar, progress: number, fromUser: boolean): void { + const owner = seekBar.owner; + if (!owner._supressNativeValue) { + const newValue = progress + owner.minValue; + valueProperty.nativeValueChange(owner, newValue); + } + } + + onStartTrackingTouch(seekBar: OwnerSeekBar): void { + // + } + + onStopTrackingTouch(seekBar: OwnerSeekBar): void { + // } } - onStartTrackingTouch(seekBar: android.widget.SeekBar): void { - // - } - - onStopTrackingTouch(seekBar: android.widget.SeekBar): void { - // - } + SeekBarChangeListener = new SeekBarChangeListenerImpl(); } +} - SeekBarChangeListener = SeekBarChangeListenerImpl; +function getListener(): android.widget.SeekBar.OnSeekBarChangeListener { + return SeekBarChangeListener; } export class Slider extends SliderBase { _supressNativeValue: boolean; - nativeViewProtected: android.widget.SeekBar; + nativeViewProtected: OwnerSeekBar; public createNativeView() { - initializeSeekBarChangeListener(); - const listener = new SeekBarChangeListener(this); - const nativeView = new android.widget.SeekBar(this._context); + initializeModule(); + const nativeView = new SeekBar(this._context); + const listener = getListener(); nativeView.setOnSeekBarChangeListener(listener); - (nativeView).listener = listener; return nativeView; } public initNativeView(): void { super.initNativeView(); - const nativeView: any = this.nativeViewProtected; - nativeView.listener.owner = this; + this.nativeViewProtected.owner = this; } public disposeNativeView() { - const nativeView: any = this.nativeViewProtected; - nativeView.listener.owner = null; + this.nativeViewProtected.owner = null; super.disposeNativeView(); } @@ -82,34 +86,30 @@ export class Slider extends SliderBase { * We need this method to call native setMax and setProgress methods when minValue property is changed, * without handling the native value changed callback. */ - private setNativeValuesSilently(newValue: number, newMaxValue: number) { + private setNativeValuesSilently() { this._supressNativeValue = true; const nativeView = this.nativeViewProtected; try { - nativeView.setMax(newMaxValue); - nativeView.setProgress(newValue); + nativeView.setMax(this.maxValue - this.minValue); + nativeView.setProgress(this.value - this.minValue); } finally { this._supressNativeValue = false; } } - [valueProperty.getDefault](): number { - return 0; - } [valueProperty.setNative](value: number) { - this.setNativeValuesSilently(value - this.minValue, this.maxValue - this.minValue); - } - [minValueProperty.getDefault](): number { - return 0; + this.setNativeValuesSilently(); } + [minValueProperty.setNative](value: number) { - this.setNativeValuesSilently(this.value - value, this.maxValue - value); + this.setNativeValuesSilently(); } + [maxValueProperty.getDefault](): number { return 100; } [maxValueProperty.setNative](value: number) { - this.setNativeValuesSilently(value - this.minValue, value); + this.setNativeValuesSilently(); } [colorProperty.getDefault](): number {