# data[].attributes.attachment_link.readable_text

The apps in Kodular are built as a combination of various Components , with each individual Component being used for a specific purpose.

The Component's behaviour is configured using

What are Components ?

Components are the basic building elements of any app in Kodular. Everything in the app is done with the help of one component or the other.

Different components are used for different purposes. One component may be used to design the User Interface(UI) of the app, for example a Button component, while others may be used for performing actions like communicating to a database, saving an image to the Android device's folder etc. for example the FirebaseDB component.

What are Blocks ?

Blocks are ones which are used describe how to do a task. The way in which the Components respond to various actions and events in the app is designed using the .

For example, how the app should respond when a Button is clicked, what data is to be communicated to the database using FirebaseDB component etc. are all configured using the .

Thus, by using the various Components and by configuring its behaviour and response to actions from the user with the help of , an app is "koded" in Kodular.

The Car Analogy

Let us consider an analogy of a Car to better understand the concept of the components and blocks.

A Car is constructed using various parts, like wheels, doors, engine, steering etc. each performing its own unique function.

Some of these parts are visible to the driver(who is the user of the car) and he interacts with them directly, while some of them are not visible. And these parts know what their function is and how to perform it, for example, the function of the wheel is to provide support and move the car, the function of the steering wheel is to help streer the car and so on.

An Android app is like the Car. Like how a car has various parts, an app is constructed using various Components, like Button, Label, File etc. with each component being used for a particular purpose.

Like the parts of the Car, some of these Components are visible to the user of the app and they interact with it, while some of the components don't interact directly with the user. The behaviour or the purpose of these components are configured using the Blocks. The "how to perform the function of a component" part is configured by using the .

Types of Components

Visible Components: The components that can be viewed in the Viewer panel of the Designer page are known as Visible Component. They are visible to the user in the app and the user can interact with it directly and help in building the User Interface of the app.

Non-Visible Components: The components that are not viewed in the Viewer panel of the Designer page are known as Non-Visible Component. They are the components that usually do other things like saving a file to the device's storage, getting data from various sensors of the device etc. But, sometimes, these components may also be used to create visible elements in the app. For example, the component, which is a Non-visible Component can be used to create a dialog which is visible on the device's screen.

Types of Blocks of components

Each Component has its own set of blocks, divided into three types:

Property Blocks

Each component comes with its own set of Properties, which describe its characteristics. For example, the Button component has properties like Background Color, Text Color, Text Font Size etc. which are characteristics that describe the features of that particular button.

Some these Properties can either be set from page, or through , while some can be set only through and some only from the .

At any time in the app, the given property of a component can be read through a Getter Block. It gives the current value of that property of that particular component.

Similarly, the given property of a component can be modified during the runtime of the app thorugh Setter Blocks.

The Property blocks are Green in color.

Info

Not all the properties of the component have both Getter and Setter Blocks. Some of them may have only Getter or sometimes only Setter blocks.

Method Blocks

Methods are certain functions that a component can do. For example, the Sound component should be able to play the music when required. This is done by using a Method called Play, which instructs the components to carry out the task of playing the music.

So, Methods are nothing but an instruction to carry out a particular task, like playing the music.

Some methods require some additional data, which will also be used in carrying out that task. For example, Firebase DB component stores the data using a method called Store Value. But how will the component know what data to store and under what name ? This is where Parameters or simply Params are used.

The Store Value methods has takes two parameters(i.e it makes use of two different data that need to be specified) namely tag and value To Store. So this method can be called(i.e used in the blocks) along with the two data that it needs like shown below.

Event Blocks

Kodular apps are "koded" in an event-driven approach. That is, the blocks or behaviour of the app is executed based on the various events that occur. There is a wide range of events that occur thorughout the time for which the app is running, and the response of the app to these events can be configured.

For example, the user clicking a Button, the app starting are all events. The response of the app to such events are configured by grouping the desired behaviour under the Event block. The methods and property blocks grouped under each event are executed whenever that particular event occurs.

Let us take an example.
If you want to change the Button text when the user clicks it, you have to group the logic to change the text under theButton.Clicked event. This is shown below.

If you have any queries or doubts, feel free to ask about it on the community

# data[].attributes.attachment_link.description
 The apps in Kodular are built as a combination of various Components , with each individual Component being used for a specific purpose. The Component's behaviour is configured using Components are the basic building elements of any app in Kodular. Everything in the app is done with the help of one component or the other.

# data[].attributes.attachment_link.description
Build beautiful, usable products faster. Material Design is an adaptable system-backed by open-source code-that helps teams build high quality digital experiences.

# data[].attributes.body
Per reduir tamany d'imatges

# data[].attributes.attachment_link.description
Descargar VSO Image Resizer 4.1.0.2. Cambia el tamaño de tus archivos de imagen. VSO Image Resizer es un pequeño programa que se encarga de modificar el tamaño de los archivos de imagen con extrema sencillez. Tan sólo tendremos que seleccionar el fichero cuyo tamaño queremos cambiar e introducir el tamaño

# data[].attributes.body
Google sites

# data[].attributes.attachment_link.readable_text
What happened to the old "Da Button Factory"?

Da Button Factory has been acquired by ClickMinded! The tool has been upgraded and will remain free. It's now a call-to-action button generator for our digital marketing students learning how to write a blog post that converts.

We recommend you use the latest versions of Chrome, Firefox, Edge, or Safari to use this tool. You might run into issues if you use Internet Explorer-if so, just download one of the recommended browsers.

How to add your button to a website, email, or social media post

There are several ways you might go about doing this.

Option #1: Download the button image file

This is the most straightforward way. Just pick your preferred file type and hit the download button.

Next, just upload your button image to your website, your email service provider, or use it in your social media images.

Option #2: Implement the button as HTML + CSS

