Navigation is so easy! Simply create a navigation graph, add your destinations, drag and drop your actions and voila… just make sure you’re using a single activity architecture.
But you might be wondering how to…
Navigate between Activities (and why might you want to)?
Navigate between custom views?
Pass data (especially if you’re not working with entirely Fragment destinations)?
Handle login and other one-off flows?
Use Navigation in a multi module app
Test your Navigation?
Implement custom animations?
In this talk, we’ll learn the answers to these questions and talk about how to migrate an existing app to use Navigation Architecture Components.
Les Hazlewood, Stormpath co-founder and CTO and the Apache Shiro PMC Chair demonstrates how to design a beautiful REST + JSON API. Includes the principles of RESTful design, how REST differs from XML, tips for increasing adoption of your API, and security concerns.
Presentation video: https://www.youtube.com/watch?v=5WXYw4J4QOU
More info: http://www.stormpath.com/blog/designing-rest-json-apis
Further reading: http://www.stormpath.com/blog
Sign up for Stormpath: https://api.stormpath.com/register
Stormpath is a user management and authentication service for developers. By offloading user management and authentication to Stormpath, developers can bring applications to market faster, reduce development costs, and protect their users. Easy and secure, the flexible cloud service can manage millions of users with a scalable pricing model.
Building microservices sample applicationAnil Allewar
The slides provide details on how to build the sample Microservices application that covers the whole distributed system paradigm.
Please refer to the introduction to Microservices before following the contents in this slide
https://www.slideshare.net/anilallewar/introduction-to-microservices-78270318
This document provides an overview of ExpressJS, a web application framework for Node.js. It discusses using Connect as a middleware framework to build HTTP servers, and how Express builds on Connect by adding functionality like routing, views, and content negotiation. It then covers basic Express app architecture, creating routes, using views with different template engines like Jade, passing data to views, and some advanced topics like cookies, sessions, and authentication.
This talk introduces Spring's REST stack - Spring MVC, Spring HATEOAS, Spring Data REST, Spring Security OAuth and Spring Social - while refining an API to move higher up the Richardson maturity model
Entity Framework Core session on .NET core workshop. This slides contains the presentation on getting started on with Entity Framework Core 2.2. This was presented on Workshop On .Net
event held at Academia International College Tyagal - Lalitpur, Nepal. https://www.facebook.com/events/507837526666020/
And codes on the workshop is available on github https://github.com/kiranshahi/Todo-App
Spring Boot is a framework for creating stand-alone, production-grade Spring-based applications that can be started using java -jar without requiring any traditional application servers. It is designed to get developers up and running as quickly as possible with minimal configuration. Some key features of Spring Boot include automatic configuration, starter dependencies to simplify dependency management, embedded HTTP servers, security, metrics, health checks and externalized configuration. The document then provides examples of building a basic RESTful web service with Spring Boot using common HTTP methods like GET, POST, PUT, DELETE and handling requests and responses.
This document provides an overview of Angular's template-driven and model-driven forms. It describes the key directives, classes, and interfaces used for building forms in Angular. It explains how to add validation, track form state, create custom validators, and tie forms to components and templates. The document also demonstrates how to set up two-way data binding between forms and models using directives like ngModel, ngFormControl, and ngForm.
Les Hazlewood, Stormpath co-founder and CTO and the Apache Shiro PMC Chair demonstrates how to design a beautiful REST + JSON API. Includes the principles of RESTful design, how REST differs from XML, tips for increasing adoption of your API, and security concerns.
Presentation video: https://www.youtube.com/watch?v=5WXYw4J4QOU
More info: http://www.stormpath.com/blog/designing-rest-json-apis
Further reading: http://www.stormpath.com/blog
Sign up for Stormpath: https://api.stormpath.com/register
Stormpath is a user management and authentication service for developers. By offloading user management and authentication to Stormpath, developers can bring applications to market faster, reduce development costs, and protect their users. Easy and secure, the flexible cloud service can manage millions of users with a scalable pricing model.
Building microservices sample applicationAnil Allewar
The slides provide details on how to build the sample Microservices application that covers the whole distributed system paradigm.
Please refer to the introduction to Microservices before following the contents in this slide
https://www.slideshare.net/anilallewar/introduction-to-microservices-78270318
This document provides an overview of ExpressJS, a web application framework for Node.js. It discusses using Connect as a middleware framework to build HTTP servers, and how Express builds on Connect by adding functionality like routing, views, and content negotiation. It then covers basic Express app architecture, creating routes, using views with different template engines like Jade, passing data to views, and some advanced topics like cookies, sessions, and authentication.
This talk introduces Spring's REST stack - Spring MVC, Spring HATEOAS, Spring Data REST, Spring Security OAuth and Spring Social - while refining an API to move higher up the Richardson maturity model
Entity Framework Core session on .NET core workshop. This slides contains the presentation on getting started on with Entity Framework Core 2.2. This was presented on Workshop On .Net
event held at Academia International College Tyagal - Lalitpur, Nepal. https://www.facebook.com/events/507837526666020/
And codes on the workshop is available on github https://github.com/kiranshahi/Todo-App
Spring Boot is a framework for creating stand-alone, production-grade Spring-based applications that can be started using java -jar without requiring any traditional application servers. It is designed to get developers up and running as quickly as possible with minimal configuration. Some key features of Spring Boot include automatic configuration, starter dependencies to simplify dependency management, embedded HTTP servers, security, metrics, health checks and externalized configuration. The document then provides examples of building a basic RESTful web service with Spring Boot using common HTTP methods like GET, POST, PUT, DELETE and handling requests and responses.
This document provides an overview of Angular's template-driven and model-driven forms. It describes the key directives, classes, and interfaces used for building forms in Angular. It explains how to add validation, track form state, create custom validators, and tie forms to components and templates. The document also demonstrates how to set up two-way data binding between forms and models using directives like ngModel, ngFormControl, and ngForm.
PHP-MySQL Database Connectivity Using XAMPP ServerRajiv Bhatia
This document provides a step-by-step guide for connecting PHP to MySQL using XAMPP server. It describes downloading and installing XAMPP, creating a database and table in MySQL, and writing PHP code to insert data into the MySQL table from an HTML form.
I did this presentation for one of my java user groups at work.
Basically, this is a mashed up version of various presentations, slides and images that I gathered over the internet.
I've quoted the sources in the end. Feel free to reuse it as you like.
Welcome to presentation on Spring boot which is really great and relatively a new project from Spring.io. Its aim is to simplify creating new spring framework based projects and unify their configurations by applying some conventions. This convention over configuration is already successfully applied in so called modern web based frameworks like Grails, Django, Play framework, Rails etc.
Vue.js is a progressive JavaScript framework that focuses on building user interfaces and is used for single-page applications. It was created by Evan You and released in 2014. Vue.js uses declarative templates and reactive data binding to render the view layer for an application. Templates in Vue use HTML-based syntax with directives prefixed with v- to dynamically bind expression results. Common directives include v-bind, v-if, and v-for. Vue.js applications can be built with its core library or integrated with other libraries and frameworks.
This year ECMA International will be ratifying the biggest update to the JavaScript language in its history. In this talk we'll look at key features already appearing in browsers as well as those coming in the near future. We'll also explore how you can begin leveraging the power of ES6 across all browsers today. If you haven't looked at JavaScript recently, you soon realize that a bigger, better world awaits.
MySQL is a free, open-source relational database management system that is ideal for both small and large applications. PHP can connect to and interact with a MySQL database using extensions like MySQLi or PDO. The document provides code examples for connecting to a MySQL database, executing queries to retrieve, insert, update, and delete data, and other common MySQL operations when using PHP.
This document contains an agenda and slides for a React workshop presented by Bojan Golubovic. The workshop covers the history and basics of React, including components, JSX, the virtual DOM, and React data flow. It also discusses related tools like Redux and React Router. The goal is to provide basic knowledge of React and how to build real-world applications with it.
Tommi Reiman (https://twitter.com/ikitommi) will be presenting Malli
(https://github.com/metosin/malli) is a fresh new data-driven data
validation and specification library for Clojure/Script. In this talk,
Tommi will give a quick introduction to Malli, compare it to prior art
including Plumatic Schema and clojure.spec and demonstrate how to
elegantly solve real-world problems with it. Also, peek beyond the
runtime validation.
Express is a web framework for Node.js that allows routing, middleware, templating and more. It is inspired by Sinatra and uses Connect as its middleware framework. Key features include routing, middleware support, template rendering with engines like Jade, and session handling with storage options. Errors can be handled via the app.error() method. Express provides a full-featured and easy to use web development framework for Node.js.
This document provides an introduction to Jakarta Struts 1.3, an open source MVC framework for building Java web applications. It discusses the limitations of using the traditional MVC pattern for web applications due to HTTP's stateless nature. Struts implements an MVC2 pattern to address this, using the controller to manage state. The core Struts components like ActionForms, Actions, and ActionMappings are explained. It also covers setting up the Struts controller through configuration files, defining forms and actions, and creating views with JSP and custom tag libraries.
What is Dependency Injection in Spring Boot | EdurekaEdureka!
YouTube Link: https://youtu.be/O9mqe53syGc
** Microservices Architecture Training: https://www.edureka.co/microservices-... **
This Edureka tutorial on "What is Dependency Injection" will give you an introduction to dependency injection and also show a practical implementation of dependency injection with Spring Boot.
In this PPT, you will learn the following:
What is Dependency Injection?
Inversion of Control
Types of Dependency Injection
Benefits of Dependency Injection
Implement Dependency Injection using Spring Boot
Follow us to never miss an update in the future.
YouTube: https://www.youtube.com/user/edurekaIN
Instagram: https://www.instagram.com/edureka_learning/
Facebook: https://www.facebook.com/edurekaIN/
Twitter: https://twitter.com/edurekain
LinkedIn: https://www.linkedin.com/company/edureka
Castbox: https://castbox.fm/networks/505?country=in
A REST API uses HTTP requests with verbs like GET, POST, PUT, and DELETE to perform CRUD (Create, Read, Update, Delete) operations on resources identified by URLs. It provides a lightweight alternative to SOAP that returns data in JSON format and HTTP response codes. Well-known codes include 200 for OK, 201 for Created, 400 for Bad Request, and 404 for Not Found. REST enables building applications and platforms that can easily integrate new interfaces over time.
The document discusses JDBC, JPA, and Spring Data frameworks. JDBC allows establishing database connections and sending SQL statements. JPA provides object-relational mapping and includes annotations to map entities to tables. Spring Data provides repositories to access data based on the underlying data access technology like JPA or MongoDB. It supports common CRUD operations and custom queries.
This document provides an introduction and overview of the Java 8 Stream API. It discusses key concepts like sources of streams, intermediate operations that process stream elements, and terminal operations that return results. Examples are provided to demonstrate filtering, sorting, mapping and collecting stream elements. The document emphasizes that streams are lazy, allow pipelining operations, and internally iterate over source elements.
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Edureka!
This Edureka "Node.js tutorial" will help you to learn the Node.js fundamentals and how to create an application in Node.js. Node.js is an open-source, cross-platform JavaScript runtime environment for developing a diverse variety of server tools and applications. Below are the topics covered in this tutorial:
1) Client Server Architecture
2) Limitations of Multi-Threaded Model
3) What is Node.js?
4) Features of Node.js
5) Node.js Installation
6) Blocking Vs. Non – Blocking I/O
7) Creating Node.js Program
8) Node.js Modules
9) Demo – Grocery List Web Application using Node.js
Are you tired of java.lang.OutOfMemoryError: PermGen space? Then this talk is for you! We'll begin with a crash course in the Java memory model in order to understand what the error message means. Then we'll look at different causes of the error and how to avoid them. We may glance at a few interesting mistakes from the Open Source world. Last but not least you'll learn how you can get rid of java.lang.OutOfMemoryError: PermGen space once and for all.
While most bugs reveal their cause within their stack trace, Java’s OutOfMemoryError is less talkative and therefore regarded as being difficult to debug by a majority of developers. With the right techniques and tools, memory leaks in Java programs can however be tackled like any other programming error. This talks discusses how a JVM stores data, categorizes different types of memory leaks that can occur in a Java program and presents techniques for fixing such errors. Furthermore, we will have a closer look at lambda expressions and their considerable potential of introducing memory leaks when they are used incautiously.
This document provides an overview of Enterprise Java Beans (EJB) including:
- The different types of EJB components including session beans, message-driven beans, and entities.
- Session beans can be stateless, stateful, or singleton and their differences are summarized.
- How EJB components are accessed through local, remote, and no-interface views using dependency injection or JNDI lookups.
- Message-driven beans process asynchronous JMS messages.
- Transactions, persistence contexts, and resources can be managed by the EJB container through annotations.
The java persistence API provides a specification for persisting, reading, and managing data from your java object to your relational tables in the database. JPA specifies the set of rules and guidelines for developing interfaces that follow standards.
Presented by Jayson Ward and Frank Garofalo as a Demo Theater at the Esri DevSummit 2013. Presenting Virtual Port, a web-based application for the Port of Long Beach, built using ArcGIS API for Javascript.
Selected code snippets: https://github.com/fgarofalo10/jquery-dojo-sandbox
This document provides an overview of jQuery, a JavaScript library for DOM scripting. It discusses why libraries like jQuery are useful for making DOM scripting easy and handling cross-browser compatibility issues. The core features of jQuery are then summarized, including selectors, DOM manipulation, events, effects, Ajax functionality, and utilities. Examples are provided throughout to illustrate how various jQuery methods work.
PHP-MySQL Database Connectivity Using XAMPP ServerRajiv Bhatia
This document provides a step-by-step guide for connecting PHP to MySQL using XAMPP server. It describes downloading and installing XAMPP, creating a database and table in MySQL, and writing PHP code to insert data into the MySQL table from an HTML form.
I did this presentation for one of my java user groups at work.
Basically, this is a mashed up version of various presentations, slides and images that I gathered over the internet.
I've quoted the sources in the end. Feel free to reuse it as you like.
Welcome to presentation on Spring boot which is really great and relatively a new project from Spring.io. Its aim is to simplify creating new spring framework based projects and unify their configurations by applying some conventions. This convention over configuration is already successfully applied in so called modern web based frameworks like Grails, Django, Play framework, Rails etc.
Vue.js is a progressive JavaScript framework that focuses on building user interfaces and is used for single-page applications. It was created by Evan You and released in 2014. Vue.js uses declarative templates and reactive data binding to render the view layer for an application. Templates in Vue use HTML-based syntax with directives prefixed with v- to dynamically bind expression results. Common directives include v-bind, v-if, and v-for. Vue.js applications can be built with its core library or integrated with other libraries and frameworks.
This year ECMA International will be ratifying the biggest update to the JavaScript language in its history. In this talk we'll look at key features already appearing in browsers as well as those coming in the near future. We'll also explore how you can begin leveraging the power of ES6 across all browsers today. If you haven't looked at JavaScript recently, you soon realize that a bigger, better world awaits.
MySQL is a free, open-source relational database management system that is ideal for both small and large applications. PHP can connect to and interact with a MySQL database using extensions like MySQLi or PDO. The document provides code examples for connecting to a MySQL database, executing queries to retrieve, insert, update, and delete data, and other common MySQL operations when using PHP.
This document contains an agenda and slides for a React workshop presented by Bojan Golubovic. The workshop covers the history and basics of React, including components, JSX, the virtual DOM, and React data flow. It also discusses related tools like Redux and React Router. The goal is to provide basic knowledge of React and how to build real-world applications with it.
Tommi Reiman (https://twitter.com/ikitommi) will be presenting Malli
(https://github.com/metosin/malli) is a fresh new data-driven data
validation and specification library for Clojure/Script. In this talk,
Tommi will give a quick introduction to Malli, compare it to prior art
including Plumatic Schema and clojure.spec and demonstrate how to
elegantly solve real-world problems with it. Also, peek beyond the
runtime validation.
Express is a web framework for Node.js that allows routing, middleware, templating and more. It is inspired by Sinatra and uses Connect as its middleware framework. Key features include routing, middleware support, template rendering with engines like Jade, and session handling with storage options. Errors can be handled via the app.error() method. Express provides a full-featured and easy to use web development framework for Node.js.
This document provides an introduction to Jakarta Struts 1.3, an open source MVC framework for building Java web applications. It discusses the limitations of using the traditional MVC pattern for web applications due to HTTP's stateless nature. Struts implements an MVC2 pattern to address this, using the controller to manage state. The core Struts components like ActionForms, Actions, and ActionMappings are explained. It also covers setting up the Struts controller through configuration files, defining forms and actions, and creating views with JSP and custom tag libraries.
What is Dependency Injection in Spring Boot | EdurekaEdureka!
YouTube Link: https://youtu.be/O9mqe53syGc
** Microservices Architecture Training: https://www.edureka.co/microservices-... **
This Edureka tutorial on "What is Dependency Injection" will give you an introduction to dependency injection and also show a practical implementation of dependency injection with Spring Boot.
In this PPT, you will learn the following:
What is Dependency Injection?
Inversion of Control
Types of Dependency Injection
Benefits of Dependency Injection
Implement Dependency Injection using Spring Boot
Follow us to never miss an update in the future.
YouTube: https://www.youtube.com/user/edurekaIN
Instagram: https://www.instagram.com/edureka_learning/
Facebook: https://www.facebook.com/edurekaIN/
Twitter: https://twitter.com/edurekain
LinkedIn: https://www.linkedin.com/company/edureka
Castbox: https://castbox.fm/networks/505?country=in
A REST API uses HTTP requests with verbs like GET, POST, PUT, and DELETE to perform CRUD (Create, Read, Update, Delete) operations on resources identified by URLs. It provides a lightweight alternative to SOAP that returns data in JSON format and HTTP response codes. Well-known codes include 200 for OK, 201 for Created, 400 for Bad Request, and 404 for Not Found. REST enables building applications and platforms that can easily integrate new interfaces over time.
The document discusses JDBC, JPA, and Spring Data frameworks. JDBC allows establishing database connections and sending SQL statements. JPA provides object-relational mapping and includes annotations to map entities to tables. Spring Data provides repositories to access data based on the underlying data access technology like JPA or MongoDB. It supports common CRUD operations and custom queries.
This document provides an introduction and overview of the Java 8 Stream API. It discusses key concepts like sources of streams, intermediate operations that process stream elements, and terminal operations that return results. Examples are provided to demonstrate filtering, sorting, mapping and collecting stream elements. The document emphasizes that streams are lazy, allow pipelining operations, and internally iterate over source elements.
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Edureka!
This Edureka "Node.js tutorial" will help you to learn the Node.js fundamentals and how to create an application in Node.js. Node.js is an open-source, cross-platform JavaScript runtime environment for developing a diverse variety of server tools and applications. Below are the topics covered in this tutorial:
1) Client Server Architecture
2) Limitations of Multi-Threaded Model
3) What is Node.js?
4) Features of Node.js
5) Node.js Installation
6) Blocking Vs. Non – Blocking I/O
7) Creating Node.js Program
8) Node.js Modules
9) Demo – Grocery List Web Application using Node.js
Are you tired of java.lang.OutOfMemoryError: PermGen space? Then this talk is for you! We'll begin with a crash course in the Java memory model in order to understand what the error message means. Then we'll look at different causes of the error and how to avoid them. We may glance at a few interesting mistakes from the Open Source world. Last but not least you'll learn how you can get rid of java.lang.OutOfMemoryError: PermGen space once and for all.
While most bugs reveal their cause within their stack trace, Java’s OutOfMemoryError is less talkative and therefore regarded as being difficult to debug by a majority of developers. With the right techniques and tools, memory leaks in Java programs can however be tackled like any other programming error. This talks discusses how a JVM stores data, categorizes different types of memory leaks that can occur in a Java program and presents techniques for fixing such errors. Furthermore, we will have a closer look at lambda expressions and their considerable potential of introducing memory leaks when they are used incautiously.
This document provides an overview of Enterprise Java Beans (EJB) including:
- The different types of EJB components including session beans, message-driven beans, and entities.
- Session beans can be stateless, stateful, or singleton and their differences are summarized.
- How EJB components are accessed through local, remote, and no-interface views using dependency injection or JNDI lookups.
- Message-driven beans process asynchronous JMS messages.
- Transactions, persistence contexts, and resources can be managed by the EJB container through annotations.
The java persistence API provides a specification for persisting, reading, and managing data from your java object to your relational tables in the database. JPA specifies the set of rules and guidelines for developing interfaces that follow standards.
Presented by Jayson Ward and Frank Garofalo as a Demo Theater at the Esri DevSummit 2013. Presenting Virtual Port, a web-based application for the Port of Long Beach, built using ArcGIS API for Javascript.
Selected code snippets: https://github.com/fgarofalo10/jquery-dojo-sandbox
This document provides an overview of jQuery, a JavaScript library for DOM scripting. It discusses why libraries like jQuery are useful for making DOM scripting easy and handling cross-browser compatibility issues. The core features of jQuery are then summarized, including selectors, DOM manipulation, events, effects, Ajax functionality, and utilities. Examples are provided throughout to illustrate how various jQuery methods work.
The document provides an overview and code snippets for an Eagles 2011 NFL Draft mobile app created with Sencha Touch. It discusses challenges faced like learning Sencha Touch, displaying live updates, and adapting images for different screen sizes. Lessons learned include destroying DOM elements when done, establishing post-launch content parameters, and using background-size for images. The document also discusses tooling, dependencies, and best practices for mobile development.
Sammy.js is a JavaScript framework built on jQuery that is inspired by Ruby's Sinatra framework. It allows developers to build single page applications, total JavaScript applications, and controllers for widgets. Sammy uses routes defined with HTTP verbs and paths to handle requests and trigger callbacks, supports custom events, and enables the use of plugins to extend functionality.
Design Patterns for Tablets and SmartphonesMichael Galpin
This is a talk I gave at AnDevCon. It talks about ways to take advantage of features introduced in Android 3.0 to create more modular and better looking apps.
WordPress allows plugins and themes to modify its core functionality through hooks called actions and filters. Actions allow plugins to specify functions that are executed at certain points, like before or after specific events. Filters allow functions to modify content, like text, before it is saved or output. The document discusses how a basic widget can be modified to use actions and filters to allow other code to add puppy images and warnings. This allows expanding the widget's capabilities without directly editing its code.
This document discusses building mobile applications using PhoneGap, jQuery, and Dreamweaver. It provides an overview of different mobile application types including mobile HTML, web apps, hybrid apps, and native apps. It then demonstrates how to create hybrid mobile apps with PhoneGap and jQuery Mobile, including accessing device APIs, building user interfaces with jQuery Mobile, and creating lists and charts with JavaScript plugins. It also covers how to package and deploy the app to different platforms using PhoneGap.
This document discusses building mobile applications using PhoneGap, jQuery, and Dreamweaver. It provides an overview of different mobile application types including mobile HTML, web apps, hybrid apps, and native apps. It then demonstrates how to create hybrid mobile apps with PhoneGap and jQuery Mobile, including accessing device APIs, building user interfaces with jQuery Mobile, and creating customizable PhoneGap plugins.
This document provides an overview of what JavaScript capabilities are available in Plone and how to use them. It discusses nuts and bolts topics like injecting JavaScript and CSS, as well as how to create common interactive elements like validation, popups, tabs, and drag and drop functionality using tools like jQuery. The document is intended as an introduction for Plone developers on getting started with JavaScript in Plone.
Cross Domain Web Mashups with JQuery and Google App EngineAndy McKay
This document discusses cross-domain mashups using jQuery and Google App Engine. It describes common techniques for dealing with the same-origin policy, including proxies, JSONP, and building sample applications that mashup Twitter data, geotagged tweets, and maps. Examples include parsing RSS feeds from Twitter into JSONP and displaying tweets on a map based on their geotagged locations. The document concludes by noting issues with trust, failures, and limitations for enterprise use.
This document discusses unobtrusive JavaScript and non-blocking JavaScript patterns. It describes applying JavaScript externally, using it to enhance functionality without blocking other functionality, and providing usable functionality when JavaScript is not supported. It provides an example of moving label text to associated fields and hiding labels on page load with JavaScript. It also discusses best practices for external links and implementing these patterns using the Garber-Irish method.
My attempts to make my experience developing Play 2 web-applications (in Scala) more Rails-like.
I show 3 frameworks employed that draw nearer to the Ruby/Rails spirit than Play's default offerings.
In a world where users have ever higher expectations from the apps they use, having data always available, even when the device is offline has become increasingly important.
In this talk we will go through different ways of saving data on the phone and introduce Realm as a replacement for SQLite and ORM's.
Through an example app it will be demonstrated that thinking "Offline first" not only affects your apps architecture for the better, but also results in happier users.
This document provides a short introduction to HTML5, including:
- HTML5 is the 5th version of the HTML standard by the W3C and is still under development but supported by many browsers.
- HTML5 introduces new semantic elements, video and audio tags, 2D/3D graphics using <canvas>, and new JavaScript APIs for features like geolocation, offline web apps, and drag and drop.
- The document provides examples of using new HTML5 features like video playback, semantic elements, geolocation API, and drawing on a canvas with JavaScript.
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)Doris Chen
Get frustrated by cross-browser incompatibility? Hate to develop application using JavaScript? jQuery is a powerful JavaScript library that can enhance your websites regardless of your background. jQuery is fast, lean, simple and hugely expandable, enabling you to build compelling web applications quickly and easily. In this session, we will start with a quick introduction of jQuery, illustrate what’s so good about jQuery, and demonstrate step by step how to develop jQuery Ajax application efficiently with database, web services, OData, NetFlix and ASP.NET MVC. Microsoft is now shipping, supporting, and contributing to jQuery, with ASP.NET and Visual Studio. New features which will be available in the next release of jQuery such as globalization, templating and data-linking will be introduced in the session as well.
There are more smart people building software now than there have been at any point in the past, which means that it's more important than ever to stay on top of new developments, libraries, frameworks, and everything else. To really take advantage of this wealth of innovation, however, you've got to look beyond your normal community -- what's going on in Python? And how can we use that to make our Ruby lives easier? In this session, we'll explore that question. We'll look at actual examples of code and concepts borrowed and reimplemented to form a better idea of when it's appropriate and when it'll fall flat.
The document provides an overview of advanced Android Wear development techniques including:
1) Customizing notifications by creating a custom activity displayed as a notification, handling notification data changes, and building notifications with custom backgrounds.
2) Advanced UI techniques such as disabling swipe to dismiss, adding long press to dismiss interactions, and using round and rectangular layouts.
3) Transferring bitmap images between handheld and wearable devices using assets, Volley, Picasso, and data syncing APIs.
4) Techniques for voice input using the speech recognizer, networking on Wear using libraries, and avoiding data caching issues.
This document discusses using jQuery and Google App Engine to create cross-domain web mashups in 3 sentences or less:
The document introduces techniques for creating cross-domain web mashups using jQuery to make AJAX calls across domains and Google App Engine for hosting, discussing JSONP and proxies to overcome the same-origin policy limitation. It then provides an example mashup that displays tweets tagged with a hashtag on a map by geocoding hashtag names to locations and querying Twitter, Google Maps, and other domains.
This document provides an overview of how to build applications with React Native. It discusses React Native's core components like React, ReactDOM and React Native. It also covers topics like JavaScript implementation, building components, styles, platform specific code, animations, navigation libraries and working with data using Redux.
Hand Rolled Applicative User ValidationCode KataPhilip Schwarz
Could you use a simple piece of Scala validation code (granted, a very simplistic one too!) that you can rewrite, now and again, to refresh your basic understanding of Applicative operators <*>, <*, *>?
The goal is not to write perfect code showcasing validation, but rather, to provide a small, rough-and ready exercise to reinforce your muscle-memory.
Despite its grandiose-sounding title, this deck consists of just three slides showing the Scala 3 code to be rewritten whenever the details of the operators begin to fade away.
The code is my rough and ready translation of a Haskell user-validation program found in a book called Finding Success (and Failure) in Haskell - Fall in love with applicative functors.
What is Master Data Management by PiLog Groupaymanquadri279
PiLog Group's Master Data Record Manager (MDRM) is a sophisticated enterprise solution designed to ensure data accuracy, consistency, and governance across various business functions. MDRM integrates advanced data management technologies to cleanse, classify, and standardize master data, thereby enhancing data quality and operational efficiency.
E-commerce Development Services- Hornet DynamicsHornet Dynamics
For any business hoping to succeed in the digital age, having a strong online presence is crucial. We offer Ecommerce Development Services that are customized according to your business requirements and client preferences, enabling you to create a dynamic, safe, and user-friendly online store.
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Crescat
Crescat is industry-trusted event management software, built by event professionals for event professionals. Founded in 2017, we have three key products tailored for the live event industry.
Crescat Event for concert promoters and event agencies. Crescat Venue for music venues, conference centers, wedding venues, concert halls and more. And Crescat Festival for festivals, conferences and complex events.
With a wide range of popular features such as event scheduling, shift management, volunteer and crew coordination, artist booking and much more, Crescat is designed for customisation and ease-of-use.
Over 125,000 events have been planned in Crescat and with hundreds of customers of all shapes and sizes, from boutique event agencies through to international concert promoters, Crescat is rigged for success. What's more, we highly value feedback from our users and we are constantly improving our software with updates, new features and improvements.
If you plan events, run a venue or produce festivals and you're looking for ways to make your life easier, then we have a solution for you. Try our software for free or schedule a no-obligation demo with one of our product specialists today at crescat.io
What is Augmented Reality Image Trackingpavan998932
Augmented Reality (AR) Image Tracking is a technology that enables AR applications to recognize and track images in the real world, overlaying digital content onto them. This enhances the user's interaction with their environment by providing additional information and interactive elements directly tied to physical images.
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsPeter Muessig
The UI5 tooling is the development and build tooling of UI5. It is built in a modular and extensible way so that it can be easily extended by your needs. This session will showcase various tooling extensions which can boost your development experience by far so that you can really work offline, transpile your code in your project to use even newer versions of EcmaScript (than 2022 which is supported right now by the UI5 tooling), consume any npm package of your choice in your project, using different kind of proxies, and even stitching UI5 projects during development together to mimic your target environment.
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeAftab Hussain
Understanding variable roles in code has been found to be helpful by students
in learning programming -- could variable roles help deep neural models in
performing coding tasks? We do an exploratory study.
- These are slides of the talk given at InteNSE'23: The 1st International Workshop on Interpretability and Robustness in Neural Software Engineering, co-located with the 45th International Conference on Software Engineering, ICSE 2023, Melbourne Australia
Odoo ERP software
Odoo ERP software, a leading open-source software for Enterprise Resource Planning (ERP) and business management, has recently launched its latest version, Odoo 17 Community Edition. This update introduces a range of new features and enhancements designed to streamline business operations and support growth.
The Odoo Community serves as a cost-free edition within the Odoo suite of ERP systems. Tailored to accommodate the standard needs of business operations, it provides a robust platform suitable for organisations of different sizes and business sectors. Within the Odoo Community Edition, users can access a variety of essential features and services essential for managing day-to-day tasks efficiently.
This blog presents a detailed overview of the features available within the Odoo 17 Community edition, and the differences between Odoo 17 community and enterprise editions, aiming to equip you with the necessary information to make an informed decision about its suitability for your business.
Essentials of Automations: The Art of Triggers and Actions in FMESafe Software
In this second installment of our Essentials of Automations webinar series, we’ll explore the landscape of triggers and actions, guiding you through the nuances of authoring and adapting workspaces for seamless automations. Gain an understanding of the full spectrum of triggers and actions available in FME, empowering you to enhance your workspaces for efficient automation.
We’ll kick things off by showcasing the most commonly used event-based triggers, introducing you to various automation workflows like manual triggers, schedules, directory watchers, and more. Plus, see how these elements play out in real scenarios.
Whether you’re tweaking your current setup or building from the ground up, this session will arm you with the tools and insights needed to transform your FME usage into a powerhouse of productivity. Join us to discover effective strategies that simplify complex processes, enhancing your productivity and transforming your data management practices with FME. Let’s turn complexity into clarity and make your workspaces work wonders!
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemPeter Muessig
Learn about the latest innovations in and around OpenUI5/SAPUI5: UI5 Tooling, UI5 linter, UI5 Web Components, Web Components Integration, UI5 2.x, UI5 GenAI.
Recording:
https://www.youtube.com/live/MSdGLG2zLy8?si=INxBHTqkwHhxV5Ta&t=0
Transform Your Communication with Cloud-Based IVR SolutionsTheSMSPoint
Discover the power of Cloud-Based IVR Solutions to streamline communication processes. Embrace scalability and cost-efficiency while enhancing customer experiences with features like automated call routing and voice recognition. Accessible from anywhere, these solutions integrate seamlessly with existing systems, providing real-time analytics for continuous improvement. Revolutionize your communication strategy today with Cloud-Based IVR Solutions. Learn more at: https://thesmspoint.com/channel/cloud-telephony
WhatsApp offers simple, reliable, and private messaging and calling services for free worldwide. With end-to-end encryption, your personal messages and calls are secure, ensuring only you and the recipient can access them. Enjoy voice and video calls to stay connected with loved ones or colleagues. Express yourself using stickers, GIFs, or by sharing moments on Status. WhatsApp Business enables global customer outreach, facilitating sales growth and relationship building through showcasing products and services. Stay connected effortlessly with group chats for planning outings with friends or staying updated on family conversations.
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesQuickdice ERP
Explore the seamless transition to e-invoicing with this comprehensive guide tailored for Saudi Arabian businesses. Navigate the process effortlessly with step-by-step instructions designed to streamline implementation and enhance efficiency.
Graspan: A Big Data System for Big Code AnalysisAftab Hussain
We built a disk-based parallel graph system, Graspan, that uses a novel edge-pair centric computation model to compute dynamic transitive closures on very large program graphs.
We implement context-sensitive pointer/alias and dataflow analyses on Graspan. An evaluation of these analyses on large codebases such as Linux shows that their Graspan implementations scale to millions of lines of code and are much simpler than their original implementations.
These analyses were used to augment the existing checkers; these augmented checkers found 132 new NULL pointer bugs and 1308 unnecessary NULL tests in Linux 4.4.0-rc5, PostgreSQL 8.3.9, and Apache httpd 2.2.18.
- Accepted in ASPLOS ‘17, Xi’an, China.
- Featured in the tutorial, Systemized Program Analyses: A Big Data Perspective on Static Analysis Scalability, ASPLOS ‘17.
- Invited for presentation at SoCal PLS ‘16.
- Invited for poster presentation at PLDI SRC ‘16.
Software Engineering, Software Consulting, Tech Lead, Spring Boot, Spring Cloud, Spring Core, Spring JDBC, Spring Transaction, Spring MVC, OpenShift Cloud Platform, Kafka, REST, SOAP, LLD & HLD.
OpenMetadata Community Meeting - 5th June 2024OpenMetadata
The OpenMetadata Community Meeting was held on June 5th, 2024. In this meeting, we discussed about the data quality capabilities that are integrated with the Incident Manager, providing a complete solution to handle your data observability needs. Watch the end-to-end demo of the data quality features.
* How to run your own data quality framework
* What is the performance impact of running data quality frameworks
* How to run the test cases in your own ETL pipelines
* How the Incident Manager is integrated
* Get notified with alerts when test cases fail
Watch the meeting recording here - https://www.youtube.com/watch?v=UbNOje0kf6E
Zoom is a comprehensive platform designed to connect individuals and teams efficiently. With its user-friendly interface and powerful features, Zoom has become a go-to solution for virtual communication and collaboration. It offers a range of tools, including virtual meetings, team chat, VoIP phone systems, online whiteboards, and AI companions, to streamline workflows and enhance productivity.
47. HOSTING NAVIGATION
Navigation Graph
Destination
NavHostFragment
NavHostFragment Initialization
1. Create NavController
2. Registers Fragment as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
<navigation xmlns:android="..."
xmlns:app="..."
xmlns:tools=..."
android:id="@+id/weather_graph"
app:startDestination="@id/weather_list">
<fragment
android:id="@+id/weather_list"
android:name=".WeatherListFragment"
android:label="Weather Now"
tools:layout="@layout/weather_list_fragment">
48. HOSTING NAVIGATION
Navigation Graph
Destination Destination
NavHostFragment
navController.navigate(...)
NavHostFragment Initialization
1. Create NavController
2. Registers Fragment as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
NavController
49. HOSTING NAVIGATION
Navigation Graph
Destination Destination
NavHostFragment
navController.popBackStack()
NavHostFragment Initialization
1. Create NavController
2. Registers Fragment as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
NavController
50. Accessing NavController
NAVIGATING
class MyDestinationFragment : Fragment()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val controller: NavController = findNavController()
}
}
Fragment
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val controller: NavController = findNavController(R.id.nav_host_fragment)
}
Activity
51. Navigate to Another Destination
NAVIGATING
class MyDestinationFragment : Fragment()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val controller: NavController = findNavController()
view.findViewById<Button>(R.id.next)).setOnClickListener {
controller.navigate(R.id.action_id)
}
}
}
56. Generated Arguments
PASSING ARGUMENTS SAFELY
public class WeatherDetailFragmentArgs implements NavArgs {
// Create Args from Bundle or output to Bundle
public static WeatherDetailFragmentArgs fromBundle(@NonNull Bundle bundle) {}
public Bundle toBundle() {}
// Type Safe Property Access
public String getZipCode()
public boolean getUseFahrenheit()
// Builder for type safe argument creation
public static class Builder {}
}
<fragment android:id=“@+id/weather_detail"
android:name="com.acme.weather.view.WeatherDetailFragment">
<argument android:name=“zip_code” app:argType=“string" />
<argument android:name="use_fahrenheit" app:argType="boolean" />
</fragment>
Navigation Graph
57. Generated Arguments
PASSING ARGUMENTS SAFELY
<fragment android:id=“@+id/weather_detail"
android:name="com.acme.weather.view.WeatherDetailFragment">
<argument android:name=“zip_code” app:argType=“string" />
<argument android:name="use_fahrenheit" app:argType="boolean" />
</fragment>
Navigation Graph
Construct from android.os.Bundle
public class WeatherDetailFragmentArgs implements NavArgs {
// Create Args from Bundle or output to Bundle
public static WeatherDetailFragmentArgs fromBundle(@NonNull Bundle bundle) {}
public Bundle toBundle() {}
// Type Safe Property Access
public String getZipCode()
public boolean getUseFahrenheit()
// Builder for type safe argument creation
public static class Builder {}
}
58. Generated Arguments
PASSING ARGUMENTS SAFELY
<fragment android:id=“@+id/weather_detail"
android:name="com.acme.weather.view.WeatherDetailFragment">
<argument android:name=“zip_code” app:argType=“string" />
<argument android:name="use_fahrenheit" app:argType="boolean" />
</fragment>
Navigation Graph
Access args as properties by type
public class WeatherDetailFragmentArgs implements NavArgs {
// Create Args from Bundle or output to Bundle
public static WeatherDetailFragmentArgs fromBundle(@NonNull Bundle bundle) {}
public Bundle toBundle() {}
// Type Safe Property Access
public String getZipCode()
public boolean getUseFahrenheit()
// Builder for type safe argument creation
public static class Builder {}
}
59. Accessing Args in Destination
PASSING ARGUMENTS SAFELY
public class WeatherDetailFragmentArgs implements NavArgs {
// Create Args from Bundle or output to Bundle
public static WeatherDetailFragmentArgs fromBundle(@NonNull Bundle bundle) {}
public Bundle toBundle() {}
// Type Safe Property Access
public String getZipCode()
public boolean getUseFahrenheit()
// Builder for type safe argument creation
public static class Builder {}
}
<fragment android:id=“@+id/weather_detail"
android:name="com.acme.weather.view.WeatherDetailFragment">
<argument android:name=“zip_code” app:argType=“string" />
<argument android:name="use_fahrenheit" app:argType="boolean" />
</fragment>
val args = WeatherDetailFragmentArgs.fromBundle(arguments)
— or —
val args: WeatherDetailFragmentArgs by navArgs()
Args Navigation Graph
62. public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(@NonNull String zipCode) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Generated Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
Navigation Graph
63. public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(@NonNull String zipCode) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Generated Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
navigate_to_weather_details
Navigation Graph
64. public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(@NonNull String zipCode) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Generated Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
zipCode String required
Navigation Graph
65. public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(@NonNull String zipCode) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Generated Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
useFahrenheit can be overridden
Navigation Graph
66. public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(@NonNull String zipCode) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Generated Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
All navigate(...) details
Navigation Graph
67. Navigating with Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
val directions =
WeatherListFragmentDirections
.navigateToWeatherDetails(zipCode)
.setUseFahrenheit(true)
findNavController().navigate(directions)
public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(...) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Navigation Graph
68. Navigating with Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(...) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Navigation Graph
findNavController().navigate(
toWeatherDetails(zipCode)
.setUseFahrenheit(true))
69. Navigating with Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
val directions =
WeatherListFragmentDirections
.navigateToWeatherDetails(zipCode)
.setUseFahrenheit(true)
findNavController().navigate(directions)
public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(...) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Navigation Graph
70. Navigating with Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
val directions =
WeatherListFragmentDirections
.navigateToWeatherDetails(zipCode)
.setUseFahrenheit(true)
findNavController().navigate(directions)
public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(...) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Navigation Graph
Static import of NavDirections class
71. Navigating with Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/navigate_to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
val directions =
WeatherListFragmentDirections
.navigatetoWeatherDetails(zipCode)
.setUseFahrenheit(true)
findNavController().navigate(directions)
public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(...) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Navigation Graph
Static import of NavDirections class
Change name of action to "to_weather_details"
72. Navigating with Directions
PASSING ARGUMENTS SAFELY
<action
android:id="@+id/to_weather_details"
app:destination="@id/weather_detail" >
<argument android:defaultValue="true" android:name="use_fahrenheit" />
</action>
findNavController().navigate(
toWeatherDetails(zipCode)
.setUseFahrenheit(true))
public class WeatherListFragmentDirections {
// Static factory for each Action tied to this destination
public static NavigateToWeatherDetails navigateToWeatherDetails(...) {}
public static class NavigateToWeatherDetails implements NavDirections {
// Setters to override default argument values
public NavigateToWeatherDetails setUseFahrenheit(boolean useFahrenheit) {}
// Accessors for Bundle arguments, Action (…and NavOptions)
public Bundle getArguments() {}
public int getActionId() {}
}
Navigation Graph
79. First Time User Experiences
CONDITIONAL NAVIGATION
Login GraphMain Navigation Graph
80. First Time User Experiences
CONDITIONAL NAVIGATION
<navigation ...
android:id="@+id/weather_graph"
app:startDestination="@id/weather_list">
<fragment android:id=“@+id/weather_list">...</fragment>
<fragment android:id="@+id/weather_detail">...</fragment>
<navigation
android:id="@+id/login_graph"
android:label="Login"
app:startDestination="@id/login">
<fragment
android:id="@+id/login"
android:name="com.acme.weather.security.view.Login"
android:label="Log In" />
</navigation>
</navigation>
Nested Graph
81. First Time User Experiences
CONDITIONAL NAVIGATION
<navigation ...
android:id="@+id/weather_graph"
app:startDestination="@id/weather_list">
<fragment android:id=“@+id/weather_list">...</fragment>
<fragment android:id="@+id/weather_detail">...</fragment>
<include app:graph="@navigation/login_graph" />
</navigation>
Include as Separate Graph
83. Global Action
CONDITIONAL NAVIGATION
<navigation ...
android:id="@+id/weather_graph"
app:startDestination="@id/weather_list">
<fragment android:id=“@+id/weather_list">...</fragment>
<fragment android:id="@+id/weather_detail">...</fragment>
<include app:graph="@navigation/login_graph" />
<action
android:id="@+id/action_global_login"
app:destination="@id/login_graph" />
</navigation>
Global Action is Global because
it is not tied to a destination
It is a peer to destinations in this
navigation graph and accessible by
any destination inside this graph
84. CONDITIONAL NAVIGATION
1. If user is unauthenticated, redirect to login
2. Return to secured area
once authenticated
First Time User Experiences
85. Global Navigation
CONDITIONAL NAVIGATION
class WeatherDetailFragment : SecureFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}
86. Global Navigation
CONDITIONAL NAVIGATION
abstract class SecureFragment : Fragment() {
val authenticationViewModel by activityViewModels<AuthenticationViewModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { ... }
private fun popBackStackOrExit() { ... }
}
87. Global Navigation
CONDITIONAL NAVIGATION
abstract class SecureFragment : Fragment() {
val authenticationViewModel by activityViewModels<AuthenticationViewModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
authenticationViewModel.authenticationStatus.observe(viewLifecycleOwner, Observer { authStatus ->
when(authStatus) {
UNAUTHENTICATED -> navController.navigate(actionGlobalLogin())
USER_DECLINED -> popBackStackOrExit()
else -> Unit
}
})
}
private fun popBackStackOrExit() { ... }
}
88. Global Navigation
CONDITIONAL NAVIGATION
abstract class SecureFragment : Fragment() {
val authenticationViewModel by activityViewModels<AuthenticationViewModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
authenticationViewModel.authenticationStatus.observe(viewLifecycleOwner, Observer { authStatus ->
when(authStatus) {
UNAUTHENTICATED -> navController.navigate(actionGlobalLogin())
USER_DECLINED -> popBackStackOrExit()
else -> Unit
}
})
}
private fun popBackStackOrExit() { ... }
}
89. Global Navigation
CONDITIONAL NAVIGATION
abstract class SecureFragment : Fragment() {
val authenticationViewModel by activityViewModels<AuthenticationViewModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
authenticationViewModel.authenticationStatus.observe(viewLifecycleOwner, Observer { authStatus ->
when(authStatus) {
UNAUTHENTICATED -> navController.navigate(actionGlobalLogin())
USER_DECLINED -> popBackStackOrExit()
else -> Unit
}
})
}
private fun popBackStackOrExit() {
if(!navController.popBackStack()) {
requireActivity().finish()
}
}
}
96. On SetGraph
LAUNCH VIA IMPLICIT DEEP LINK
1. Search Graph for best matching deep link
• URI exact matches preferred
• By matching arguments
NavHostFragment Initialization
1. Create NavController
2. Registers ??? as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
97. On SetGraph
LAUNCH VIA IMPLICIT DEEP LINK
1. Search Graph for best matching deep link
• URI exact matches preferred
• By matching arguments
2. Build array of destination IDs leading to this Destination
• R.id.weather_list
• R.id.weather_detail
NavHostFragment Initialization
1. Create NavController
2. Registers ??? as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
98. On SetGraph
LAUNCH VIA IMPLICIT DEEP LINK
1. Search Graph for best matching deep link
• URI exact matches preferred
• By matching arguments
2. Build array of destination IDs leading to this Destination
• R.id.weather_list
• R.id.weather_detail
3. Push each destination on the stack
• (If new task)
NavHostFragment Initialization
1. Create NavController
2. Registers ??? as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
99. On SetGraph
LAUNCH VIA IMPLICIT DEEP LINK
1. Search Graph for best matching deep link
• URI exact matches preferred
• By matching arguments
2. Build array of destination IDs leading to this Destination
• R.id.weather_list
• R.id.weather_detail
3. Push last destination on the stack
• (If part of an existing task)
NavHostFragment Initialization
1. Create NavController
2. Registers ??? as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
101. Create Pending Intent
LAUNCH VIA EXPLICIT DEEP LINK
fun scheduleNotificationForZip() {
/* Create a deep link and pending intent */
val pendingIntent = navController.createDeepLink()
.setDestination(R.id.weather_detail)
.setArguments(arguments)
.createPendingIntent()
/* Build the Notification */
createNotificationChannel()
val builder = NotificationCompat.Builder(requireContext(), CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Weather Report")
.setContentText("Weather now in ${args.zipCode}")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
notificationManager.notify(1, builder.build())
}
102. Explicit Deep Link Intent
LAUNCH VIA EXPLICIT DEEP LINK
1. android-support-nav:controller:deepLinkIds
• R.id.weather_list
• R.id.weather_detail
2. android-support-nav:controller:deepLinkExtras
• zip_code
• use_fahrenheit
3. android-support-nav:controller:deepLinkIntent
• Intent that triggered the deep link
104. Mock NavController
TESTING NAVIGATION
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario =
launchFragmentInContainer<WeatherDetailFragment>(bundle)
fragmentScenario.onFragment { fragment ->
// Access to set after onResume()
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
// Drive view with Espresso and verify navigation interactions
onView(...)
verify(mockNavController).navigate(...)
}
105. @emmax
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario =
launchFragmentInContainer<WeatherDetailFragment>(bundle)
fragmentScenario.onFragment { fragment ->
// Access to set after onResume()
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
// Drive view with Espresso and verify navigation interactions
onView(...)
verify(mockNavController).navigate(...)
}
FragmentScenario Requires : 'androidx.fragment:fragment-testing:1.1.0-alpha06'
FragmentScenario
TESTING NAVIGATION
106. FragmentScenario
TESTING NAVIGATION
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario =
launchFragmentInContainer<WeatherDetailFragment>(bundle)
fragmentScenario.onFragment { fragment ->
// Access to set after onResume()
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
// Drive view with Espresso and verify navigation interactions
onView(...)
verify(mockNavController).navigate(...)
}
107. FragmentScenario
TESTING NAVIGATION
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario =
launchFragmentInContainer<WeatherDetailFragment>(bundle)
fragmentScenario.onFragment { fragment ->
// Access to set after onResume()
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
// Drive view with Espresso and verify navigation interactions
onView(...)
verify(mockNavController).navigate(...)
}
108. FragmentScenario
TESTING NAVIGATION
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario =
launchFragmentInContainer<WeatherDetailFragment>(bundle)
fragmentScenario.onFragment { fragment ->
// Access to set after onResume()
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
// Drive view with Espresso and verify navigation interactions
onView(...)
verify(mockNavController).navigate(...)
}
Called after Fragment.onResume()
109. @Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario = launchFragmentInContainer(bundle) {
WeatherDetailFragment().also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
// Observe after onCreateView before onViewCreated
if (viewLifecycleOwner != null) {
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
}
}
...
}
FragmentScenario
TESTING NAVIGATION
110. FragmentScenario
TESTING NAVIGATION
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario = launchFragmentInContainer(bundle) {
WeatherDetailFragment().also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
// Observe after onCreateView before onViewCreated
if (viewLifecycleOwner != null) {
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
}
}
...
}
Construct the Fragment
111. FragmentScenario
TESTING NAVIGATION
@Test
fun testNavigationToInGameScreen() {
val mockNavController = mock(NavController::class.java)
val bundle = WeatherDetailFragmentArgs.Builder("43231")
.build()
.toBundle()
val fragmentScenario = launchFragmentInContainer(bundle) {
WeatherDetailFragment().also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
// Observe after onCreateView before onViewCreated
if (viewLifecycleOwner != null) {
Navigation.setViewNavController(
fragment.requireView(), mockNavController)
}
}
}
...
}
Observe its view lifecycle
(Starting after onCreateView(...))
120. NAVIGATION ARCHITECTURE
NavControllerDestination 1
Navigation
Provider
Navigator Destination 2
navigate(R.id.destination_2)
What is your navigator name?
Navigator Name
Lookup Navigator(name)
Navigator
Navigate
(destination info)
Actual Navigation
Echo Dest Back
(or null)
Find Dest 2
Add Dest 2
NavBackStack
Dispatch OnDestinationChanged
122. HOSTING NAVIGATION
Navigation Graph
NavHostCustom
NavHostFragment Initialization
1. Create NavController
2. Registers ??? as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
class NavHostCustom : NavHost {
init {
...
navigationController.navigationProvider += createControllerNavigator()
...
}
override fun getNavController(): NavController = navigationController
}
123. HOSTING NAVIGATION
Navigation Graph
NavHostCustom
NavHostFragment Initialization
1. Create NavController
2. Registers ??? as a Destination Type
3. Restore Navigation State
4. Set Graph on NavController
5. Navigate to first Destination
class NavHostCustom : NavHostFragment() {
override fun createFragmentNavigator(): Navigator<out FragmentNavigator.Destination> {
navController.navigatorProvider += DialogNavigator(requireContext(), childFragmentManager)
return super.createFragmentNavigator()
}
}
124. • Conductor POC - View Based Destinations
• Navigating Conductor and the Navigation Architecture Component -- Tevin Jeffrey -- (https://bit.ly/2MD9LSn)
• DialogFragmentDestination
• https://gist.github.com/fbarthelery/ad0062a88875b46e0065137ff03807a0
COMMON QUESTIONS
Custom Nav Samples
125. NAVIGATION ARCHITECTURE
Responsibilities Reference Implementation(s) Notes
NavHost
• Container for navigation
• Provide NavController
• Manage Navigation State
• Register
• NavHostFragment • Usually registers additional
Navigator types (e.g.
FragmentNavigator)
NavController
• Navigate to action or destination
• Pop back to previous destination
• Generate bundle for saveState
• Restore itself from a previously saved bundle
-- • Calls to navigate() and
popBack(), delegated to the
navigator of the next or current
destination type.
Navigator
<NavDestination>
• Delegate class used by the NavController to do the
work of pushing/popping.
• Has intimate knowledge of the given destination
type
• NavGraphNavigator
• ActivityNavigator
• FragmentNavigator
• NoOpNavigator
• Navigators can be registered
navController
.navigatorProvider +=
someNavigator
NavDestination
• Represents a node within the nav graph
• Usually a nested class of a corresponding
Navigator of this type.
• Encapsulate the configured actions, arg
declarations, default values, etc.
• NavGraph
• ActivityNavigator.Destination
• FragmentNavigator.Destination
• These define the elements you
see in the nav graph too:
<navigation>
<activity>
<fragment>
130. @emmax
Convenient ViewModel Scoping
WHY SINGLE ACTIVITY
Graph A Graph B
Shared
ViewModel
Activity
Shared
ViewModel
Fragment A Fragment B Fragment C
2.1.0-alpha02
134. @emmax
How to Navigate Across Modules?
FeatureB
FeatureA
FeatureC
App
Library Library
Feature A
App
Feature CFeature B
MULTI MODULE
? ?
Activity Destination
• No Dependencies
Features host their own UI
• Testing
Standard Activity Test Rule / Espresso Test
135. @emmax
Intent
How to Navigate Across Modules?
FeatureB
FeatureA
FeatureC
App
Library Library
Feature A
App
Feature CFeature B
MULTI MODULE
Activity Destination
• NavController within Feature
• Implicit Intent Across Features
Intent
136. @emmax
Add Intent Filters
MULTIPLE ACTIVITIES FOR MULTI MODULE
Jeroen Mols
Android GDE & Lead Android developer at Philips Hue
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
FeatureB
FeatureA
FeatureC
App
Library Library
<activity android:name="..FeatureA" >
<intent-filter>
<action android:name="com.acme.featureA" />
<category android:name="..DEFAULT" />
</intent-filter>
</activity>
Each Feature Defines Intent Filter
137. @emmax
Add Intent Filters
MULTIPLE ACTIVITIES FOR MULTI MODULE
Jeroen Mols
Android GDE & Lead Android developer at Philips Hue
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
FeatureB
FeatureA
FeatureC
App
Library Library
<activity android:name="..FeatureA" >
<intent-filter>
<action android:name="com.acme.featureA" />
<category android:name="..DEFAULT" />
</intent-filter>
</activity>
<activity android:name="..FeatureB" >
<intent-filter>
<action android:name="com.acme.featureB" />
<category android:name="..DEFAULT" />
</intent-filter>
</activity>
Merged Manifest Has All
138. @emmax
Feature A
App
Feature CFeature B
MULTIPLE ACTIVITIES FOR MULTI MODULE
Jeroen Mols
Android GDE & Lead Android developer at Philips Hue
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
Intent Intent
FeatureB
FeatureA
FeatureC
App
Library Library
Intent Intent("com.acme.featureX")
.setPackage(context.packageName)
Navigate between Features using Intent
139. @emmax
Define a Common Module to Encapsulate
Feature A
App
Feature CFeature B
MULTIPLE ACTIVITIES FOR MULTI MODULE
Jeroen Mols
Android GDE & Lead Android developer at Philips Hue
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
Actions Actions
FeatureB
FeatureA
FeatureC
App
Actions
Actions
Actions.navToFeatureA(context)
140. Official
• Navigation Documentation (https://developer.android.com/guide/navigation) 💪
• Source (AOSP) (https://android.googlesource.com/platform/frameworks/support/)
• Issue Tracker (https://issuetracker.google.com/issues?q=componentid:409828%20type:process%20status:open&p=1
• Code Lab https://codelabs.developers.google.com/codelabs/android-navigation/#0
Other Talks
• Adventures in Navigation -- DroidCon SF '18 -- Lyla Fujiwara -- (https://www.youtube.com/watch?v=ELGShpd17wc)
• Single Activity: Why, When, How -- DevSummit '18 -- Ian Lake -- (https://www.youtube.com/watch?v=2k8x8V77CrU)
Posts
• Using Navigation in a large banking app -- David Vávra -- (https://bit.ly/2JbT2Yy)
• Master-Detail views with Navigation Components --Lara Martín -- (https://bit.ly/2JqEKU7)
• Navigating Conductor and the Navigation Architecture Component -- Tevin Jeffrey -- (https://bit.ly/2MD9LSn)
• Modularization : Real Life Example -- Jeroen Mols -- (https://buff.ly/2I8mtZj)
Sample Projects
• Getting Started Sample - https://github.com/googlesamples/android-architecture-components/tree/master/NavigationBasicSample
• Advanced Navigation - https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample
• DialogNavigator Gist - https://gist.github.com/fbarthelery/ad0062a88875b46e0065137ff03807a0
ADDITIONAL RESOURCES