SlideShare a Scribd company logo
1 of 77
Download to read offline
What’s New in Liferay
Mobile SDK 2.0 for Android
Silvio Santos, Mobile Lead Engineer
DEVCON | MODCONF 2016
2012
http://localhost:8080/api/jsonws
BUILD REQUEST
JSONObject command = new JSONObject();

String method = "/dlapp/add-folder";

JSONObject params = new JSONObject();



params.put("repositoryId", repositoryId);

params.put("parentFolderId", parentFolderId);

params.put("name", name);

params.put("description", description);



command.put(method, params);
DefaultHttpClient client = new DefaultHttpClient();



AuthScope authScope = new AuthScope(

AuthScope.ANY_HOST, AuthScope.ANY_PORT);



Credentials credentials = new
UsernamePasswordCredentials(

username, password);



client.getCredentialsProvider().setCredentials(

authScope, credentials);
CONFIGURE HTTP CLIENT
EXECUTE REQUEST
HttpPost post = new HttpPost(url);

post.setEntity(new StringEntity(command.toString()));



HttpResponse httpResponse = client.execute(post);



HttpEntity entity = httpResponse.getEntity();

String response = EntityUtils.toString(entity);
…handle exceptions
MOBILE SDK
2.0
WHAT’S NEW?
1. @NNOTATION BASED API
2. DEFAULT PARAMETERS
3. POJO AUTO PARSING
4. REQUEST CANCELATION
5. BETTER CONFIGURATION API
6. RxJAVA INTEGRATION
@NNOTATION
BASED API
CREATING API


public interface GroupService {





Call<JsonArray> getUserSites();



}
CREATING API
@Path("/group")

public interface GroupService {





Call<JsonArray> getUserSites();



}
CREATING API
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<JsonArray> getUserSites();



}
CREATING API
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<JsonArray> getUserSites();



}
INSTANTIATE SERVICE
GroupService service = ServiceBuilder.build(
GroupService.class);
INVOKE METHOD
Call<JsonArray> call = service.getUserSites();

JsonArray sites = call.execute();
INVOKE METHOD
Call<JsonArray> call = service.getUserSites();

JsonArray sites = call.execute();
ASYNC INVOKE METHOD
call.async(new Callback<JsonArray>() {

public void onFailure(Exception exception) {

}



public void onSuccess(JsonArray result) {

}
});
ASYNC INVOKE METHOD
call.async(new Callback<JsonArray>() {

public void onFailure(Exception exception) {

}



public void onSuccess(JsonArray result) {

}
});
PARAMETERS


Call<JsonObject> addFolder(

long repositoryId,

long parentId,

String name,
String description);
PARAMETERS
@Path("/add-folder")

Call<JsonObject> addFolder(

long repositoryId,

long parentId,

String name,
String description);
PARAMETERS
@Path("/add-folder")

Call<JsonObject> addFolder(

@Param(name = "repositoryId") long repositoryId,

@Param(name = "parentFolderId") long parentId,

@Param(name = "name") String name,
@Param(name = “description”) String description);
PARAMETERS
@Path("/add-folder")

Call<JsonObject> addFolder(

@Param(name = "repositoryId") long repositoryId,

@Param(name = "parentFolderId") long parentId,

@Param(name = "name") String name,
@Param(name = “description”) String description);
PARAMETERS
@Path("/add-folder")

Call<JsonObject> addFolder(

@Param(name = "repositoryId") long repositoryId,

@Param(name = "parentFolderId") long parentId,

@Param(name = "name") String name,
@Param(name = “description”) String description);
PARAMETERS
@Path("/add-folder")

Call<JsonObject> addFolder(

@Param(name = "repositoryId") long repositoryId,

@Param(name = "parentFolderId") long parentId,

@Param(name = "name") String name);
DEFAULT PARAMETERS
@Path("/add-folder")

@Params({

@Param(name = "description", value = "")

})

Call<JsonObject> addFolder(

@Param(name = "repositoryId") long repositoryId,

@Param(name = "parentFolderId") long parentId,

@Param(name = "name") String name);
DEFAULT PARAMETERS
@Path("/add-folder")

@Params({

@Param(name = "description", value = "")

})