Da Button Factory is also a free CSS button generator. This option requires a bit more knowledge of HTML and CSS, but it will result in a faster web page or email (since there's no need to load an image).

To do this, create an HTML element like 'div' or 'button', write the CTA copy, and assign a class to it. In this example, we'll call the class "my-cta-button".

Next, copy the CSS code provided by the tool under the "Embed" option, and add it either to your CSS file or to the page using 'style' tags.

That's it! You now have designed and implemented your own HTML button.

How to create high-converting CTAs

Here are some best practices you can follow to make sure your CTAs drive your users to take action.

1. Use a button design that stands out. Make sure there's enough contrast between the button text and its background, as well as between the button and background of the page.

2. Tell your users exactly what they get by clicking on your CTA. Instead of using something generic like "Click here", be descriptive with copy like "Buy now" or "Download".

3. Use the first person when writing your CTA copy. It's better to use "View my account" instead of "View your account".

4. Keep your CTA copy short and to the point. Avoid creating unnecessarily wordy CTAs.

5. Make your offer more attractive by including terms like "Now", "Free", or "Save". For example, "Download NOW", "Get FREE Ebook", or "Save 10$".

Your turn

Da Button Factory by ClickMinded is an online button maker that allows you to create beautiful, high-converting CTA buttons for websites, email campaigns, or social media posts, in no time and for free.

Start with the model displayed above, tweak the style to fit your needs, and implement the buttons you created to grow your business or website.

# data[].attributes.attachment_link.title
Da Button Factory - Free CTA Button Generator

# data[].attributes.attachment_link.description
Da Button Factory has been acquired by ClickMinded! The tool has been upgraded and will remain free. It's now a call-to-action button generator for our digital marketing students learning how to write a blog post that converts. We recommend you use the latest versions of Chrome, Firefox, Edge, or Safari to use this tool.

# data[].attributes.attachment_link.readable_text
Make interactive learning and communication materials with Genially's easy-to-use content creation tool. Design fun, click-to-explore experiences that captivate your audience.

Interactive experiences to light up minds

Static PDF or interactive brochure? 27-slide presentation or dynamic training scenario? With Genially, anyone can turn any type of content into an interactive experience. Tell a captivating story, get people interested and keep them clicking! No coding required.

Increase engagement with gamification

From virtual escape rooms to drag-and-drop puzzles, game-based content is proven to enhance learning outcomes, improve information retention and boost brand loyalty. Build positive feedback loops and game mechanics into any type of material.

Get fast and professional results with pre-built templates

Let our graphic designers do the hard work for you. Choose from over 1400+ ready-made and easy-to-customize designs - interactions and animations included!!

Discover the power of interactive content creation for

Try it for yourself to see what everyone's raving about!

# data[].attributes.attachment_link.title
Genially, the platform for interactive animated content

# data[].attributes.attachment_link.description
Engage your audience with clickable, gamified, media-rich experiences. Create your interactive content now!

# data[].attributes.attachment_link.description
17,114 free fonts in 9,449 families · Free licenses for commercial use · Direct font downloads · Mac · Windows · Linux

# data[].attributes.attachment_link.description
ccMixter A music community site operated by ArtisTech Media, founded by Creative Commons

# data[].attributes.attachment_link.readable_text
Al seleccionar una combinación de colores es una parte fundamental de cualquier sitio web o de un proyecto, y para ayudarle a descubrir que una perfecta combinación de colores, hemos compilado una lista de los mejores generadores paleta de colores y herramientas web hoy.

Compartir los mejores generadores de la paleta de colores con tus amigos!

# data[].attributes.attachment_link.title
Mejor Paleta de Colores Generadores - Códigos de Colores HTML

# data[].attributes.attachment_link.description
Al seleccionar una combinación de colores es una parte fundamental de cualquier sitio web o de un proyecto, y para ayudarle a descubrir que una perfecta combinación de colores, hemos compilado una lista de los mejores generadores paleta de colores y herramientas web hoy. Compartir los mejores generadores de la paleta de colores con tus amigos!

# data[].attributes.attachment_link.description
Explore thousands of great palettes made by users.

# data[].attributes.attachment_link.description
Create color schemes with the color wheel or browse thousands of color combinations from the Color community.

# data[].attributes.body
Con aia

# data[].attributes.attachment_link.readable_text
FirebaseDB provides for sharing between users all running the exact same app on their device. Read "What is FirebaseDB?" to learn more about FirebaseDB and what it does for your applications.

This is a quick and very short app that demonstrates the fundamental operation of FirebaseDB when used in MIT App Inventor. I hope to create a more interesting demo app a bit later.

Caution: FirebaseDB is an experimental component offered by MIT App Inventor. FirebaseDB remains under development and is subject to change; apps written today might not work in the future. Apps containing the FirebaseDB component will not work in the emulator - run on your phone or tablet instead. At this time, the cloud-based database is a shared database, shared among multiple users, and cannot - yet - be linked to your personal Google account.

FirebaseDB is Similar to TinyWebDB

The programming interface for FirebaseDB is nearly the same as that used for TinyWebDB. TinyWebDB is a simple cloud-based database - to use, you need to set up the TinyWebDB on your own server or on Google's servers. With your data stored in the "cloud", your data may be shared among many apps. For the FirebaseDB demo, you do not need to set up your own server, nor do you need to use TinyWebDB:

For details on setting up and using TinyWebDB - including some tricks that enable sharing of TinyWebDB data between apps - please see my book,

App Inventor 2 Databases and Files (Volume 3 e-book)
Step-by-step TinyDB, TinyWebDB, Fusion Tables and Files
Buy from:Amazon, Google Books, Kobo Books

For more information, including a sample chapter, please see my App Inventor books page.

Sample App User Interface

Our simple demonstration app stores and retrieves a text value to and from the FirebaseDB. As with TinyDB or TinyWebDB, enter a "tag" value to use to look up the value. For example, a tag value could be a part number, and the value could be the text description of the part's name. Or the tag could be a phone number and the value could be the name of the person who has that phone number.

The program is operated by entering a tag and a value and then pressing the Store Value button. The value entered is written to the FirebaseDB database in the cloud.

After a value has been stored, you retrieve values by entering the original tag and pressing Retrieve Value. The data corresponding to the tag is retrieved from FirebaseDB and display in the Value field, on screen.

If the app is run simultaneously on other devices, any data updates made on the other devices result in all devices receiving a data changed notification. When the data in the FirebaseDB is changed, the new data is displayed on all devices.

Designer View

A combination of vertical and horizontal layouts is used to organize the positions of the controls (see the Components list, below, or download the sample code).

Store Value and Retrieve Value are buttons. Tag and Value are labels, followed by text boxes for data entry. Data Changed Event and the status message are both labels.

Drag the FirebaseDB component from the Experimental section of the Designer controls palette. You will receive a warning that FirebaseDB is experimental.

Blocks View

(Sorry for the image quality on these three blocks - the screen capture utility I used for these did not do a very good job)

The btnStoreValue event handler reads the enter tag and data value from the text boxes on screen, and then stores those to the FirebaseDB. Find the FirebaseDB StoreValue component by clicking on the FirebaseDB component in the Blocks list.

Fetching a store value is simple - call FirebaseDB's GetValue method and pass to it the tag. Unlike TinyDB (but similar to TinyWebDB), the value is not read instantaneously but instead, once the data is read and available, an event called GotValue occurs. A GotValue event handler processed the incoming data; in our simple app, the data is stored back in to the Value text box, on screen.

A unique feature of FirebaseDB is the database's ability to alert apps that data inside the database has been changed. This alert caused a DataChanged event to occur - and which delivers the tag and value that were updated to the app.

Reminder

FirebaseDB is experimental and incomplete, is subject to change, and should not be relied upon at this time for production code. However, you may use it for learning and experimentation.

Download Source Code

Download: FirebaseDB_Demo.aia

After downloading to your computer, you may upload the file to your App Inventor account using Projects | Import project (.aia) from my computer

Related Tutorials

# data[].attributes.attachment_link.title
Demonstration app for using FirebaseDB in AppInventor

# data[].attributes.attachment_link.description
FirebaseDB provides for sharing between users all running the exact same app on their device. Read "What is FirebaseDB?" to learn more about FirebaseDB and what it does for your applications. This is a quick and very short app that demonstrates the fundamental operation of FirebaseDB when used in MIT App Inventor.

# data[].attributes.attachment_link.readable_text
Introduction

This post shows how to create a login system using App Inventor. The objective of the post is twofold: on the one side to provide the sources of a working template that can be reused in further applications, and on the other side to explain the fundamentals of its development.

You may be interested in this template if you intend to develop an app that requires the user to identify himself. This is useful for example in a game where you want to record the results and provide a classification of best scorers, or in general whenever you intend to enhance the user experience by tracking its history and remembering some of its decisions about configuration, look&feel, etc. Moreover, user identification is a great way to create a community around your apps. I'd rather say it's a must.

On the other hand, user identification has some drawbacks. For example it can imply an entry barrier to your app, as some spontaneous users will be reluctant to identify themselves and hence renounce to log in. This is not a concern for me because I prefer having a small set of really interested users than lots of downloaders who uninstall the app after their first trial. Anyway, the template provides a " login as guest " functionality that allows users to have a look at the app before registering.

When I realized I needed to provide user identification for some of my AppInventor apps I started looking for a solution on the web. There are several posts related and some ideas for a solution (the closest one this server side solution), but none of them matched completely with what I had in mind, so I decided to develop the functionality on my own, assembling parts from those clever ideas into a cohesive module supporting all my requirements. The job was slower than expected, but I'm satisfied with the results and I'm sure it will save me a lot of work from now on because it can be reused as a template for any future app. In particular, I've recently publisehd an app to Google Play that uses the template we're going to see.

HISTORY:

01/08/2013: There's a new version of the template available in this post. If you're just interested in the sources you can go there directly, but otherwise I recommend you to have a previous look at the remainder of this tutorial because it has more extensive explanations about the template goals and behaviour.

26/07/2014: New sources for AppInventor 2. Indeed the post was initially published for AppInventor classic, but currently sources are available for both versions. The tutorial is also updated, but only with minor changes since the app is roughly the same.

About this tutorial

The format of this post is somewhat different from the two kinds of the tutorials most frequently found on the web:

Step by step: very detailed instructions that fully guide you to develop the application. For a matter of space, they use to be basic and avoid some aspects (e.g. user entry verification) which are not necessary for a prototype but need to be taken into account for real applications. Good examples of this kind are the official AI tutorials .

Tips and tricks: ideas to solve specific problems. There is usually the full code and some explanations, but also for a matter of space they don't use to be full applications. A good example of this kind are Puravida snippets.

So both kinds of tutorials fail to cover the nuts and bolts for passing from a prototype to a production application. This tutorial will try to do so, since as I said we're creating a template that I intend to reuse in all my apps with as little adaptations as possible. This broader scope comes at the cost of less detailed explanations, but my goal is to provide enough information for an intermediate reader to understand the module and be able to build or adapt it on his own. However sometimes it's difficult to find the right balance so if anyone is interested in any further detail please leave a comment or contact me and I'll be pleased to answer. Also remember that any detail omitted in the explanation can be discovered by inspecting the sources.

Therefore my recommendation is not to try to develop the full application from scratch, but rather download the sources and try them to see the app working. Then read through the tutorial and use the sources to review some details that may not be clear.

What are we going to build

The main functionalities provided by the template are:

Login dialog: The entry point to the application. Requests the user to identify himself if he's already registered and allows new users to register. It optionally remembers the previous username/password thus allowing users to log in with a simple click.

Register: The user provides at least a username and password, as well as some additional information (that can be customized for each application). This information is stored in a database, with password encrypted.

Forgot password: If the user had provided an email, the password is sent to the address. Otherwise it's shown on the screen.

Google login: The user can identify himself using his Google account. This way he needn't remember yet another password. In this case, the user is also created in our database in order to store the information specific from our app, but we don't record its password and email.

Profile screen: Allows user to change his register information once within the app.

Initial menu: The skeleton for the initial screen integrated with the login dialog.

Some screenshots

Initial screen

Register

Forgot password

Google account login

Menu

Help

Download

Choose one of the following versions:

How to install the app

Download any of the versions above and upload it as a new project into AppInventor. This should work directly except for the following limitations:

The "Forgot password" screen won't be able to send mails (it will show the password as a message). For this to be possible you need to enable a service as explained in the tutorial How to send a direct mail.

The "Google login" will not work until you set the variables CLIENT_ID and CLIENT_SECRET with the values that the API Console has given to your application, as explained in the tutorial How to identify your user with OAuth from Pura Vida Apps.

The database is stored in the default appinventor.appspot.com service which is not a good practice. Please consider enabling a specific service as explained in the tutorial Creating a Custom TinyWebDB Service.

How it works

In order to keep this post to a reasonable extension I've moved some contents to separate posts. Concretely the solution to some specific challenges I faced when developing the module and that were not trivial to solve (at least for me):

Also for extension sake, all the coding stuff is explained separately in the second part of this post

User interface

Notice there are only two screens even though the template consists of seven windows. The reason is that six of these windows are implemented as table arrangements in the first screen (see the red square in the Components tree-view) which are hidden/shown by code in order to simulate the windows transitions. The reasons for using this mechanism rather than the multiscreen facility now available in AI are explained in the tutorial An "optimal" way to manage multiple screens.

The following chapters are devoted to each of the seven arrangements, and a final chapter covers the remaining components of the app.

HorizontalArrangementTopBar

TableArrangementLogin

This is the window displayed initially and the most complex one. It contains several arrangements which provide the desired layout for the following components:

TextboxUser, TextboxPwd: Contain the username and password to be filled by the user

ButtonLogin: Opens the menu after validating the username and password indicated

CheckboxRemember: Indicates whether the data entered in the screen is recorded for next time (using Tinydb)

ButtonRegister: Opens a new window (TableArrangementRegister) allowing user registration

ButtonForgotPwd: Opens a new window (TableArrangementSendPwd) where the password will be reminded interactively or by email

ButtonGoogle: Opens a new window (TableArrangementGoogle) that shows Google's interface for login

ButtonGuest: Opens the menu without validation

TableArrangementMenu

This is the application menu, which is accessed upon successful login. The template contains 4 generic options but it can obviously be adapted for each app.

The components are very simple. No secrets with buttons: one for each option and an additional one for "Exit". Labels are somewhat trickier because they're used to leave some space between buttons. The TableArrangementMenu1 has 4 columns and 5 rows and the labels are positioned in:

To achieve the layout required, you can specify the desired height and width for these labels. However, these attributes will be overridden by code (see the Screen Orientation tutorial).

TableArrangementRegister

This is the window where the user registers into the app. After introducing its identification data and pressing the Ok button a new record is stored in the database (validating previously that the username does not already exist).

LabelName_REG, LabelPassword_REG, LabelPassword2_REG, LabelMail_REG: Identifying labels. The prefix "*" indicates mandatory fields (this will be validated by code)

TextboxName_REG, Password_REG, Password2_REG, TextboxMail_REG: The fields where the user enters his information

CheckBoxSendMail_REG: Indicator of whether the user will receive email notifications

ButtonOk_REG: Stores data and closes the screen

NOTE: There is no "Cancel" button, because Android style guide orients towards using the device back button instead

TableArrangementSendPwd

This window notifies about the password stored for a given username. If user's email is informed the notification is sent to that address. Otherwise it's shown as a screen message.

LabelName_SEND, TextboxName_SEND, ButtonOK_SEND: No secrets

LabelSep1_SEND: Spacer label to leave some space at the top. Inform the required height

HiddenMail_SEND, HiddenPassword_SEND: These are auxiliary fields used to store the mail and password retrieved. They MUST NOT be shown in the screen, so mark the "Visibility" attribute as Hidden

TableArrangementGoogle

This is the window that shows the Google login interface. All the magic is performed by code, so it has simply two components:

TableArrangementGoogle: Used to achieve a full screen layout. Inform Height and Width to Fill parent

WebViewer1: The component used to show Google's web interface. Inform Height and Width to Fill parent

TableArrangementHelp

This is the window that appears when the user presses the "Help button". We reuse the same interface for all windows despite each one has a specific text help. This is achieved by code (i.e. the right text is loaded according to the window from which the help is invoked).

Therefore the window has a general structure consisting of a header ( VerticalArrangement3), a body ( VerticalArrangement2) and a footer ( LabelLogo). After creating these arrangements we can simply drag into them the appropriate labels. In our case:

LabelHead: The title. Mark the Bold attribute and inform a slightly bigger text size (e.g. 16).

LabelHeadSpacer: Just a spacer. Leave the text blank and inform a small height (e.g. 10)

LabelHelp1, LabelHelp2, LabelHelp3, LabelHelp4: The labels that will contain the help body. Place one above the other in the VerticalArrangement2 and inform their width as Fill parent.

LabelHelpLink: A text that can show a web address as the last line of the text help. Inform the attribute TextColor = blue.

NOTE: This label looks like a hyperlink but it has no real behavior. To provide a real hyperlink we should use a button instead of a label, add a WebViewer component and program the button click event to open the web viewer with the address specified in the button label. This is implemented in version 2.

LabelLogo: A logo to be shown in the footer. You'll probably prefer to use an image rather than a label. In this case you'll probably require a HorizontalArrangement to center the image

Other Components

Finally here are the non-visual components

TinyDB1: Used to store locally the username and password entered by the user, in order to offer them as a defaul next time

TinyWebDB_LOGIN: Reads information from the user's database in order to validate the credentials

TinyWebDB_SEND: Reads user's mail and password from the database

TinyWebDB_REG: Reads and writes user's information the database

TinyWebDB_PROFILE:er1: Similar TinyWebDB_REG but with different behaviour. Actually we could have used a unique TinyWebDB for the whole screen but it's separated for clarity sake

WebGetToken, WebGetGoogle, ActivityStarter, Clock1: Used for the google login, as explained in the tutorial How to redirect to the Google login)

