Skip to content

Commit 449d8af

Browse files
author
Maksym Khobotin
committed
Release 1.0.0
1 parent 13516c9 commit 449d8af

40 files changed

+3536
-90
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ example/ios/Flutter/Flutter.podspec
1616
.metadata
1717

1818
example/ios/Flutter/flutter_export_environment.sh
19+
example/.flutter-plugins-dependencies

.travis.yml

+157-29
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,160 @@
1-
os:
2-
- linux
3-
sudo: false
4-
addons:
5-
apt:
6-
sources:
7-
- ubuntu-toolchain-r-test
8-
packages:
9-
- libstdc++6
10-
- fonts-noto
11-
git:
12-
depth: 3
131
env:
14-
- FLUTTER_VERSION=stable
15-
- FLUTTER_VERSION=beta
16-
matrix:
17-
allow_failures:
18-
- env: FLUTTER_VERSION=beta
19-
before_script:
20-
- git clone https://github.com/flutter/flutter.git -b $FLUTTER_VERSION
21-
- ./flutter/bin/flutter doctor
22-
script:
23-
- ./flutter/bin/flutter test
24-
cache:
25-
directories:
26-
- $HOME/.pub-cache
2+
global:
3+
# Android
4+
- API=28
5+
- ABI=x86_64
6+
- G_SERVICES=default
7+
- ANDROID_TOOLS=4333796 # android-28
8+
# Flutter
9+
- FLUTTER_CHANNEL=stable
10+
- FLUTTER_VERSION=1.9.1+hotfix.6-${FLUTTER_CHANNEL}
11+
# Path
12+
- ANDROID_HOME=${HOME}/android-sdk-linux
13+
- TOOLS=${ANDROID_HOME}/tools
14+
- PATH=${ANDROID_HOME}:${ANDROID_HOME}/emulator:${TOOLS}:${TOOLS}/bin:${ANDROID_HOME}/platform-tools:${PATH}
15+
- JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
16+
- PATH="$JAVA_HOME/bin:$PATH"
17+
- FLUTTER_HOME=${HOME}/flutter
18+
- PATH=${HOME}/.pub-cache/bin:${PATH}
19+
- PATH=${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin:${PATH}
20+
21+
jobs:
22+
include:
23+
- stage: iOS Tests
24+
os: osx
25+
language: objective-c
26+
osx_image: xcode11
27+
git:
28+
depth: 3
29+
before_script:
30+
- open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
31+
# - brew update
32+
- brew install libimobiledevice
33+
- brew install ideviceinstaller
34+
- brew install ios-deploy
35+
- sudo gem install cocoapods
36+
# - git clone https://github.com/flutter/flutter.git -b beta
37+
- export PATH="$PATH":"$HOME/.pub-cache/bin"
38+
- export PATH=`pwd`/flutter/bin:`pwd`/flutter/bin/cache/dart-sdk/bin:$PATH
39+
# - flutter precache
40+
# - flutter doctor -v
41+
# - flutter devices
42+
# - flutter packages get
43+
44+
- if [ ! -f $HOME/flutter/bin/flutter ] ; then
45+
git clone https://github.com/flutter/flutter.git $FLUTTER_HOME -b beta;
46+
flutter pub get;
47+
fi
48+
49+
50+
# - flutter packages pub run build_runner build --delete-conflicting-outputs
51+
- cd example
52+
script:
53+
- ./test_driver/run_tests.sh iPhone X
54+
cache:
55+
directories:
56+
- $HOME/.pub-cache
57+
- flutter
58+
branches:
59+
only:
60+
- bodnar/19570/tests
61+
62+
63+
- stage: Android Tests
64+
os: linux
65+
dist: bionic
66+
language: shell
67+
git:
68+
depth: 3
69+
70+
71+
72+
cache:
73+
directories:
74+
- $HOME/.gradle/caches/
75+
- $HOME/.gradle/wrapper/
76+
- $HOME/.pub-cache
77+
- flutter
78+
79+
branches:
80+
only:
81+
- bodnar/19570/tests
82+
83+
before_cache:
84+
- rm -rf $HOME/.gradle/caches/[1-9]*
85+
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
86+
87+
addons:
88+
apt:
89+
packages:
90+
- libvirt-bin
91+
- bridge-utils
92+
- openjdk-8-jdk-headless
93+
94+
install:
95+
# Android tools
96+
- curl -L "https://dl.google.com/android/repository/sdk-tools-linux-$ANDROID_TOOLS.zip" -o $HOME/tools.zip
97+
- unzip -oq $HOME/tools.zip -d ${ANDROID_HOME}
98+
99+
# Accept licenses before installing components, no need to echo y for each component
100+
- yes | sdkmanager --licenses
101+
102+
# Download SDK tools
103+
- sdkmanager "tools" >/dev/null
104+
- sdkmanager "platform-tools" >/dev/null
105+
- sdkmanager "emulator" >/dev/null
106+
- sdkmanager "platforms;android-$API" >/dev/null # We need the API of the emulator we will run
107+
- sdkmanager "system-images;android-$API;$G_SERVICES;$ABI" >/dev/null # install system images for emulator
108+
109+
- sudo adduser $USER libvirt
110+
111+
# Define emulator parameters
112+
- EMU_PARAMS="
113+
-avd test
114+
-no-audio
115+
-no-window
116+
-no-accel
117+
-gpu swiftshader_indirect
118+
-no-boot-anim
119+
-camera-back none
120+
-camera-front none"
121+
122+
# Create and start emulator as early as possible
123+
- adb start-server
124+
- avdmanager create avd --force --name test --package "system-images;android-$API;$G_SERVICES;$ABI" --abi $ABI --device 'Nexus 4' --sdcard 128M
125+
- $ANDROID_HOME/emulator/emulator ${EMU_PARAMS} &
126+
127+
# Install other required tools:
128+
- sdkmanager "build-tools;28.0.3" >/dev/null # Implicit gradle dependency - gradle drives changes
129+
- sdkmanager "platforms;android-28" >/dev/null # We need the API of the current compileSdkVersion from gradle.properties
130+
- sdkmanager "extras;android;m2repository" >/dev/null
131+
132+
# Install flutter (while emulator is starting)
133+
- sudo apt-get install -y --no-install-recommends lib32stdc++6 libstdc++6 > /dev/null
134+
- if [ ! -f $HOME/flutter/bin/flutter ] ; then
135+
git clone https://github.com/flutter/flutter.git $FLUTTER_HOME -b beta;
136+
flutter pub get;
137+
fi
138+
# - wget --quiet --output-document=flutter.tar.xz https://storage.googleapis.com/flutter_infra/releases/${FLUTTER_CHANNEL}/linux/flutter_linux_v${FLUTTER_VERSION}.tar.xz
139+
# - tar xf flutter.tar.xz -C $(dirname ${FLUTTER_HOME})
140+
# - rm flutter.tar.xz
141+
142+
# Download the script to wait for emulator
143+
- curl -L https://raw.githubusercontent.com/travis-ci/travis-cookbooks/master/community-cookbooks/android-sdk/files/default/android-wait-for-emulator -o $HOME/bin/android-wait-for-emulator
144+
- chmod +x $HOME/bin/android-wait-for-emulator
145+
- chmod -R +x $FLUTTER_HOME
146+
147+
before_script:
148+
# Wait for emulator to finish startup
149+
- android-wait-for-emulator
150+
# Unlock screen
151+
- adb shell input keyevent 82 &
152+
153+
script:
154+
- cd example
155+
- ./test_driver/run_tests.sh emulator-5554
156+
157+
27158
notifications:
28159
email:
29-
30-
31-
branches:
32-
only: [develop]
160+

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 1.0.0
2+
3+
* Bump to released version
4+
* Added integration tests
5+
* Fixes and optimizations
6+
17
## 0.4.1
28

39
* Added `relationsPageSize` parameter to `DataQueryBuilder`

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Follow the steps below to get started with Backendless Flutter SDK:
1919
To use this plugin in your Flutter project, add `backendless_sdk` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/):
2020
```dart
2121
dependencies:
22-
backendless_sdk: ^0.4.0
22+
backendless_sdk: ^1.0.0
2323
```
2424
#### STEP 2. Import the Backendless SDK:
2525
Add the following import to your Dart code

