Skip to content

Commit 2c27b1a

Browse files
author
Hristo Hristov
authored
Cache android.widget.SeekBar as SeekBar for better performance (NativeScript#4669)
* Cache android.widget.SeekBar as SeekBar for better performance Made singleton listener for SeekBar Fix slider issue Add slider test * Futher refactoring
1 parent ca8a2ee commit 2c27b1a

3 files changed

Lines changed: 88 additions & 61 deletions

File tree

tests/app/ui/slider/slider-tests.ts

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,35 @@ export function test_default_native_values() {
143143
helper.buildUIAndRunTest(slider, testAction);
144144
}
145145

146+
export function test_values_change_native_values() {
147+
const slider = new Slider();
148+
slider.minValue = 0;
149+
slider.value = 0;
150+
slider.maxValue = 10;
151+
function testAction(views: Array<View>) {
152+
TKUnit.assertEqual(getNativeValue(slider), 0, "1: wrong native slider.value");
153+
TKUnit.assertEqual(getNativeMaxValue(slider), 10, "1: Wrong native slider.maxValue");
154+
155+
slider.value = 5;
156+
TKUnit.assertEqual(getNativeValue(slider), 5, "2: wrong native slider.value");
157+
TKUnit.assertEqual(getNativeMaxValue(slider), 10, "2: Wrong native slider.maxValue");
158+
159+
slider.minValue = 10;
160+
TKUnit.assertEqual(getNativeValue(slider), isIOS ? 10 : 0, "3: wrong native slider.value");
161+
TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 10 : 0, "3: Wrong native slider.maxValue");
162+
163+
slider.maxValue = 20;
164+
TKUnit.assertEqual(getNativeValue(slider), isIOS ? 10 : 0, "4: wrong native slider.value");
165+
TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 20 : 10, "4: Wrong native slider.maxValue");
166+
167+
slider.value = 15;
168+
TKUnit.assertEqual(getNativeValue(slider), isIOS ? 15: 5, "5: wrong native slider.value");
169+
TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 20 : 10, "5: Wrong native slider.maxValue");
170+
};
171+
172+
helper.buildUIAndRunTest(slider, testAction);
173+
}
174+
146175
export function test_set_min_max_value() {
147176
const slider = new Slider();
148177
slider.minValue = MIN_TEST_VALUE;
@@ -315,10 +344,9 @@ export function test_property_changed_event_when_setting_minValue_no_adjust() {
315344
function testAction(views: Array<View>) {
316345
const changedProperties = {};
317346
let allChanges = 0;
318-
319-
attachValueChangedEvents(slider, (data: EventData) => {
347+
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
320348
allChanges++;
321-
changedProperties[(<PropertyChangeData>data).propertyName] = true;
349+
changedProperties[data.propertyName] = true;
322350
});
323351

324352
// Act
@@ -342,9 +370,9 @@ export function test_property_changed_event_when_setting_minValue_with_adjust()
342370
function testAction(views: Array<View>) {
343371
const changedProperties = {};
344372
let allChanges = 0;
345-
attachValueChangedEvents(slider, (data: EventData) => {
373+
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
346374
allChanges++;
347-
changedProperties[(<PropertyChangeData>data).propertyName] = true;
375+
changedProperties[data.propertyName] = true;
348376
});
349377

350378
// Act
@@ -369,9 +397,9 @@ export function test_property_changed_event_when_setting_maxValue_no_adjust() {
369397
function testAction(views: Array<View>) {
370398
const changedProperties = {};
371399
let allChanges = 0;
372-
attachValueChangedEvents(slider, (data: EventData) => {
400+
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
373401
allChanges++;
374-
changedProperties[(<PropertyChangeData>data).propertyName] = true;
402+
changedProperties[data.propertyName] = true;
375403
});
376404

377405
// Act
@@ -395,9 +423,9 @@ export function test_property_changed_event_when_setting_maxValue_with_adjust()
395423
function testAction(views: Array<View>) {
396424
const changedProperties = {};
397425
let allChanges = 0;
398-
attachValueChangedEvents(slider, (data: EventData) => {
426+
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
399427
allChanges++;
400-
changedProperties[(<PropertyChangeData>data).propertyName] = true;
428+
changedProperties[data.propertyName] = true;
401429
});
402430

403431
// Act
@@ -487,20 +515,19 @@ function getNativeValue(slider: Slider): number {
487515
function getNativeMaxValue(slider: Slider): number {
488516
if (slider.android) {
489517
return slider.android.getMax();
490-
}
491-
else if (slider.ios) {
518+
} else if (slider.ios) {
492519
return slider.ios.maximumValue;
493520
}
494521
}
495522

496523
function setNativeValue(slider: Slider, value: number) {
497524
if (slider.android) {
498-
slider.android.setProgress(value);
499-
}
500-
else if (slider.ios) {
525+
const seekBar = (<android.widget.SeekBar>slider.android);
526+
seekBar.setProgress(value);
527+
} else if (slider.ios) {
501528
slider.ios.value = value;
502529

503530
// setting value trough code does not send notification, so simulate that manually.
504531
slider.ios.sendActionsForControlEvents(UIControlEvents.ValueChanged);
505532
}
506-
}
533+
}

tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"version": "3.1.0"
1010
},
1111
"tns-android": {
12-
"version": "3.1.0"
12+
"version": "3.1.1"
1313
}
1414
},
1515
"dependencies": {

tns-core-modules/ui/slider/slider.android.ts

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,66 +6,70 @@ import {
66

77
export * from "./slider-common";
88

9-
interface SeekBarChangeListener {
10-
new (owner: Slider): android.widget.SeekBar.OnSeekBarChangeListener;
9+
interface OwnerSeekBar extends android.widget.SeekBar {
10+
owner: Slider;
1111
}
1212

13-
let SeekBarChangeListener: SeekBarChangeListener;
13+
let SeekBar: typeof android.widget.SeekBar;
14+
let SeekBarChangeListener: android.widget.SeekBar.OnSeekBarChangeListener;
1415

15-
function initializeSeekBarChangeListener(): void {
16-
if (SeekBarChangeListener) {
17-
return;
16+
function initializeModule(): void {
17+
if (!SeekBar) {
18+
SeekBar = android.widget.SeekBar;
1819
}
1920

20-
@Interfaces([android.widget.SeekBar.OnSeekBarChangeListener])
21-
class SeekBarChangeListenerImpl extends java.lang.Object implements android.widget.SeekBar.OnSeekBarChangeListener {
22-
constructor(public owner: Slider) {
23-
super();
24-
return global.__native(this);
25-
}
21+
if (!SeekBarChangeListener) {
22+
@Interfaces([android.widget.SeekBar.OnSeekBarChangeListener])
23+
class SeekBarChangeListenerImpl extends java.lang.Object implements android.widget.SeekBar.OnSeekBarChangeListener {
24+
constructor() {
25+
super();
26+
return global.__native(this);
27+
}
2628

27-
onProgressChanged(seekBar: android.widget.SeekBar, progress: number, fromUser: boolean): void {
28-
const owner = this.owner;
29-
if (!owner._supressNativeValue) {
30-
let newValue: number = seekBar.getProgress() + owner.minValue;
31-
valueProperty.nativeValueChange(owner, newValue);
29+
onProgressChanged(seekBar: OwnerSeekBar, progress: number, fromUser: boolean): void {
30+
const owner = seekBar.owner;
31+
if (!owner._supressNativeValue) {
32+
const newValue = progress + owner.minValue;
33+
valueProperty.nativeValueChange(owner, newValue);
34+
}
3235
}
33-
}
3436

35-
onStartTrackingTouch(seekBar: android.widget.SeekBar): void {
36-
//
37-
}
37+
onStartTrackingTouch(seekBar: OwnerSeekBar): void {
38+
//
39+
}
3840

39-
onStopTrackingTouch(seekBar: android.widget.SeekBar): void {
40-
//
41+
onStopTrackingTouch(seekBar: OwnerSeekBar): void {
42+
//
43+
}
4144
}
45+
46+
SeekBarChangeListener = new SeekBarChangeListenerImpl();
4247
}
48+
}
4349

44-
SeekBarChangeListener = SeekBarChangeListenerImpl;
50+
function getListener(): android.widget.SeekBar.OnSeekBarChangeListener {
51+
return SeekBarChangeListener;
4552
}
4653

4754
export class Slider extends SliderBase {
4855
_supressNativeValue: boolean;
49-
nativeViewProtected: android.widget.SeekBar;
56+
nativeViewProtected: OwnerSeekBar;
5057

5158
public createNativeView() {
52-
initializeSeekBarChangeListener();
53-
const listener = new SeekBarChangeListener(this);
54-
const nativeView = new android.widget.SeekBar(this._context);
59+
initializeModule();
60+
const nativeView = new SeekBar(this._context);
61+
const listener = getListener();
5562
nativeView.setOnSeekBarChangeListener(listener);
56-
(<any>nativeView).listener = listener;
5763
return nativeView;
5864
}
5965

6066
public initNativeView(): void {
6167
super.initNativeView();
62-
const nativeView: any = this.nativeViewProtected;
63-
nativeView.listener.owner = this;
68+
this.nativeViewProtected.owner = this;
6469
}
6570

6671
public disposeNativeView() {
67-
const nativeView: any = this.nativeViewProtected;
68-
nativeView.listener.owner = null;
72+
this.nativeViewProtected.owner = null;
6973
super.disposeNativeView();
7074
}
7175

@@ -82,34 +86,30 @@ export class Slider extends SliderBase {
8286
* We need this method to call native setMax and setProgress methods when minValue property is changed,
8387
* without handling the native value changed callback.
8488
*/
85-
private setNativeValuesSilently(newValue: number, newMaxValue: number) {
89+
private setNativeValuesSilently() {
8690
this._supressNativeValue = true;
8791
const nativeView = this.nativeViewProtected;
8892
try {
89-
nativeView.setMax(newMaxValue);
90-
nativeView.setProgress(newValue);
93+
nativeView.setMax(this.maxValue - this.minValue);
94+
nativeView.setProgress(this.value - this.minValue);
9195
} finally {
9296
this._supressNativeValue = false;
9397
}
9498
}
9599

96-
[valueProperty.getDefault](): number {
97-
return 0;
98-
}
99100
[valueProperty.setNative](value: number) {
100-
this.setNativeValuesSilently(value - this.minValue, this.maxValue - this.minValue);
101-
}
102-
[minValueProperty.getDefault](): number {
103-
return 0;
101+
this.setNativeValuesSilently();
104102
}
103+
105104
[minValueProperty.setNative](value: number) {
106-
this.setNativeValuesSilently(this.value - value, this.maxValue - value);
105+
this.setNativeValuesSilently();
107106
}
107+
108108
[maxValueProperty.getDefault](): number {
109109
return 100;
110110
}
111111
[maxValueProperty.setNative](value: number) {
112-
this.setNativeValuesSilently(value - this.minValue, value);
112+
this.setNativeValuesSilently();
113113
}
114114

115115
[colorProperty.getDefault](): number {

0 commit comments

Comments
 (0)