WebMailSend: Used to send mails (the service is provided via a Web component as explained in the tutorial How to send direct mails)

Notifier1: Used to show notifications

SoundClick: Plays a sound when a button is pressed

NOTE: By default the ServiceURL attribute of all TinyWebDB components will be set to appinvtinywebdb.appspot.com. This will work but it's not a good practice for the final application. You should set up a specific service for tinywebdb as explained in the tutorial Creating a Custom TinyWebDB Service and then inform the service URL to all the TinyWebDB components

Main screen

Finally here is the template's second screen, i.e. the one that will be opened when user presses any menu option. If you use this template in a real app, this is the screen that will necessarily have to be adapted.

At the level of this template we simply include the header bar (which shows the logged user), a generic help window and a label (which shows the selected option). Both the header bar and the help window have the same interface we've already seen for Screen1 so we're not going to explain them again.

And that's all regarding the graphical interface. The app is designed and now it's time to program its behaviour. This will be explained in part 2.

# data[].attributes.attachment_link.description
Introduction This post shows how to create a login system using App Inventor. The objective of the post is twofold: on the one side to provide the sources of a working template that can be reused in further applications, and on the other side to explain the fundamentals of its development.

# data[].attributes.attachment_link.authors[].name
Curso de App Inventor 2 (José Luis Núñez)