android/src/main/java/com/backendless/backendless_sdk/BackendlessSdkPlugin.java

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.backendless.backendless_sdk.call_handlers.RtCallHandler;
1515
import com.backendless.backendless_sdk.call_handlers.UserServiceCallHandler;
1616
import com.backendless.backendless_sdk.common.FlutterBackendlessFCMService;
17+
import com.backendless.backendless_sdk.call_handlers.TestCallHandler;
1718
import com.backendless.backendless_sdk.utils.codec.BackendlessMessageCodec;
1819

1920
import io.flutter.plugin.common.MethodChannel;
@@ -77,5 +78,9 @@ public static void registerWith(Registrar registrar) {
7778

7879
final MethodChannel fcmServiceChannel = new MethodChannel(registrar.messenger(), "backendless/messaging/push");
7980
FlutterBackendlessFCMService.setMethodChannel(fcmServiceChannel);
81+
82+
final MethodChannel testChannel = new MethodChannel(registrar.messenger(), "backendless/test",
83+
new StandardMethodCodec(BackendlessMessageCodec.INSTANCE));
84+
testChannel.setMethodCallHandler(new TestCallHandler());
8085
}
8186
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.backendless.backendless_sdk.call_handlers;
2+
3+
import android.util.Log;
4+
5+
import com.backendless.Backendless;
6+
import com.backendless.async.callback.AsyncCallback;
7+
import com.backendless.async.callback.BackendlessCallback;
8+
import com.backendless.exceptions.BackendlessFault;
9+
import com.backendless.backendless_sdk.utils.FlutterCallback;
10+
// import com.backendless.files.FileInfo;
11+
// import com.backendless.geo.GeoCluster;
12+
// import com.backendless.geo.GeoPoint;
13+
// import com.backendless.geo.SearchMatchesResult;
14+
// import com.backendless.messaging.MessageStatus;
15+
// import com.backendless.messaging.PublishStatusEnum;
16+
// import com.backendless.persistence.DataQueryBuilder;
17+
// import com.backendless.persistence.LoadRelationsQueryBuilder;
18+
// import com.backendless.property.ObjectProperty;
19+
20+
// import java.util.Date;
21+
// import java.util.List;
22+
23+
import io.flutter.plugin.common.MethodCall;
24+
import io.flutter.plugin.common.MethodChannel;
25+
26+
public class TestCallHandler implements MethodChannel.MethodCallHandler {
27+
28+
public TestCallHandler() {
29+
30+
}
31+
32+
@Override
33+
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
34+
switch (call.method) {
35+
case "Backendless.test":
36+
testMethod(call, result);
37+
break;
38+
default:
39+
result.notImplemented();
40+
}
41+
}
42+
43+
private void testMethod(MethodCall call, MethodChannel.Result result) {
44+
Object value = call.argument("value");
45+
result.success(value);
46+
}
47+
}