Call<JsonObject> addFolder(

@Param(name = "repositoryId") long repositoryId,

@Param(name = “parentFolderId") long parentId,

@Param(name = "name") String name);
POJO
AUTO PARSING
POJO AUTO PARSING
public class Site {



boolean active;

long groupId;

String name;

String descriptiveName;



}
POJO AUTO PARSING
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<JsonArray> getUserSites();



}
POJO AUTO PARSING
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<JsonArray> getUserSites();



}
POJO AUTO PARSING
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<List<Site>> getUserSites();



}
CANCELLING
REQUESTS
CANCEL REQUESTS
Call<List<Site>> call = service.getUserSites();
call.async(new Callback<List<Site>>() {
public void onFailure(Exception exception) {

}

public void onSuccess(List<Site> sites) {

}
});
Call.cancel(call)
CANCEL REQUESTS
Call<List<Site>> call = service.getUserSites();
call.async(new Callback<List<Site>>() {
public void onFailure(Exception exception) {

}

public void onSuccess(List<Site> sites) {

}
});
Call.cancel(call)
BETTER REQUEST
CONFIGURATION
CONFIGURING REQUESTS
Config config = new Config.Builder(
“http://localhost:8080”)


.auth(new BasicAuthentication("login", "pwd"))

.header("headerKey", "headerValue")

.timeout(10000)

.build();



Config.global(config);
CONFIGURING REQUESTS
Config config = new Config.Builder(
“http://localhost:8080”)


.auth(new BasicAuthentication("login", "pwd"))

.header("headerKey", "headerValue")

.timeout(10000)

.build();



Config.global(config);
CONFIGURING REQUESTS
Config config = new Config.Builder(
“http://localhost:8080”)


.auth(new BasicAuthentication("login", "pwd"))

.header("headerKey", "headerValue")

.timeout(10000)

.build();



Config.global(config);
CONFIGURING REQUESTS
Config config = new Config.Builder(
“http://localhost:8080”)


.auth(new BasicAuthentication("login", "pwd"))

.header("headerKey", "headerValue")

.timeout(10000)

.build();



Config.global(config);
CONFIGURING REQUESTS
Config config = Config.global()

.newBuilder()

.header("key", "value")

.build();



Call<JsonArray> call = service.getUserSites();

JsonArray sites = call.execute(config);
CONFIGURING REQUESTS
Config config = Config.global()

.newBuilder()

.header("key", "value")

.build();



Call<JsonArray> call = service.getUserSites();

JsonArray sites = call.execute(config);
BATCH REQUESTS
BATCH REQUESTS


Call<User> call1 = service.getUserByEmailAddress(

20116, "test@liferay.com");



Call<User> call2 = service.getUserByEmailAddress(

20116, "devcon@liferay.com");



Response response = Batch.execute(call1, call2);
RxJava
Integration
RxJava
time
RxJava
1 32
data
RxJava
1 32
completed
RxJava
1 32
error
RxJava
1 32
Observable data stream
RxJava
1 32
Observable data stream
Subscribe
RxJAVA INTEGRATION
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<List<Site>> getUserSites();



}
RxJAVA INTEGRATION
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Call<List<Site>> getUserSites();



}
RxJAVA INTEGRATION
@Path("/group")

public interface GroupService {



@Path(“/get-user-sites-groups")

Observable<List<Site>> getUserSites();



}
RxJAVA INTEGRATION


getUserSites()

.subscribe(sites -> {

//new data event, do something

},

throwable -> {

//on error

});
RxJAVA INTEGRATION


getUserSites()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(sites -> {

},

throwable -> {

});
RxJAVA INTEGRATION


getUserSites()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(sites -> {

},

throwable -> {

});
RxJAVA OPERATORS
map
filter
concat
zip
cache
debounce
MAP
map(x -> x + 1)
1 32
2 43
FILTER
filter(x -> x > 1)
1 32
32
CONCAT
concat
1 32
54
321 4 5
RxJAVA INTEGRATION


Observable.concat(dbSitesObservable, getUserSites())

.first()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(sites -> {

},

throwable -> {

});
RxJAVA INTEGRATION


Observable.concat(dbSitesObservable, getUserSites())

.first()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(sites -> {

},

throwable -> {

});
RxJAVA INTEGRATION


Observable.concat(dbSitesObservable, getUserSites())

.first()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(sites -> {

},

throwable -> {

});
RxJAVA INTEGRATION


Observable.concat(dbSitesObservable, getUserSites())

.first()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(sites -> {

},

throwable -> {

});
JVM
COMPATIBLE
Thanks!
DEVCON | MODCONF 2016
t @sgosantos
silvio.santos@liferay.com

More Related Content

What's hot

Morphia: Simplifying Persistence for Java and MongoDB
Morphia:  Simplifying Persistence for Java and MongoDBMorphia:  Simplifying Persistence for Java and MongoDB
Morphia: Simplifying Persistence for Java and MongoDBJeff Yemin
 
Webinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and MorphiaWebinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and MorphiaMongoDB
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Kiyotaka Oku
 
MongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
JavaScript Proxy (ES6)
JavaScript Proxy (ES6)JavaScript Proxy (ES6)
JavaScript Proxy (ES6)Aries Cs
 
Writing Swift code with great testability
Writing Swift code with great testabilityWriting Swift code with great testability
Writing Swift code with great testabilityJohn Sundell
 
Top 10 F5 iRules to migrate to a modern load balancing platform
Top 10 F5 iRules to migrate to a modern load balancing platformTop 10 F5 iRules to migrate to a modern load balancing platform
Top 10 F5 iRules to migrate to a modern load balancing platformAvi Networks
 
Cascading Through Hadoop for the Boulder JUG
Cascading Through Hadoop for the Boulder JUGCascading Through Hadoop for the Boulder JUG
Cascading Through Hadoop for the Boulder JUGMatthew McCullough
 
What do you mean, Backwards Compatibility?
What do you mean, Backwards Compatibility?What do you mean, Backwards Compatibility?
What do you mean, Backwards Compatibility?Trisha Gee
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsRoss Tuck
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm OldRoss Tuck
 
Grails - The search is over
Grails - The search is overGrails - The search is over
Grails - The search is overFelipe Coutinho
 
Grails: The search is over
Grails: The search is overGrails: The search is over
Grails: The search is overAécio Costa
 

What's hot (20)

Morphia: Simplifying Persistence for Java and MongoDB
Morphia:  Simplifying Persistence for Java and MongoDBMorphia:  Simplifying Persistence for Java and MongoDB
Morphia: Simplifying Persistence for Java and MongoDB
 
Webinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and MorphiaWebinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and Morphia
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介
 
MongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() Output
 
Realm to Json & Royal
Realm to Json & RoyalRealm to Json & Royal
Realm to Json & Royal
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
JavaScript Proxy (ES6)
JavaScript Proxy (ES6)JavaScript Proxy (ES6)
JavaScript Proxy (ES6)
 
Writing Swift code with great testability
Writing Swift code with great testabilityWriting Swift code with great testability
Writing Swift code with great testability
 
Top 10 F5 iRules to migrate to a modern load balancing platform
Top 10 F5 iRules to migrate to a modern load balancing platformTop 10 F5 iRules to migrate to a modern load balancing platform
Top 10 F5 iRules to migrate to a modern load balancing platform
 
Cascading Through Hadoop for the Boulder JUG
Cascading Through Hadoop for the Boulder JUGCascading Through Hadoop for the Boulder JUG
Cascading Through Hadoop for the Boulder JUG
 
What do you mean, Backwards Compatibility?
What do you mean, Backwards Compatibility?What do you mean, Backwards Compatibility?
What do you mean, Backwards Compatibility?
 
php plus mysql
php plus mysqlphp plus mysql
php plus mysql
 
quick json parser
quick json parserquick json parser
quick json parser
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
Hack ASP.NET website
Hack ASP.NET websiteHack ASP.NET website
Hack ASP.NET website
 
はじめてのGroovy
はじめてのGroovyはじめてのGroovy
はじめてのGroovy
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm Old
 
Grails - The search is over
Grails - The search is overGrails - The search is over
Grails - The search is over
 
Grails: The search is over
Grails: The search is overGrails: The search is over
Grails: The search is over
 
groovy & grails - lecture 3
groovy & grails - lecture 3groovy & grails - lecture 3
groovy & grails - lecture 3
 

Similar to What's new in Liferay Mobile SDK 2.0 for Android

Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Oliver Gierke
 
An introduction into Spring Data
An introduction into Spring DataAn introduction into Spring Data
An introduction into Spring DataOliver Gierke
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTruls Jørgensen
 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaMongoDB
 
Legacy applications - 4Developes konferencja, Piotr Pasich
Legacy applications  - 4Developes konferencja, Piotr PasichLegacy applications  - 4Developes konferencja, Piotr Pasich
Legacy applications - 4Developes konferencja, Piotr PasichPiotr Pasich
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceMaarten Balliauw
 
Javaone 2010
Javaone 2010Javaone 2010
Javaone 2010Hien Luu
 
Unsafe JAX-RS: Breaking REST API
Unsafe JAX-RS: Breaking REST APIUnsafe JAX-RS: Breaking REST API
Unsafe JAX-RS: Breaking REST APIMikhail Egorov
 
XamarinとAWSをつないでみた話
XamarinとAWSをつないでみた話XamarinとAWSをつないでみた話
XamarinとAWSをつないでみた話Takehito Tanabe
 
can do this in java please thanks in advance The code that y.pdf
can do this in java please thanks in advance The code that y.pdfcan do this in java please thanks in advance The code that y.pdf
can do this in java please thanks in advance The code that y.pdfakshpatil4
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code genkoji lin
 
Demoiselle Spatial Latinoware 2011
Demoiselle Spatial Latinoware 2011Demoiselle Spatial Latinoware 2011
Demoiselle Spatial Latinoware 2011Rafael Soto
 
Тарас Олексин - Sculpt! Your! Tests!
Тарас Олексин  - Sculpt! Your! Tests!Тарас Олексин  - Sculpt! Your! Tests!
Тарас Олексин - Sculpt! Your! Tests!DataArt
 
Best of build 2021 - C# 10 & .NET 6
Best of build 2021 -  C# 10 & .NET 6Best of build 2021 -  C# 10 & .NET 6
Best of build 2021 - C# 10 & .NET 6Moaid Hathot
 
The state of your own hypertext preprocessor
The state of your own hypertext preprocessorThe state of your own hypertext preprocessor
The state of your own hypertext preprocessorAlessandro Nadalin
 

Similar to What's new in Liferay Mobile SDK 2.0 for Android (20)

Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!
 
An introduction into Spring Data
An introduction into Spring DataAn introduction into Spring Data
An introduction into Spring Data
 
Jersey
JerseyJersey
Jersey
 
Android and REST
Android and RESTAndroid and REST
Android and REST
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with Morphia
 
Legacy applications - 4Developes konferencja, Piotr Pasich
Legacy applications  - 4Developes konferencja, Piotr PasichLegacy applications  - 4Developes konferencja, Piotr Pasich
Legacy applications - 4Developes konferencja, Piotr Pasich
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
 
Javaone 2010
Javaone 2010Javaone 2010
Javaone 2010
 
Unsafe JAX-RS: Breaking REST API
Unsafe JAX-RS: Breaking REST APIUnsafe JAX-RS: Breaking REST API
Unsafe JAX-RS: Breaking REST API
 
Ajax - a quick introduction
Ajax - a quick introductionAjax - a quick introduction
Ajax - a quick introduction
 
XamarinとAWSをつないでみた話
XamarinとAWSをつないでみた話XamarinとAWSをつないでみた話
XamarinとAWSをつないでみた話
 
OWASP Proxy
OWASP ProxyOWASP Proxy
OWASP Proxy
 
can do this in java please thanks in advance The code that y.pdf
can do this in java please thanks in advance The code that y.pdfcan do this in java please thanks in advance The code that y.pdf
can do this in java please thanks in advance The code that y.pdf
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
 
Demoiselle Spatial Latinoware 2011
Demoiselle Spatial Latinoware 2011Demoiselle Spatial Latinoware 2011
Demoiselle Spatial Latinoware 2011
 
Тарас Олексин - Sculpt! Your! Tests!
Тарас Олексин  - Sculpt! Your! Tests!Тарас Олексин  - Sculpt! Your! Tests!
Тарас Олексин - Sculpt! Your! Tests!
 
Best of build 2021 - C# 10 & .NET 6
Best of build 2021 -  C# 10 & .NET 6Best of build 2021 -  C# 10 & .NET 6
Best of build 2021 - C# 10 & .NET 6
 
The state of your own hypertext preprocessor
The state of your own hypertext preprocessorThe state of your own hypertext preprocessor
The state of your own hypertext preprocessor
 
Jena framework
Jena frameworkJena framework
Jena framework
 

Recently uploaded

Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Pooja Nehwal
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceanilsa9823
 
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...wyqazy
 
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...Niamh verma
 
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝soniya singh
 
9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7Pooja Nehwal
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceanilsa9823
 

Recently uploaded (7)

Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
 
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
 
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
 
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
 
9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
 

What's new in Liferay Mobile SDK 2.0 for Android