# data[].attributes.attachment_link.title
WhatsAppInventor Firebase. (Chat en App Inventor con Firebase)

# data[].attributes.attachment_link.description
CUPÓN SÓLO VÁLIDO CURSO COMPLETO PARA YOUTUBE *** https://goo.gl/kVygGF ****************************************­**************************** Aprende a manejar Firebase en App Inventor haciendo una aplicación de mensajería PASO a PASO que podrás utilizar entre varios dispositivos.

# data[].attributes.headline
Firebase per guardar dades d'App Inventor

# data[].attributes.subject
Firebase per guardar dades d'App Inventor

# data[].attributes.attachment_link.title
Use Firebase to store data in the cloud in AppInventor for Android

# data[].attributes.attachment_link.description
Use Firebase to persist data from your app into the cloud. This video shows how to setup a Firebase account, and how to have AppInventor store data from a screen into the Firebase database. Firebase and Android are trademarks of Google.

# data[].attributes.body
Firebase+app inventor

# data[].attributes.attachment_link.readable_text
MIT App Inventor has played a big role in bringing programming to a wide range of audience, primarily high school students. One of the challenges that I have faced while teaching this to a young audience has been that once you progress beyond a certain set of features in App Inventor applications, you get to a tricky situation where you need to explain persistence of data.