android/src/main/java/com/backendless/backendless_sdk/utils/codec/BackendlessMessageCodec.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.backendless.messaging.MessageStatus;
2323
import com.backendless.messaging.PublishMessageInfo;
2424
import com.backendless.messaging.PublishOptions;
25+
import com.backendless.persistence.BackendlessDataQuery;
2526
import com.backendless.persistence.DataQueryBuilder;
2627
import com.backendless.persistence.LoadRelationsQueryBuilder;
2728
import com.backendless.property.ObjectProperty;
@@ -38,6 +39,7 @@
3839
import java.nio.ByteBuffer;
3940
import java.util.Arrays;
4041
import java.util.Date;
42+
import java.util.HashMap;
4143
import java.util.List;
4244
import java.util.Map;
4345

@@ -95,10 +97,28 @@ protected void writeValue(ByteArrayOutputStream stream, Object value) {
9597
writeValue(stream, objectMapper.convertValue(value, Map.class));
9698
} else if (value instanceof DataQueryBuilder) {
9799
stream.write(DATA_QUERY_BUILDER);
98-
writeValue(stream, objectMapper.convertValue(value, Map.class));
100+
Map<String, Object> result = new HashMap<>();
101+
BackendlessDataQuery dataQuery = ((DataQueryBuilder) value).build();
102+
result.put("pageSize", dataQuery.getPageSize());
103+
result.put("offset", dataQuery.getOffset());
104+
result.put("properties", dataQuery.getProperties());
105+
result.put("whereClause", dataQuery.getWhereClause());
106+
result.put("groupBy", dataQuery.getGroupBy());
107+
result.put("havingClause", dataQuery.getHavingClause());
108+
result.put("sortBy", dataQuery.getQueryOptions().getSortBy());
109+
result.put("related", dataQuery.getQueryOptions().getRelated());
110+
result.put("relationsDepth", dataQuery.getQueryOptions().getRelationsDepth());
111+
writeValue(stream, result);
99112
} else if (value instanceof LoadRelationsQueryBuilder) {
100113
stream.write(LOAD_RELATIONS_QUERY_BUILDER);
101-
writeValue(stream, objectMapper.convertValue(value, Map.class));
114+
Map<String, Object> result = new HashMap<>();
115+
BackendlessDataQuery dataQuery = ((LoadRelationsQueryBuilder) value).build();
116+
result.put("relationName", dataQuery.getQueryOptions().getRelated().get(0));
117+
result.put("pageSize", dataQuery.getPageSize());
118+
result.put("offset", dataQuery.getOffset());
119+
result.put("properties", dataQuery.getProperties());
120+
result.put("sortBy", dataQuery.getQueryOptions().getSortBy());
121+
writeValue(stream, result);
102122
} else if (value instanceof ObjectProperty) {
103123
stream.write(OBJECT_PROPERTY);
104124
writeValue(stream, objectMapper.convertValue(new ObjectPropertyMixin(value), Map.class));

android/src/main/java/com/backendless/backendless_sdk/utils/codec/mixins/DataQueryBuilderMixin.java

+3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.backendless.backendless_sdk.utils.codec.mixins;
22

33
import com.backendless.persistence.DataQueryBuilder;
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
45
import com.fasterxml.jackson.annotation.JsonProperty;
56

67
import java.util.List;
78

9+
10+
@JsonIgnoreProperties({"relationsPageSize"})
811
public abstract class DataQueryBuilderMixin {
912

1013
@JsonProperty("properties")

build.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ targets:
44
reflectable:
55
generate_for:
66
- example/lib/main.dart
7+
- example/test_driver/backendless_tests.dart
78
options:
89
formatted: true

example/android/app/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
2626

2727
android {
2828
compileSdkVersion 28
29+
buildToolsVersion "28.0.3"
2930

3031
lintOptions {
3132
disable 'InvalidPackage'

example/android/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
}
66

77
dependencies {
8-
classpath 'com.android.tools.build:gradle:3.2.1'
8+
classpath 'com.android.tools.build:gradle:3.5.3'
99
}
1010
}
1111

Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Fri Jun 23 08:50:38 CEST 2017
1+
#Tue Dec 17 23:40:01 EET 2019
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

0 commit comments

Comments
 (0)