SlideShare a Scribd company logo
FROM GRAILS TO ANDROID
A SIMPLE JOURNEY
GRAILS
@BRWNGRLDEV
ANDROID
@BRWNGRLDEV
OVERVIEW
@BRWNGRLDEV
OVERVIEW
▸Project Structure
@BRWNGRLDEV
OVERVIEW
▸Project Structure
▸User Interface
@BRWNGRLDEV
OVERVIEW
▸Project Structure
▸User Interface
▸Dependency Injection
@BRWNGRLDEV
OVERVIEW
▸Project Structure
▸User Interface
▸Dependency Injection
▸Persistence
@BRWNGRLDEV
PROJECT STRUCTURE
@BRWNGRLDEV
GRAILS APP STRUCTURE
grails create-app
@BRWNGRLDEV
GRAILS APP STRUCTURE
grails create-app
@BRWNGRLDEV
GRAILS APP STRUCTURE
@BRWNGRLDEV
ANDROID APP STRUCTURE
@BRWNGRLDEV
ANDROID APP STRUCTURE
@BRWNGRLDEV
ANDROID APP STRUCTURE
@BRWNGRLDEV
▸app directory
ANDROID APP STRUCTURE
@BRWNGRLDEV
▸app directory
▸test directories
ANDROID APP STRUCTURE
@BRWNGRLDEV
▸app directory
▸test directories
▸gradle wrapper
ANDROID APP STRUCTURE
@BRWNGRLDEV
ANDROID APP STRUCTURE
@BRWNGRLDEV
most source code
ANDROID APP STRUCTURE
@BRWNGRLDEV
images
ANDROID APP STRUCTURE
@BRWNGRLDEV
views
ANDROID APP STRUCTURE
@BRWNGRLDEV
launcher icons
LAUNCHER ICONS
@BRWNGRLDEV
https://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html
ANDROID APP STRUCTURE
@BRWNGRLDEV
strings, colors, sizes, etc.
DOMAIN MODELS
@BRWNGRLDEV
GRAILS DOMAIN CLASS
@BRWNGRLDEV
GRAILS DOMAIN CLASS
@BRWNGRLDEV
▸BookSpec
▸BookController
▸BookControllerSpec
▸/book/edit.gsp
▸/book/create.gsp
▸/book/index.gsp
▸/book/show.gsp
ANDROID DOMAIN CLASS
@BRWNGRLDEV
ANDROID DOMAIN CLASS
@BRWNGRLDEV
▸Book
ANDROID DOMAIN CLASS
@BRWNGRLDEV
▸Book
ANDROID DOMAIN CLASS
@BRWNGRLDEV
ANDROID DOMAIN CLASS
@BRWNGRLDEV
ANDROID DOMAIN CLASS
@BRWNGRLDEV
MVP
ANDROID DOMAIN CLASS
@BRWNGRLDEV
▸BookTest
▸BookPresenter
▸BookPresenterTest
▸BookView
▸BookActivity
▸BookActivityTest
▸activity_book.xml
▸activity_insert_update_book.xml
@BRWNGRLDEV
CONFIGURATION
@BRWNGRLDEV
GRAILS - BUILD.GRADLE
@BRWNGRLDEV
GRAILS - BUILD.GRADLE
@BRWNGRLDEV
ANDROID - BUILD.GRADLE
@BRWNGRLDEV
ANDROID - BUILD.GRADLE
@BRWNGRLDEV
ANDROID - BUILD.GRADLE
@BRWNGRLDEV
GRADLE COMMANDS
@BRWNGRLDEV
▸gradle tasks
▸gradle clean
▸gradle test
▸gradle assemble
GRADLE COMMANDS
@BRWNGRLDEV
▸gradle tasks
▸gradle clean
▸gradle test
▸gradle assemble
PROJECT STRUCTURE
@BRWNGRLDEV
▸Folder layout
▸Domain models
▸Gradle Configuration
@BRWNGRLDEV
USER INTERFACE
@BRWNGRLDEV
GRAILS UI
@BRWNGRLDEV
GRAILS GSP PAGE
@BRWNGRLDEV
GRAILS GSP PAGE
@BRWNGRLDEV
GRAILS GSP PAGE
@BRWNGRLDEV
GRAILS GSP PAGE
@BRWNGRLDEV
GRAILS GSP PAGE
@BRWNGRLDEV
<f:display bean=“book”/>
ANDROID UI
@BRWNGRLDEV
ANDROID UI
@BRWNGRLDEV
@BRWNGRLDEV
XML?!
ARE YOU KIDDING ME?!!!
@BRWNGRLDEV
XML?!
ARE YOU KIDDING ME?!!!
@BRWNGRLDEV
XML?!
ARE YOU KIDDING ME?!!!
@BRWNGRLDEV
XML?!
ARE YOU KIDDING ME?!!!
ANDROID LAYOUT GUI
@BRWNGRLDEV
ANDROID LAYOUT GUI
@BRWNGRLDEV
ANDROID LAYOUT GUI
@BRWNGRLDEV
ANDROID XML LAYOUT
@BRWNGRLDEV
ANDROID XML LAYOUT
@BRWNGRLDEV
ANDROID XML LAYOUT
@BRWNGRLDEV
ANDROID XML LAYOUT
@BRWNGRLDEV
STYLE & SIZE RESOURCES
@BRWNGRLDEV
STYLE & SIZE RESOURCES
@BRWNGRLDEV
STYLE & SIZE RESOURCES
@BRWNGRLDEV
STYLE & SIZE RESOURCES
@BRWNGRLDEV
STYLE & SIZE RESOURCES
@BRWNGRLDEV
▸colors
▸styles
▸strings
▸sizes
▸themes
STYLE & SIZE RESOURCES
@BRWNGRLDEV
strings, colors, sizes, etc.
https://www.flickr.com/photos/bionicteaching/14668480106
https://developer.android.com/training/basics/supporting-devices/screens.html
DEVELOPER DOCS
@BRWNGRLDEV
USER INTERFACE
@BRWNGRLDEV
▸GSP pages
▸XML layout
▸Resource folders
@BRWNGRLDEV
DEPENDENCY INJECTION
@BRWNGRLDEV
DEPENDENCY INJECTION
@BRWNGRLDEV
THE CLIENT DELEGATES TO EXTERNAL CODE
(THE INJECTOR) THE RESPONSIBILITY OF
PROVIDING ITS DEPENDENCIES.
https://en.wikipedia.org/wiki/Dependency_injection
GRAILS - DEPENDENCY INJECTION
@BRWNGRLDEV
GRAILS - DEPENDENCY INJECTION
@BRWNGRLDEV
GRAILS - DEPENDENCY INJECTION
@BRWNGRLDEV
GRAILS - DEPENDENCY INJECTION
@BRWNGRLDEV
ANDROID - SIMPLE APPROACH
@BRWNGRLDEV
public class Injector {
}
ANDROID - SIMPLE APPROACH
@BRWNGRLDEV
public class Injector {
private static BookService bookService;
}
ANDROID - SIMPLE APPROACH
@BRWNGRLDEV
public class Injector {
private static BookService bookService;
public static BookService provideBookService () {

if ( bookService == null ) {

bookService = new BookService();

}

return bookService;

}
}
ANDROID - SIMPLE APPROACH
@BRWNGRLDEV
public class Activity {
private BooksPresenter booksPresenter;
@Override

protected void onCreate (Bundle savedInstanceState) {

…
booksPresenter = new BooksPresenter( Injector.provideBookService() );
}
}
ANDROID - DAGGER
@BRWNGRLDEV
http://google.github.io/dagger/
ANDROID - DAGGER
@BRWNGRLDEV
public class BooksPresenter {
private final BookService bookService;
}
ANDROID - DAGGER
@BRWNGRLDEV
public class BooksPresenter {
private final BookService bookService;
@Inject
BooksPresenter(BookService bookService) {
this.bookService = bookService;
}
}
ANDROID - DAGGER
@BRWNGRLDEV
@Module
public class AppModule {
}
ANDROID - DAGGER
@BRWNGRLDEV
@Module
public class AppModule {
@Provides @Singleton
BookService provideBookService() {
return new BookService();
}
}
ANDROID - DAGGER
@BRWNGRLDEV
@Provides @Singleton
BookService provideBookService() {
return new BookService();
}
@Inject
BooksPresenter(BookService bookService) {
this.bookService = bookService;
}
DEPENDENCY INJECTION
@BRWNGRLDEV
▸Spring
▸Simple Injector
▸Dagger
@BRWNGRLDEV
PERSISTENCE
@BRWNGRLDEV
@BRWNGRLDEV
http://gorm.grails.org/latest/
@BRWNGRLDEV
GORM
def book = new Book(title: ‘Clean Code’)
book.save()
@BRWNGRLDEV
GORM
def book = new Book(title: ‘Clean Code’)
book.save()
def book = Book.findByTitle(‘Clean Code’)
println book
@BRWNGRLDEV
GORM
def book = new Book(title: ‘Clean Code’)
book.save()
def book = Book.findByTitle(‘Clean Code’)
println book
def book = Book.get(1)
book.delete()
https://developer.android.com/training/basics/data-storage/databases.html
ANDROID
@BRWNGRLDEV
https://developer.android.com/training/basics/data-storage/databases.html
ANDROID
@BRWNGRLDEV
SQLITE
@BRWNGRLDEV
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLITE
@BRWNGRLDEV
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NAME_TITLE, title);
SQLITE
@BRWNGRLDEV
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NAME_TITLE, title);
db.insert( TABLE_NAME,
null,
values);
SQLITE VS. GORM
@BRWNGRLDEV
SQLiteDatabase db =
dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NAME_TITLE, title);
db.insert( TABLE_NAME,
null,
values);
def book = new Book(title: ‘Clean Code’)
book.save()
REALM
@BRWNGRLDEV
http://realm.io
REALM
@BRWNGRLDEV
REALM
@BRWNGRLDEV
▸Easy to Set Up
REALM
@BRWNGRLDEV
▸Easy to Set Up
▸Faster than ORMs
REALM
@BRWNGRLDEV
▸Easy to Set Up
▸Faster than ORMs
▸Has a Fluent API
REALM - CREATING A RECORD
@BRWNGRLDEV
realm.executeTransaction( new Realm.Transaction()

{

@Override

public void execute (Realm realm)

{

Book book = realm.createObject(Book.class);
book.setTitle(“Clean Code");

}

} );
REALM - CREATING A RECORD
@BRWNGRLDEV
realm.executeTransaction( new Realm.Transaction()

{

@Override

public void execute (Realm realm)

{

Book book = realm.createObject(Book.class);
book.setTitle(“Clean Code");

}

} );
REALM - QUERY
@BRWNGRLDEV
RealmResults<Book> results = realm.where(Book.class)
.equalTo("title", “Clean Code")
.or()
.equalTo("title", “Clean Codez")
.findAll();
REALM - QUERY
@BRWNGRLDEV
RealmResults<Book> results = realm.where(Book.class)
.equalTo("title", “Clean Code")
.or()
.equalTo("title", “Clean Codez")
.findAll();
REALM - CHANGE LISTENERS
@BRWNGRLDEV
bookListener = new RealmChangeListener() {
@Override
public void onChange(Book book) {
// make changes
}};
REALM - CHANGE LISTENERS
@BRWNGRLDEV
bookListener = new RealmChangeListener() {
@Override
public void onChange(Book book) {
// make changes
}};
book = realm.where(Book.class).equalTo("id", 1).findFirst();
book.addChangeListener(bookListener);
PERSISTENCE
@BRWNGRLDEV
▸GORM
▸Sqlite
▸Realm
@BRWNGRLDEV
SUMMARY
@BRWNGRLDEV
SUMMARY
▸Project Structure
@BRWNGRLDEV
SUMMARY
▸Project Structure
▸User Interface
@BRWNGRLDEV
SUMMARY
▸Project Structure
▸User Interface
▸Dependency Injection
@BRWNGRLDEV
SUMMARY
▸Project Structure
▸User Interface
▸Dependency Injection
▸Persistence
@BRWNGRLDEV
KEY TAKEAWAY
@BRWNGRLDEV
KEY TAKEAWAY
@BRWNGRLDEV
ANDROID IS REALLY HARD!
KEY TAKEAWAY
@BRWNGRLDEV
ANDROID IS REALLY HARD!
FUN
THANKS!
@brwngrldev
+AnnyceDavis
www.adavis.info
@BRWNGRLDEV

More Related Content

Viewers also liked

Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truth
Mario García
 
Greach 2016 dockerize your grails
Greach 2016   dockerize your grailsGreach 2016   dockerize your grails
Greach 2016 dockerize your grails
Iván López Martín
 
Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016
Alvaro Sanchez-Mariscal
 
Continuous Delivery As Code
Continuous Delivery As CodeContinuous Delivery As Code
Continuous Delivery As Code
Alex Soto
 
Reactive Streams and the Wide World of Groovy
Reactive Streams and the Wide World of GroovyReactive Streams and the Wide World of Groovy
Reactive Streams and the Wide World of Groovy
Steve Pember
 
Grooscript and Grails 3
Grooscript and Grails 3Grooscript and Grails 3
Grooscript and Grails 3
Jorge Franco Leza
 

Viewers also liked (6)

Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truth
 
Greach 2016 dockerize your grails
Greach 2016   dockerize your grailsGreach 2016   dockerize your grails
Greach 2016 dockerize your grails
 
Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016
 
Continuous Delivery As Code
Continuous Delivery As CodeContinuous Delivery As Code
Continuous Delivery As Code
 
Reactive Streams and the Wide World of Groovy
Reactive Streams and the Wide World of GroovyReactive Streams and the Wide World of Groovy
Reactive Streams and the Wide World of Groovy
 
Grooscript and Grails 3
Grooscript and Grails 3Grooscript and Grails 3
Grooscript and Grails 3
 

Similar to From Grails to Android: A Simple Journey

Vaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UIVaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UI
Peter Lehto
 
Getting started with building your own standalone Gradle plugin
Getting started with building your own standalone Gradle pluginGetting started with building your own standalone Gradle plugin
Getting started with building your own standalone Gradle plugin
tobiaspreuss
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android InfrastructureC.T.Co
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android InfrastructureAlexey Buzdin
 
Creating Gradle Plugins
Creating Gradle PluginsCreating Gradle Plugins
Creating Gradle Plugins
Annyce Davis
 
Android architecture
Android architecture Android architecture
Android architecture
Trong-An Bui
 
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Suzzicks
 
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
MobileMoxie
 
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
MobileMoxie
 
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Suzzicks
 
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android
Jun Liu
 
Native Android Development Practices
Native Android Development PracticesNative Android Development Practices
Native Android Development Practices
Roy Clarkson
 
From iOS to Android
From iOS to AndroidFrom iOS to Android
From iOS to Android
Jose Manuel Ortega Candel
 
Ruby conf2012
Ruby conf2012Ruby conf2012
Ruby conf2012
Chandan Jog
 
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Nicolas HAAN
 
Predictable Web Apps with Angular and Redux
Predictable Web Apps with Angular and ReduxPredictable Web Apps with Angular and Redux
Predictable Web Apps with Angular and Redux
FITC
 
Quick look at Design Patterns in Android Development
Quick look at Design Patterns in Android DevelopmentQuick look at Design Patterns in Android Development
Quick look at Design Patterns in Android Development
Constantine Mars
 
Refactoring Wunderlist. UA Mobile 2016.
Refactoring Wunderlist. UA Mobile 2016.Refactoring Wunderlist. UA Mobile 2016.
Refactoring Wunderlist. UA Mobile 2016.
UA Mobile
 
Coding Your Way to Java 12
Coding Your Way to Java 12Coding Your Way to Java 12
Coding Your Way to Java 12
Sander Mak (@Sander_Mak)
 

Similar to From Grails to Android: A Simple Journey (20)

Vaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UIVaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UI
 
Getting started with building your own standalone Gradle plugin
Getting started with building your own standalone Gradle pluginGetting started with building your own standalone Gradle plugin
Getting started with building your own standalone Gradle plugin
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Creating Gradle Plugins
Creating Gradle PluginsCreating Gradle Plugins
Creating Gradle Plugins
 
Android architecture
Android architecture Android architecture
Android architecture
 
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
 
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015
 
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
 
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015
 
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android
 
Native Android Development Practices
Native Android Development PracticesNative Android Development Practices
Native Android Development Practices
 
From iOS to Android
From iOS to AndroidFrom iOS to Android
From iOS to Android
 
Ruby conf2012
Ruby conf2012Ruby conf2012
Ruby conf2012
 
OpenMIC March-2012.phonegap
OpenMIC March-2012.phonegapOpenMIC March-2012.phonegap
OpenMIC March-2012.phonegap
 
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
 
Predictable Web Apps with Angular and Redux
Predictable Web Apps with Angular and ReduxPredictable Web Apps with Angular and Redux
Predictable Web Apps with Angular and Redux
 
Quick look at Design Patterns in Android Development
Quick look at Design Patterns in Android DevelopmentQuick look at Design Patterns in Android Development
Quick look at Design Patterns in Android Development
 
Refactoring Wunderlist. UA Mobile 2016.
Refactoring Wunderlist. UA Mobile 2016.Refactoring Wunderlist. UA Mobile 2016.
Refactoring Wunderlist. UA Mobile 2016.
 
Coding Your Way to Java 12
Coding Your Way to Java 12Coding Your Way to Java 12
Coding Your Way to Java 12
 

More from Annyce Davis

Getting a Grip on GraphQL
Getting a Grip on GraphQLGetting a Grip on GraphQL
Getting a Grip on GraphQL
Annyce Davis
 
RxJava In Baby Steps
RxJava In Baby StepsRxJava In Baby Steps
RxJava In Baby Steps
Annyce Davis
 
No internet? No Problem!
No internet? No Problem!No internet? No Problem!
No internet? No Problem!
Annyce Davis
 
First Do No Harm - 360|AnDev
First Do No Harm - 360|AnDevFirst Do No Harm - 360|AnDev
First Do No Harm - 360|AnDev
Annyce Davis
 
First Do No Harm - Droidcon Boston
First Do No Harm - Droidcon BostonFirst Do No Harm - Droidcon Boston
First Do No Harm - Droidcon Boston
Annyce Davis
 
Creating Gradle Plugins - Oredev
Creating Gradle Plugins - OredevCreating Gradle Plugins - Oredev
Creating Gradle Plugins - Oredev
Annyce Davis
 
Developing Apps for Emerging Markets
Developing Apps for Emerging MarketsDeveloping Apps for Emerging Markets
Developing Apps for Emerging Markets
Annyce Davis
 
Develop Maintainable Apps - edUiConf
Develop Maintainable Apps - edUiConfDevelop Maintainable Apps - edUiConf
Develop Maintainable Apps - edUiConf
Annyce Davis
 
Creating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf USCreating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf US
Annyce Davis
 
Google I/O 2016 Recap
Google I/O 2016 RecapGoogle I/O 2016 Recap
Google I/O 2016 Recap
Annyce Davis
 
Say It With Video
Say It With VideoSay It With Video
Say It With Video
Annyce Davis
 
Screen Robots: UI Tests in Espresso
Screen Robots: UI Tests in EspressoScreen Robots: UI Tests in Espresso
Screen Robots: UI Tests in Espresso
Annyce Davis
 
Static Code Analysis
Static Code AnalysisStatic Code Analysis
Static Code Analysis
Annyce Davis
 
Develop Maintainable Apps
Develop Maintainable AppsDevelop Maintainable Apps
Develop Maintainable Apps
Annyce Davis
 
Android Testing, Why So Hard?!
Android Testing, Why So Hard?!Android Testing, Why So Hard?!
Android Testing, Why So Hard?!
Annyce Davis
 
Measuring Audience Engagement through Analytics
Measuring Audience Engagement through AnalyticsMeasuring Audience Engagement through Analytics
Measuring Audience Engagement through Analytics
Annyce Davis
 
DC Media Innovations Kick-Off Meetup
DC Media Innovations Kick-Off MeetupDC Media Innovations Kick-Off Meetup
DC Media Innovations Kick-Off Meetup
Annyce Davis
 

More from Annyce Davis (17)

Getting a Grip on GraphQL
Getting a Grip on GraphQLGetting a Grip on GraphQL
Getting a Grip on GraphQL
 
RxJava In Baby Steps
RxJava In Baby StepsRxJava In Baby Steps
RxJava In Baby Steps
 
No internet? No Problem!
No internet? No Problem!No internet? No Problem!
No internet? No Problem!
 
First Do No Harm - 360|AnDev
First Do No Harm - 360|AnDevFirst Do No Harm - 360|AnDev
First Do No Harm - 360|AnDev
 
First Do No Harm - Droidcon Boston
First Do No Harm - Droidcon BostonFirst Do No Harm - Droidcon Boston
First Do No Harm - Droidcon Boston
 
Creating Gradle Plugins - Oredev
Creating Gradle Plugins - OredevCreating Gradle Plugins - Oredev
Creating Gradle Plugins - Oredev
 
Developing Apps for Emerging Markets
Developing Apps for Emerging MarketsDeveloping Apps for Emerging Markets
Developing Apps for Emerging Markets
 
Develop Maintainable Apps - edUiConf
Develop Maintainable Apps - edUiConfDevelop Maintainable Apps - edUiConf
Develop Maintainable Apps - edUiConf
 
Creating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf USCreating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf US
 
Google I/O 2016 Recap
Google I/O 2016 RecapGoogle I/O 2016 Recap
Google I/O 2016 Recap
 
Say It With Video
Say It With VideoSay It With Video
Say It With Video
 
Screen Robots: UI Tests in Espresso
Screen Robots: UI Tests in EspressoScreen Robots: UI Tests in Espresso
Screen Robots: UI Tests in Espresso
 
Static Code Analysis
Static Code AnalysisStatic Code Analysis
Static Code Analysis
 
Develop Maintainable Apps
Develop Maintainable AppsDevelop Maintainable Apps
Develop Maintainable Apps
 
Android Testing, Why So Hard?!
Android Testing, Why So Hard?!Android Testing, Why So Hard?!
Android Testing, Why So Hard?!
 
Measuring Audience Engagement through Analytics
Measuring Audience Engagement through AnalyticsMeasuring Audience Engagement through Analytics
Measuring Audience Engagement through Analytics
 
DC Media Innovations Kick-Off Meetup
DC Media Innovations Kick-Off MeetupDC Media Innovations Kick-Off Meetup
DC Media Innovations Kick-Off Meetup
 

Recently uploaded

Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
Tendenci - The Open Source AMS (Association Management Software)
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
WSO2
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
Tier1 app
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
Globus
 

Recently uploaded (20)

Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
 

From Grails to Android: A Simple Journey