App Inventor 2 has good support for local persistence of data via TinyDB and TinyWebDB. The former is a local persistence solution and the later is a managed database solution in the cloud. While TinyDB is good, it is time to look at Firebase, the hosted real-time database in the cloud from Google.

Note: For the purpose of this beginner tutorial, I will be referring to Firebase as just the database and not the entire mobile development platform that it currently now is. If its been a while that you have looked at Firebase, I suggest you do so again - it offers a database, notifications, development tools, authentication, crash reporting, analytics and more.

My goal in this tutorial is to show you to write an Android application backed by a state of the art solution i.e. Firebase. We will not write any Java code for our Android application and instead rely on App Inventor. Programming for the masses needs to be simpler than writing low level programming code, isn't it? Let's see if you agree with me by the end of this post.

This tutorial is not an introduction to App Inventor 2 or setting up of its tools. There is great documentation available at the official site to help you do that. Check it out below if you need help on that. I will assume that you know how to navigate through App Inventor 2 and are familiar with Design and Blocks, the two key screens in any App Inventor 2 project.

Our Android Application - Bus Route Status

Our Android application is about an organization that runs a transport bus everyday to bring its employees to work every morning. This organization runs 4 buses every day in the morning, which start from different corners of the city (Mumbai in this case!) and then it navigates through the unforgiving Mumbai traffic to finally reach its office location.
In summary, we have 4 bus routes (Andheri, Borivali, Thane and Navi Mumbai). Each bus route consists of several stops.
The organization would like provide a simple Android application to its bus co-ordinators (1 or more per bus). The job of these bus co-ordinators is simple. They will use this Android app, select the bus route and then enter the last bus stop that the bus has just arrived at. If there are any issues/incidents with the bus route, they can note that down too.

All the commuters of this bus can also use this application to get the current status of the bus i.e. which route has just passed. They could then get a sense of where the bus was last and if there are any issues.

The bus route updates will all be captured in the Firebase database running in the cloud. We will also query the database whenever the user asks for a particular bus route status.

Firebase Setup

The first step for us is to setup the Firebase database in the cloud. The instructions are given below:

Visit https://console.firebase.google.com/ and login with your Google account.

You will see the welcome screen with two buttons as shown below:

Click on Create New Project button.

This will bring up the Create a project screen as shown below, where you will need to provide a project name. Note that you will need to provide a unique name for your project. Select a Country/region where you would like your database to be hosted. Click on Create Project.

Be patient. This will create a Firebase database under the Spark Plan. This plan is free and is good enough for our scenario. As an example of what the Spark plan gives us, take a look at this table.

To iterate again, we are only going to look at the Database feature of Firebase and not other services for now. Click on the Database link on the left. This will show up some details about your database as shown below:

Important: Please note down your database URL as highlighted in the screen above. This is the unique database url that is available to the outside world for integration. In our case, the Android application that we shall be writing in App Inventor will be using this unique URL as our backend database. Simple!

Another point to note here is that it shows the database name and a null next to it. This means that currently there is no data in the database. Keep this screen handy, you will be coming back to it and can see the database live here as it comes in. Even if not live, you can see what the data currently is in the database over here.

Click on the Rules tab. You will notice that it has the following rules by default as shown below. Let's not get too much into rules for now but it is sufficient to understand that why the magic text indicates is that to do database reads and writes, you will need to be authenticated. Firebase supports multiple authentication mechanisms, but we will keep it simple for now and not use any authentication. Note that what we are going to do is not good practice but it is ok for our tutorial here. What we are going to do is open up access to this Firebase database to allow anyone (everyone) to both read and write.

Click on Projects → Start New Project. This will bring up a screen where you can give a name to your project. Choose any name. I choose OfficeBusProject as shown below. Click on OK and you will be navigated to the Project Design window.

The next step is for us to design our Application. We will keep things simple and the screenshot for the application is given below:

Notice that I have added two non-visible components. The FirebaseDB component is available under the Experimental section of the Palette as shown below:

Collect the values in the Bus Route, Bus Stop Name and Comments. There are no validations currently but that is something that could be an exercise for the student.

Invoke the Firebase component StoreValue method. The StoreValue method takes two parameters, the tag and the valueToStore. Let us understand what this will do. As mentioned, we want to save the last bus stop name and any incidents(Comments). We would like to cleanly separate and organize this information for each bus route. So what we want is a hierarchical structure for each of the 4 Bus Routes.

The screenshot below shows the different User Interface components that reflect the single screen that we will be having in our application:

The important thing to configure next is our FirebaseDB1 component that we added to the screen. Click on the FirebaseDB1 component and see the properties. App Inventor hosts a service in the backend where you can use their hosted (Default) version of Firebase, but we will be using our database that we created in the earlier section. So to do that, we will need to give the value in the FirebaseURL property as the one that you noted down earlier. Set that value in the FirebaseURL property and deselect the Default value (Set it to not selected). An example screenshot is shown below. Note that you can ignore the FirebaseToken and the ProjectBucket is set by default to your App Inventor Project Name. Leave it or change it to anything you like. This will have an impact on how your database values are finally stored, which we shall see in a while.

Earlier, when we are talking about the application, we described that there will be 4 Bus Routes. These values will go into the spnBusRoute Spinner control. We set the values (Comma Separated) in the properties itself.

The entire set of blocks is given below. Note that we declare 3 variables for each of the values that we want to collect and initialize them to empty values. We then store the values from the user interface components into these values and then we invoke the FirebaseDB components' StoreValue method twice. Once for the Bus Stop Name and the other for the Comments.

Now try running the code for the first time. Just select one bus route and put in some values for bus stop name and the comments. Click on Update Bus Route button. If all is well, you will see an entry in the database. Go to the Firebase Console again and see the Database section. A sample run is shown below:

Now go ahead and do that for all the bus stops and even try to update a Bus Route with multiple stops, it will overwrite correctly the last value.

