Fixes `Error: java.lang.CloneNotSupportedException: Class android.support.v4.app.FragmentManagerImpl$AnimationOrAnimator doesn't implement Cloneable` in specific projects.
Related to #5785
Related to #6129
BREAKING CHANGE
Before:
Default fragment enter animation was Android version specific
After:
Default fragment enter animation is now fade animation for all Android versions
You can customise the transition per navigation entry or globally via the [navigation transitions API](
https://docs.nativescript.org/core-concepts/navigation#navigation-transitions)
* Added getAdditionalSelectors function so that nativescript-theme can be functional again in NS 4.x
* Change to a better more extensible additional css system.
* removed redunant function on the name.
* Fix lint issues
* Adding mergeSelectors to the remove function
* Added test of new add/remove css functions.
* fix: revert testRunner.ts changes that disabled all tests except style
* refactor: fix typo
* chore: fix typo and change test to no not affect global styles
Switch Activity / Fragment / FragmentManager implementation from native framework to support library APIs
BREAKING CHANGE:
NativeScript core framework now extends support library APIs versus native framework classes as per Google's latest guidelines:
- NativeScript activities now extend `android.support.v7.app.AppCompatActivity` (vs android.app.Activity)
- NativeScript fragments now extend `android.support.v4.app.Fragment` (vs android.app.Fragment)
- NativeScript now works internally with `android.support.v4.app.FragmentManager` (vs android.app.FragmentManager)
The implications of these changes should be mostly transparent to the developer except for the fact that the support library Fragment / FragmentManager work with Animation APIs versus Animator APIs.
For Android API Levels lower than 28 the new Fragment API uses a different fragment enter animation by default. You can customise the transition per navigation entry or globally via the [navigation transitions API](https://docs.nativescript.org/core-concepts/navigation#navigation-transitions)
Before:
Default fragment enter animation was fade animation
After:
Default fragment enter animation for API levels lower than 28 is now a fast "push fade" animation; default fragment enter animation for API levels equal to or greater than 28 remains fade animation
Before:
AndroidFragmentCallbacks interface exposed the following `onCreateAnimator(...)` method
``` ts
export interface AndroidFragmentCallbacks {
onCreateAnimator(fragment: any, transit: number, enter: boolean, nextAnim: number, superFunc: Function): any;
// ...
}
```
After:
AndroidFragmentCallbacks interface now exposes the following `onCreateAnimation(...)` method instead (and `onCreateAnimator(...)` is now removed)
``` ts
export interface AndroidFragmentCallbacks {
onCreateAnimation(fragment: any, transit: number, enter: boolean, nextAnim: number, superFunc: Function): any;
// ...
}
```
Before:
Transition class exposed the following abstract `createAndroidAnimator(...)` method
``` ts
export class Transition {
public createAndroidAnimator(transitionType: string): any;
// ...
}
```
After:
Transition class now exposes the following abstract `createAndroidAnimation(...)` method instead (and `createAndroidAnimation(...) is now removed)
``` ts
export class Transition {
public createAndroidAnimation(transitionType: string): any;
// ...
}
```
To migrate the code of your custom transitions follow the example below:
Before:
``` ts
import * as transition from "tns-core-modules/ui/transition";
export class CustomTransition extends transition.Transition {
constructor(duration: number, curve: any) {
super(duration, curve);
}
public createAndroidAnimator(transitionType: string): android.animation.Animator {
var scaleValues = Array.create("float", 2);
switch (transitionType) {
case transition.AndroidTransitionType.enter:
case transition.AndroidTransitionType.popEnter:
scaleValues[0] = 0;
scaleValues[1] = 1;
break;
case transition.AndroidTransitionType.exit:
case transition.AndroidTransitionType.popExit:
scaleValues[0] = 1;
scaleValues[1] = 0;
break;
}
var objectAnimators = Array.create(android.animation.Animator, 2);
objectAnimators[0] = android.animation.ObjectAnimator.ofFloat(null, "scaleX", scaleValues);
objectAnimators[1] = android.animation.ObjectAnimator.ofFloat(null, "scaleY", scaleValues);
var animatorSet = new android.animation.AnimatorSet();
animatorSet.playTogether(objectAnimators);
var duration = this.getDuration();
if (duration !== undefined) {
animatorSet.setDuration(duration);
}
animatorSet.setInterpolator(this.getCurve());
return animatorSet;
}
}
```
After:
``` ts
import * as transition from "tns-core-modules/ui/transition";
export class CustomTransition extends transition.Transition {
constructor(duration: number, curve: any) {
super(duration, curve);
}
public createAndroidAnimation(transitionType: string): android.view.animation.Animation {
const scaleValues = [];
switch (transitionType) {
case transition.AndroidTransitionType.enter:
case transition.AndroidTransitionType.popEnter:
scaleValues[0] = 0;
scaleValues[1] = 1;
break;
case transition.AndroidTransitionType.exit:
case transition.AndroidTransitionType.popExit:
scaleValues[0] = 1;
scaleValues[1] = 0;
break;
}
const animationSet = new android.view.animation.AnimationSet(false);
const duration = this.getDuration();
if (duration !== undefined) {
animationSet.setDuration(duration);
}
animationSet.setInterpolator(this.getCurve());
animationSet.addAnimation(
new android.view.animation.ScaleAnimation(
scaleValues[0],
scaleValues[1],
scaleValues[0],
scaleValues[1]
));
return animationSet;
}
}
```
* Added textField, valueField and selectedValue properties
textField and valueField - should be used with arrays of JSON objects
textField - tells the listview which property should be used to display each item
valueField - tells the listview, which property should be used to update the selectedValue
selectedValue - is the property that will contain the selectedValue, if valueField is specified, then it will contain the value from that field, otherwise it will contain the whole selected item
* Example showing textField, valueField and selectedValue in action
* Update import paths
* fix(action-bar): #5743 navController may be null
From my own Crashlytics:
`stderr: file:///app/vendor.js:1:860568: JS ERROR TypeError: null is not an object (evaluating 'a.viewControllers')`
```
file:///app/vendor.js:1:860489
var l,p=a.viewControllers.indexOfObject(n);if(p>0&&p<a.viewControllers.count&&(t=a.viewControllers[p-1]),t)
```
which corresponds to:
2fc1d8a8d4/tns-core-modules/ui/action-bar/action-bar.ios.ts (L132)
further up `navController` is checked for truthiness:
2fc1d8a8d4/tns-core-modules/ui/action-bar/action-bar.ios.ts (L119)
So applying same logic.
* Adjusted per request
Adding android typings for API levels from 17 to 27
BREAKING CHANGES:
There is no longer added `I` prefix in the names of the interfaces. For example `android.view.IMenuItem` is now `android.view.MenuItem`. This matches the original name of the interface in the android framework.
* Fix typings for nativeValueChange
* Update properties.d.ts
Changed parameter name of nativeValueChange from “target” to “owner”
Fixed white space to match coding style
* Update properties.d.ts
Fixed white space
* fix: crash at application launch on Android P
Reference: https://developer.android.com/preview/restrictions-non-sdk-interfaces
Android P introduces new restrictions on the use of non-SDK interfaces, whether directly, via reflection, or via JNI. These restrictions are applied whenever an app references a non-SDK interface or attempts to obtain its handle using reflection or JNI.
In particular, remove reflection via Class.getDeclaredField() and fallback default transition to fade transition.
* refactor: create default transition based on SDK version
Create default transition and setup default animations based on SDK version.
This is to avoid reflection via Class.getDeclaredMethod() for Android P where it throws.
* refactor: extract isAndroidP method
* feat(view): introduce LayoutChanged event
* test(view): add LayoutChanged event tests
* chore(view-android): attach to onLayoutChange only if listener attached
* feat(view-android): override on/off in order to attach and detach from OnLayoutChangeListener
* feat(tabview): add tab text font size property
* chore(tabview): set tab font size default value
* chore(tabview): move font implementation to widget
* chore(tabview): fix font size get return type
* feat(ios): Added support for css gradients.
* feat(android): Added support for css gradients.
* fix: Fixed gradient borders on ios
* fix(gradient): added backgroundGradient to View and Style.
* fix(ios-gradients): fixed ios gradients covering view content.
* test(gradient): Added ui app tests for background gradients.
* test(gradient): Added a test ensuring background gradient property is applied to style.
* style(gradient): Fixed tslint errors.
* fix(gradient): Removed the background-gradient property and added the gradient to background-image.
* style: fixed a consecutive blank line tslint error.
* fix(tests): fixed the bug that was causing tests to fail.
* chore(linear-gradient): fix equality comparer
* test(gradient): add linear gradients test app
* chore(tslint): update with latest tslint rules