The Bus Stop and Comments are free text fields that will be input by the bus coordinator themselves.

The rest of the screen is self explanatory. As a Bus coordinator, you can select the Bus Route from the drop down. Then you can enter the values for the Bus Stop Name and Comments (if any) and click on the Update Bus Route button.

To do that, simply start editing the text to the one that is shown below:

Click on Publish. This will publish (associate) the rules with your database. It also indicates clearly (and which is good by the way) that we have defined our database to be accessed by the public (read and write). Boys and Girls, don't try this at home (sorry ... don't try this in a live database).

That's it. We have a Firebase database in the cloud, all ready for read and write. Now, all we need is to write this to our Android application.

Enter App Inventor 2 now for completing our Android application.

Writing our Android Application

Go ahead and login to App Inventor 2 now. Once logged in with your Google account, do the following:

App Inventor blocks for Update Bus Route

Now switch over to the Blocks section of the application. All we need to do now on click on the Update Bus Route button is the following:

Bus Route 1
 | - - Last Updated Stop
 | - - Comments
Bus Route 2
 | - - Last Updated Stop
 | - - Comments
Bus Route 3
 | - - Last Updated Stop
 | - - Comments
Bus Route 4
 | - - Last Updated Stop
 | - - Comments

So in other words, when we actually save the values, it would look something like this:

Borivali
 | - - Last Updated Stop : <Stop-Name>
 | - - Comments : <Stop-Comments>
Thane
 | - - Last Updated Stop : <Stop-Name>
 | - - Comments : <Stop-Comments>
Navi Mumbai
 | - - Last Updated Stop : <Stop-Name>
 | - - Comments : <Stop-Comments>
Andheri
 | - - Last Updated Stop : <Stop-Name>
 | - - Comments : <Stop-Comments>

Cool, isn't it?

Trivia: Do note that while the Bus Route names are valid ones in Mumbai, the sample values used for the Bus Stops are not or maybe they are? Find out which ones are valid?

Different screens or apps for bus coordinators and just users.

Provide validations for the Bus Stop Names and Comments. Ensure that it is not empty or has sensible values. Maybe provide a drop down list for the Bus Stop Names instead of Free form to avoid errors.

Introduce the concept of a date and time for the bus journeys. Over time, this data could be used to do some analytics on whether the buses run on time, etc.

Collecting a list of comments rather than overwriting the comment each time. Firebase supports that. Maybe we will have another tutorial on that.

Capture location of the bus via App Inventor 2 and dump those location values in Firebase database too.

A better UI (you would have guessed that from my UI skills!)

Use Firebase Components' DataChanged event. This will be fired whenever the data changes and you can then update the screen information accordingly:

It is important that you see the almost real-time capabilities of Firebase here. While trying out the functions, keep your Firebase database console open and notice the values coming in. It makes for great viewing!

Error Handling

There could be an error while dealing with the Firebase service, since that is running in the cloud, needs connectivity from your Android application and more. It would be a good practice to have a block that can handle any Firebase error that is thrown and then show a user friendly message. The block for that is shown below:

App Inventor blocks for Get Latest Route Info

While ideally I would have liked to show a real-time update when the Bus Route (that is an exercise mentioned later), we will simply query the Firebase Database about a Bus Route and update a few labels in the Android app. All the user does is select a Bus Route from the dropdown list and click on the Get Latest Route Info button.

First up, we will write the set of blocks for the button handler. Keep in mind that data over the web is retrieved asynchronously. What this means is that we will make the call to get the values and then we will receive an event with data.

So, let's look first at the set of blocks to ask for the Bus Route information:

We are using the GetValue method of the Firebase component. Notice how we are cleverly forming the path to the values for both Last Updated Stop and Comments. We are using the Bus Route Name and appending the "/Last Updated Stop" and "/Comments" text to retrieve the full path to their values. Notice the valueIfTagNotThere. If there is no value retrieved then we can give a default value to substitute for it (This is good practice).

The next thing to write is our block of codes which will get invoked once GetValue invocation actually results in a value being returned. To help retrieve that, there is a GotValue method in the Firebase component. The set of blocks are shown below. We have simple if blocks to check what the tag is and then use those values to update the respective Android Label fields.

This completes our tutorial and hopefully you get a sense of how easy it is to use Firebase and App Inventor 2 together. It makes for a great combination and I recommend some of the exercises shown below that you could use in your class.

Areas of improvement (Exercises for the Students)

There are multiple areas of improvements that you could do in the application. If you are a teacher, these are enhancements you could ask your students to do.

Here are a few of them:

Hope you enjoyed this tutorial. Please share your comments below.

# data[].attributes.attachment_link.title
Tutorial : MIT App Inventor + Firebase - Romin Irani's Blog

# data[].attributes.attachment_link.description
MIT App Inventor has played a big role in bringing programming to a wide range of audience, primarily high school students. One of the challenges that I have faced while teaching this to a young audience has been that once you progress beyond a certain set of features in App Inventor applications, you get to a tricky situation where you need to explain persistence of data.

# data[].attributes.body
Menú pestanyes

# data[].attributes.attachment_link.readable_text
Tabs make it easy to explore and switch between different views.

Tabs enable content organization at a high level, such as switching between views, data sets, or functional aspects of an app.

Present tabs as a single row above their associated content. Tab labels should succinctly describe the content within.

Because swipe gestures are used for navigating between tabs, don't pair tabs with content that also supports swiping.

Types

Fixed
Scrollable

Tab labels

Tab labels may include icons and text.

Color

Apply your app's accent color, or a contrasting color, to text fields and the text field cursor.

Usage

A tab provides the affordance for displaying grouped content. A tab label succinctly describes the tab's associated grouping of content.

Use tabs to organize content at a high level, for example, to present different sections of a newspaper. Don't use tabs for carousels or pagination of content. Those use cases involve viewing content, not navigating between groups of content.

For more detail about using tabs for navigating top-level views, see "Tabs" in Navigation - Patterns.

Don't use tabs with content that supports the swipe gesture, because swipe gestures are used for navigating between tabs. For example, avoid using tabs in a map where content is pannable, or a list where items can be dismissed with a swipe.

Fixed tabs should be used with a limited number of tabs and when consistent placement will aid muscle memory. Scrollable tabs should be used when there are many or a variable number of tabs.

Tabs control the display of content in a consistent location.

Formatting specifications:

Present tabs as a single row. Wrap tab labels to a second line if needed, and then truncate.

Do not include a set of tabbed content within a tab.

Highlight the tab corresponding to the visible content.

Group tabs together hierarchically. Connect a group of tabs with its content.

Keep tabs adjacent to their content to maintain the relationship between the two.

Content

Content presented in tabs can vary widely, even between tabs. For example, tabs showing different years of an artist's portfolio or tabs containing different types of settings.

All content within a set of tabs should be related under a larger organizing principle (for example, Settings or Directions), with each tab's content mutually exclusive of the others'.

Tab labels should provide meaningful distinctions that logically organize associated content.

Tab labels may include icons and text. When choosing a text label, use short titles.

Avoid the need for cross-tab comparison of content. Significant cross-tab comparison may indicate the content would benefit from a different organization or presentation that places the content closer together.

Types of tabs

Depending on the platform and the context of use, tabbed content can be presented as either fixed tabs or scrollable tabs.

Fixed tabs display all tabs concurrently and are best used with content that benefits from quick pivots between tabs in fixed positions, such as switching transportation methods for directions in Google Maps.

Fixed tabs have equal width, calculated either as the view width divided by the number of tabs, or based on the widest tab label. To navigate between fixed tabs, touch the tab or swipe the content area left or right.

Scrollable tabs display a subset of tabs at any given moment. They can contain longer tab labels and a larger number of tabs than fixed tabs. Scrollable tabs are best used for browsing contexts in touch interfaces when users don't need to directly compare the tab labels.

To navigate between scrollable tabs, touch the tab or swipe the content area left or right. To scroll the tabs without navigating, swipe the tabs left or right.

Specs

The width of each tab can be calculated by taking the width of the view and dividing it by the number of tabs. Alternatively, make all tabs the width of the largest tab.

If the margin between the tab edge and view edge is 16dp or less, use full-width tabs instead of centered tabs.

Width minimum and maximum (inclusive of padding)

Maximum: 264dp

Minimum: 160dp for larger views, 72 dp for smaller views

Height

Padding

12dp left and right of text

20dp from bottom for a single line of text, 12dp from bottom for two lines of text

Alignment

Full-width for smaller views

Centered for larger views

Indicator

Height: 2dp

Color: #fff or accent color

Tabs with text only

Text

14sp Roboto Medium

12sp when wrapped across a maximum of two lines

All caps

Horizontally and vertically centered

Active color: #fff or accent color

Unfocused tab color: #fff 70%

The left-most tab content aligns with the keyline. Alignment varies between landscape and portrait to match the different keylines.

The width of each tab is independently calculated.

Width minimum and maximum (inclusive of padding)

Maximum (whichever fits and is smaller): 264dp or (the value of view size minus 56dp)

Minimum: 160dp for larger views, 72 dp for smaller views

Height

Padding

12dp left and right of text

20dp from bottom for a single line of text, 12dp from bottom for two lines of text

Indicator

Height: 2dp

Color: #fff or accent color

Text

14sp Roboto Medium

12sp when wrapped across a maximum of two lines

All caps

Vertically and horizontally centered

Active color: #fff or accent color

Unfocused tab color: #fff 70%

Width minimum and maximum (inclusive of padding)

Maximum (whichever fits and is smaller): 264dp or (the value of view size minus 56dp)

Minimum: 160dp for larger views, 72 dp for smaller views

Height

Alignment

Centered or aligned with left keyline

Text

13sp Roboto Medium

All caps

Horizontally and vertically centered

Wraps across a maximum of two lines

Active color: #fff or accent color

Unfocused tab color: #fff 70%

Padding

24dp left and right of text

20dp from bottom for a single line of text, 12dp from bottom for two lines of text

First tab text left padding: 80dp

Indicator

Height: 2dp

Color: #fff or accent color

Note: Implementations of this component may vary by platform. By using standard platform implementations, you will receive related future improvements.

# data[].attributes.attachment_link.description
Tabs make it easy to explore and switch between different views. Tabs enable content organization at a high level, such as switching between views, data sets, or functional aspects of an app. Present tabs as a single row above their associated content. Tab labels should succinctly describe the content within.

# data[].attributes.attachment_link.description
A collection of tools to easily generate assets such as launcher icons for your Android app.

# data[].attributes.headline
Iconfinder - 1,400,000+ free and premium icons

# data[].attributes.subject
Iconfinder - 1,400,000+ free and premium icons

# data[].attributes.attachment_link.title
8,425,000+ free and premium vector icons, illustrations and 3D illustrations

# data[].attributes.attachment_link.description
Iconfinder is the world's largest marketplace for icons, illustrations and 3D illustrations in SVG, AI, and PNG format.

# data[].attributes.headline
JSON Editor Online - view, edit and format JSON online

# data[].attributes.subject
JSON Editor Online - view, edit and format JSON online

# data[].attributes.body
Per editar , crear i guardar arxiu Json per importar amb FireBase

# data[].attributes.attachment_link.title
JSON Editor Online - view, edit and format JSON online

# data[].attributes.body
Per passar d'arxiu csv fet amb excell a Json

# data[].attributes.attachment_link.description
Online tool for converting CSV to JSON. Convert Excel to JSON. Transpose data. Output array or hash.

# data[].attributes.body
Base de dades per App Inventor

# data[].attributes.body
Per guardar dades a internet. Exemples d'us :Comptes d'usuari amb password, Dades d'usuaris, Xats.

# data[].attributes.body
15 dies de prova

# data[].attributes.attachment_link.description
When inspiration strikes, SketchBook is ready to capture it - on any device, wherever you are. Download a free trial with no credit card required.

# data[].attributes.body
Dibuix vectorial

# data[].attributes.attachment_link.readable_text
On April 2, we released Inkscape 1.3 alpha0 for testing!

Inkscape is hiring a senior C++ developer with GTK experience to accelerate the migration to GTK4.

We are eagerly awaiting your artwork submissions, created using only Inkscape, for our 1.3 About Screen Contest. This contest represents one of the highlights for contributors across the project - to see just how artists and designers are putting the vector editor's tools and features to great use.

# data[].attributes.attachment_link.authors[].name
New Discoveries Await by Chris Hildenbrand

# data[].attributes.attachment_link.description
On April 2, we released Inkscape 1.3 alpha0 for testing! Inkscape is hiring a senior C++ developer with GTK experience to accelerate the migration to GTK4. We are eagerly awaiting your artwork submissions, created using only Inkscape, for our 1.3 About Screen Contest.

# data[].attributes.body
Material multimèdia lliure

# data[].attributes.attachment_link.description
From Wikimedia Commons, the free media repository

# data[].attributes.attachment_link.description
En aquest espai podeu aprendre a utilitzar el GIMP, programa de retoc fotogràfic i tractament de la imatge digital, gràcies a la realització d' exercicis senzills però suggerents.

# data[].attributes.attachment_link.title
Powtoon | Create Awesome Videos Yourself

# data[].attributes.attachment_link.description
Powtoon gives you everything you need to easily make professional videos and presentations that your clients, colleagues, and friends will love! No design or tech skills are necessary - it's free, easy, and awesome!

# data[].attributes.body
Per crear webs, pòsters i vídeos  fàcil i ràpid

# data[].attributes.body
Sigues legal a Internet

# data[].attributes.body
Per crear webs, pòsters i vídeos  fàcil i ràpid

# data[].attributes.attachment_link.title
Crear Página Web gratis | Creador de Páginas Web | Wix.com

# data[].attributes.attachment_link.description
Crea una página web gratis con Wix. Más de 900 plantillas de diseño personalizables, hosting seguro, ecommerce, herramientas de marketing y SEO. ¡Prueba gratis!

# data[].attributes.attachment_link.readable_text
mSchools Student Awards és un concurs i cerimònia de lliurament de premis que reconeix la tasca realitzada per alumnes i docents durant el curs escolar dins el programa mSchools i les seves diferents iniciatives.

El reconeixement d'aquests premis està avalat per professionals de l'educació o de les tecnologies mòbils, que avaluaran els projectes segons els criteris especificats en les bases de cada concurs, i determinaran els equips guanyadors.

En la seva 4a edició, el concurs va acollir a 4.000 participants, 84 equips finalistes i més de 1.100 assistents!

Enguany, celebrem la 5a edició, el 9 de juny a la Farga de L'Hospitalet, amb novetats i més premis. Els participants podran presentar-se al concurs en les següents iniciatives:

App Education és una proposta didàctica centrada en el disseny d'apps i el desenvolupament de prototips englobada dins de l'assignatura d'informàtica de 3r i 4t d'ESO, Batxillerat i Cicles Formatius que s'imparteix a Catalunya. La proposta té com a objectiu millorar les competències digitals i estimular l'esperit emprenedor entre els alumnes amb el suport de mentors experts de la indústria, els mSchools Experts.

Enguany, la convocatòria està oberta per a alumnes d' ESO, Batxillerat i Cicles Formatius de centres educatius de Catalunya.

S'estableixen 4 modalitats de projectes que poden presentar-se a concurs:

Comunitats sostenibles

Inclusió, equitat i educació accessible

Empresa i serveis connectats

Creació artística-cultural

Els equips guanyadors seran recompensats amb l'oportunitat d'assistir al mSchools TechCamp, les colònies d'estiu que combinen activitats a l'aire lliure amb l'aprenentatge dels diferents aspectes del desenvolupament digital.

Ja pots consultar les bases i annex de la modalitat d'App Education i descobrir com pots participar!

Mobile History Map és una eina educativa que promou el treball transversal per projectes mitjançant la tecnologia mòbil, i que permet als alumnes geolocalitzar i crear continguts sobre punts d'interès propers als seus centres educatius.

En aquesta edició, el concurs està obert als alumnes dels centres de Primària, de Secundària i dels Serveis Educatius del Departament d'Ensenyament de Catalunya.

El premi pels equips guanyadors serà una càmera 360° i un set de 5 ulleres de realitat virtual.

Consulta les i annex del concurs i participa!

Després de l'èxit de participació en la 4a edició dels Student Awards, volem tornar a premiar els millors projectes de Scratch dels alumnes de Cicle Mig i Superior de Primària (3r, 4t, 5è i 6è) i ESO (1r i 2n).

Scratch és un llenguatge de programació lliure orientat a l'ensenyament que facilita la creació d'històries interactives, simulacions, jocs i animacions, i a compatir les creacions online. La iniciativa té l'objectiu de promoure les competències digitals i desenvolupar el pensament creatiu entre els més joves.

En la convocatòria d'enguany, els participants hauran de presentar a concurs projectes desenvolupats mitjançant el llenguatge Scratch basats en el repte "De grans serem... ".

Aquesta idea general pot tenir diferents interpretacions, per exemple:

Un joc de reptes centrat en una professió en concret.

Una història on es trii una professió i es desenvolupi segons la tria feta.

Un joc de preguntes i respostes al voltant de les diferents professions.

Un joc de relacions entre professions i personatges coneguts

Els premiats al concurs Scratch Challenge participaran en els mSchools TechCamp durant tota una jornada.

Consulta les bases i annex d'aquesta modalitat i descobreix com pots participar-hi!
Visita la galeria d'imatges dels mSchools Student Awards 2017
#mSchoolsStudentAwards

# data[].attributes.attachment_link.description
mSchools Student Awards és un concurs i cerimònia de lliurament de premis que reconeix la tasca realitzada per alumnes i docents durant el curs escolar dins el programa mSchools i les seves diferents iniciatives.

# data[].attributes.attachment_link.description
Listen online to relaxing sound atmospheres, ambient music or chilling sound effects. You can even create and mix your own moods, all for free.

# data[].attributes.attachment_link.title
Bfxr. Make sound effects for your games.

# data[].attributes.attachment_link.description
Sound-effects generation for your games in flash.

# data[].attributes.attachment_link.description
Cool Text is a FREE graphics generator for web pages and anywhere else you need an impressive logo without a lot of design work

# data[].attributes.attachment_link.readable_text
draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit diagram maker, and more. draw.io can import .vsdx, Gliffy™ and Lucidchart™ files .

Loading...

Please ensure JavaScript is enabled.

# data[].attributes.attachment_link.title
Flowchart Maker & Online Diagram Software

# data[].attributes.attachment_link.description
draw.io is free online diagram software for making flowcharts, process diagrams, org charts, UML, ER and network diagrams

# data[].attributes.body
House of buttons

# data[].attributes.attachment_link.description
A collection of great UI buttons spotted in the wild. Curated by MaxButtons. Submissions welcome.

# data[].attributes.attachment_link.description
Check out the finest collection of design patterns, resources, mobile apps and inspiration

# data[].attributes.attachment_link.description
A library of iOS and Android screenshots for designers and developers to reference.

# data[].attributes.attachment_link.title
iOS Patterns | Mobile User Interface and Designs for iPhone and iPad

# data[].attributes.attachment_link.description
iOS Patterns is a gallery with the best iOS app designs and User Interfaces for iPhone and iPad