SlideShare a Scribd company logo
1 of 44
Download to read offline
TiAppCamp Alloy Overview

JAMIL HASSAN SPAIN,
SOLUTIONS ARCHITECT
@JAMILSPAIN
SKYPE: JAMIL.HASSAN.SPAIN

© 2011 Appcelerator, Inc.!
Little Bit About Me
•  Career software Engineer
• From North Carolina, home of
RedHat ( Big Fedora Fan )
• Started with PHP in early days 3.x
or PHP F/I
• Few years in Education, Cisco,
open consulting market,
entrepreneur to AppC in 2011
• Started career as Training
Instructor for Titanium
Certifications
• Currently Solutions Architect for
Enterprise Sales
UIF-2
© 2011 Appcelerator, Inc.!
Alloy Overview

UIF-3
© 2011 Appcelerator, Inc.!
Overview & Goals
•  Titanium Classic was the de facto standard
• Resulted in many different implementations ( code generation )
• Projects passed had learning curves, “learn my
style” ( business )
• Many community solutions popped up.. Extanium

•  MVC separates form and function
• Speed and simplify development
• Improve maintainability

•  Alloy is Appcelerator’s MVC-like framework for Titanium
UIF-4
© 2011 Appcelerator, Inc.!
Alloy MVC Components
•  Everything from Titanium Classic +
• 
• 
• 
• 
• 

Views
Styles
Controllers
Models
Widgets

Alloy acts as a Pre-Compiler to convert MVC output to
Titanium Classic Code in Resources Folder.
UIF-5
© 2011 Appcelerator, Inc.!
View – Index.xml
Alloy View != Ti.UI.View ( that <div> like thing). We’re
talking MVC View here.

<Alloy>
<Window class="container">
<Label id="label" onClick="doClick">Hello,
World</Label>
</Window>
</Alloy>

UIF-6
© 2011 Appcelerator, Inc.!
Styles – Fugitives.tss
".container": {
backgroundColor: "white"
},
"Tab" : {
icon: '/images/fugitives.png',
},
"Window": {
backgroundColor:'transparent',
backgroundImage: 'images/grain.png',
title: 'Fugitives',
barColor: '#6d0a0c',
},
'#table' : {
backgroundColor: 'transparent'
}
© 2011 Appcelerator, Inc.!
Controllers
function doClick(e) {
alert($.label.text);
}
$.index.open();

© 2011 Appcelerator, Inc.!
Models
exports.definition = {
config : {
"columns" : {
"name" : "string",
"captured" : "integer",
"url" : "string",
"capturedLat" : "real",
"capturedLong" : "real"
},
"adapter" : {
"type" : "sql",
"collection_name" : "fugitives"
}
},
}
© 2011 Appcelerator, Inc.!
Convention Over Configuration
File/Directory

Contents & Purpose

/app/config.json

Specify global values, conditional environment and
operating system values, and widget dependencies.

/app/views

XML View files

/app/styles

TSS Style Files

/app/controllers

JavaScript Controller Files

/app/models

JavaScript Model Files

/app/migrations

JSON files that describe incremental changes in your
database, in the format DATETIME_modelname.json

/app/assets

Graphic, data file, and other app assets; not created
by default

/app/lib

App-specific library files; not created by default.

/app/themes

Theme files and assets to customize your UI; not
created by default

/app/widgets

Files and assets associated with widgets ( selfcontained app components )
© 2011 Appcelerator, Inc.!
Controllers
in Depth

UIF-11
© 2011 Appcelerator, Inc.!
Controllers
•  Contain the application logic
•  Communicate between Views and Models
•  Handle user interaction and dynamic UI updates
•  Access components via their id attribute: $.idstring

© 2011 Appcelerator, Inc.!
Views Without IDs
// index.xml
<Alloy>
<Window class="container">
<Label id="label"
onClick="doClick">Hello, World</Label>
</Window>
</Alloy>

* Controller name
determines controller
open() unless you assign
an ID for root element
( window )

// index.xml
<Alloy>
<Window class="container" id="mainwin">
<Label id="label" onClick="doClick">Hello, World</Label>
</Window>
</Alloy>
// in index.js
// Window tag has an id, so $.index.open() would fail!
$.mainwin.open();
© 2011 Appcelerator, Inc.!
Event Handling
/* listening for an event on a Ti object with id of 'button' */
$.button.addEventListener('click', function(e){
// do something
});
// firing an event
$.button.fireEvent('click', {foo: 'bar'});
// adding and removing an event
var listener = function() {
Ti.API.info("Event listener called.");
}
$.win.addEventListener('click', listener);
$.win.removeEventListener('click', listener);

© 2011 Appcelerator, Inc.!
Dynamically Creating Views
Alloy.createController – factory method for instantiating
controller

Controller.getView – return the view associated with the
controller

Controller.#element – allows access directly to view elements
// controller file something like index.js
// we're dynamically loading and showing some other view
var foo = Alloy.createController('foo').getView();
foo.open();
var foo = Alloy.createController(‘foo’);
foo.mainwin.open();
© 2011 Appcelerator, Inc.!
Controllers as Factories
Using custom rows in a tableview

var rows = [];
// arr is some array of data to show in a table
for (var i = 0; i < arr.length; i++) {
var row = Alloy.createController('CustomRow', arr[i].toJSON()).getView();
rows.push(row);
}
// set the table
$.table.setData(rows);

© 2011 Appcelerator, Inc.!
Passing Arguments
Pass arguments when initializing a controller
// controller row.js
var args = arguments[0] || {};
$.rowView.title = args.title || '';
$.rowView.url = args.url || '';

// Controller index.js
var data[];

for (var i=0; i < source.length; i++) {
var arg = {
title: source[i].postTitle,
url: source[i].postLink
};
var row = Alloy.createController('row', arg).getView();
data.push(row);
}
$.tableView.setData(data);
© 2011 Appcelerator, Inc.!
Controller Communication “into”
Publish public methods for controllers

// Controller index.js
var web = Alloy.createController(“index2”);
web.updateWebView(‘google.com’);
// Controller index2.js
exports.updateWebView = function(webpage){
$.web.setUrl(webpage);
}

© 2011 Appcelerator, Inc.!
Controller Communication “outside”
Trigger Events outside controllers

// Controller index.js( index.xml )
<Require id=“bottom” onClick=“bottomBarClick” src=“index2” />
// Controller index2.js
$.button.addEventListener(‘click’, function()
{
$.trigger(‘click’, {
action: “show”,
menu: “events”
});
});

© 2011 Appcelerator, Inc.!
Controller Communication “outside”
Trigger Events outside controllers
// Controller index.js( index.xml )
<Require id=“bottom” onClick=“bottomBarClick” src=“index2” />
// Controller index2.js
$.button.addEventListener(‘click’, function()
{
$.trigger(‘click’, {
action: “show”,
menu: “events”
});
});

© 2011 Appcelerator, Inc.!
Alloy Views &
Styles in Detail

UIF-21
© 2011 Appcelerator, Inc.!
View Tag Require
// From other file like TabGroup/Window
<Require type="view" src="fugitives" id="fugitivetab"/>
// view file - fugitives.xml
<Alloy>
<ImageView id='foo' image='foo.png'/>
</Alloy>
// style file – fugitives.tss
"#foo": {
height:Ti.UI.SIZE,
width: Ti.UI.SIZE
}
© 2011 Appcelerator, Inc.!
NameSpaces “View Language”
•  Imagine a create with <View, <NavigationGroup
•  Defaults to the “Ti.UI” namespace
* Create Elements not in the Ti.UI namespace:
// for objects not in Ti.UI namespace, such as Ti.Map.View:
<View ns="Ti.Map" id="map"/>
// for objects in sub-namespaces, such as
Ti.UI.iOS.NavigationGroup:
<NavigationGroup platform="ios,mobileweb"/>

© 2011 Appcelerator, Inc.!
Style Files
•  Component, class, and ID
•  Global app.tss
•  Constants
•  i18n functions
•  Alloy Globals

© 2011 Appcelerator, Inc.!
Style Files
•  Component, class, and ID
•  Global app.tss
•  Constants
•  i18n functions
•  Alloy Globals

".activeButton": {
backgroundColor:"blue"
},
"Button": {
width: Ti.UI.SIZE,
height: Ti.UI.SIZE,
color: "#000"
},
"#iosBtn": {
color: "#999",
systemButton:
Titanium.UI.iPhone.SystemButton.DISCLOSURE,
title: L('iosbutton'),
left: Alloy.Globals.computedWidth
}
© 2011 Appcelerator, Inc.!
Platform
Handling

UIF-26
© 2011 Appcelerator, Inc.!
Platform & Form Factor
•  Conditional Code
•  App assets
•  Platform Build-time Folders
•  Markup-based Techniques
•  TSS-based Qualifiers

© 2011 Appcelerator, Inc.!
Conditional Code
•  OS_IOS, OS_Android, OS_MOBILEWEB
•  ENV_DEV, ENV_TEST, ENV_PRODUCTION

if (ENV_DEV && OS_IOS) {
alert("You are running iOS in the simulator");
}

© 2011 Appcelerator, Inc.!
Asset Folders

© 2011 Appcelerator, Inc.!
Platform Overrides
Work for Views, styles, and controllers.. Let me explain

© 2011 Appcelerator, Inc.!
Platform and Device Markup
<Alloy>
<Window class="container">
<View formFactor="handheld">
<Label>I'm a handheld!</Label>
</View>
<View formFactor="tablet">
<Label>I'm a tablet!</Label>
</View>
<View height="50" width="200" bottom="10" backgroundColor="#cdcdcd">
<Label class="platformLbl" platform="android" formFactor="tablet">android tablet</Label>
<Label class="platformLbl" platform="android" formFactor="handheld">android handset</
Label>
<Label class="platformLbl" platform="ios" formFactor="tablet">ios tablet</Label>
<Label class="platformLbl" platform="ios" formFactor="handheld">ios handset</Label>
</View>
</Window>
</Alloy>

© 2011 Appcelerator, Inc.!
TSS-Based Qualifiers
"#mybutton[platform=android]" : {
height:'40dp',
},
"#mybutton[platform=ios]" : {
height:50,
},
"#osLabel[platform=ios formFactor=tablet]": {
text: "iPad"
},
"#osLabel[platform=ios formFactor=handheld]": {
text: "iPhone"
},

© 2011 Appcelerator, Inc.!
Configurations
// config.json file
{
"global": { "foo": 1},
"env:development": {},
"env:test": {},
"env:production": {},
"os:ios": { "foo": 2 },
"os:android": {},
"dependencies": {}
}
// in your code
alert(Alloy.CFG.foo); // value is 1 or 2 depending on OS
© 2011 Appcelerator, Inc.!
Themes
•  Named collection of styles and assets
•  Applied via setting in the config.json file ( can be
platform-specific )
•  Theme settings override base styles and assets
•  Overrides are made on an attribute by attribute
basis, not whole files

© 2011 Appcelerator, Inc.!
Themes Example
// file system structure
app/
assets/
appicon.png
background.png
styles/
app.tss
index.tss
themes/
mytheme/
assets/
background.png
styles/
app.tss
green/
...

// config.json
{
"global": {
"theme":"mytheme"
},
"env:development": {},
"env:test": {},
"env:production": {},
"os:ios": {
"theme":"green"
},
"os:android": {
"theme":"blue"
},
"dependencies": {}
}

© 2011 Appcelerator, Inc.!
Alloy vs. “Traditional”
•  It’s not all or nothing – Ti.UI.createView() and its
brethren still are valid
•  API techniques used withing controllers, in helper
libraries ( network, database, etc )
•  Alloy is essentially a pre-compiler
•  In the end, Alloy creates traditional “classic” code for
you – Check out the Resources Folder!!!

© 2011 Appcelerator, Inc.!
Cool Utilities

UIF-37
© 2011 Appcelerator, Inc.!
TiShadow
•  Historically, we had to build an app and wait about 20
or so seconds for it to build.. Iterative dev process
•  Community Member David Bankier created TiShadow
• https://github.com/dbankier/TiShadow
•  Works as a way to cache the app build process and
through command line, allow you to speed your
workflow.
•  Involves installing NPM package, downloading Github
Package, starting the server, and running command
line to build each project individually.

© 2011 Appcelerator, Inc.!
TiShadow Install Steps
•  Npm install –g tishadow
•  Download git repo, import the project into Studio,
build project to install on simulator.
https://github.com/dbankier/TiShadow
•  Start the tishadow server component. Should be
available to http://localhost:3000
•  Command line to project your are working on and
run:
To Start: Tishadow run ( in root of project )
After updates, run this command:
alloy compile --config platform=ios && tishadow run
© 2011 Appcelerator, Inc.!
Introducing LiveView
•  Feature of our Appcelerator Studio which comes with
Appcelerator Platform
•  Based on TiShadow theory, allows you to rapidly
prototype your application UI.
•  Quick Demo of the power .. Included with
Appcelerator Platform subscription
•  Other Enterprise Features are here:
•  http://docs.appcelerator.com/platform/latest/#!/
guide/Enterprise_Features
© 2011 Appcelerator, Inc.!
Other Enterprise Features
•  App Analytics for all your applications
•  Appcelerator Studio which includes LiveView, Code
Analysis, and Code Profiler.
http://docs.appcelerator.com/platform/latest/#!/
guide/Enterprise_Features
•  More information about the Platofrm
•  http://www.appcelerator.com/products/

© 2011 Appcelerator, Inc.!
Appcelerator Test
•  Integrated Functional Test Automation to improve the
workflow of your QA process

© 2011 Appcelerator, Inc.!
Appcelerator Performance Management
•  Captures data in real-time to provide actionable
information about user, device and application problems

© 2011 Appcelerator, Inc.!
Thank you
JAMIL HASSAN SPAIN
@JAMILSPAIN
SKYPE: JAMIL.HASSAN.SPAIN
JSPAIN@APPCELERATOR.COM

© 2011 Appcelerator, Inc.!

More Related Content

What's hot

Introduction to the new SharePoint 2013 App Model
Introduction to the new SharePoint 2013 App ModelIntroduction to the new SharePoint 2013 App Model
Introduction to the new SharePoint 2013 App ModelNoorez Khamis
 
Creating Single Page Applications with Oracle Apex
Creating Single Page Applications with Oracle ApexCreating Single Page Applications with Oracle Apex
Creating Single Page Applications with Oracle ApexDick Dral
 
Oracle Application Express 20.2 New Features
Oracle Application Express 20.2 New FeaturesOracle Application Express 20.2 New Features
Oracle Application Express 20.2 New Featuresmsewtz
 
Android SharePoint
Android SharePointAndroid SharePoint
Android SharePointBenCox35
 
Application express
Application expressApplication express
Application expressAntony Alex
 
Oracle Web ADI Implementation Steps
Oracle Web ADI Implementation StepsOracle Web ADI Implementation Steps
Oracle Web ADI Implementation Stepsstandale
 
Integration of APEX and Oracle Forms
Integration of APEX and Oracle FormsIntegration of APEX and Oracle Forms
Integration of APEX and Oracle FormsRoel Hartman
 
The SharePoint 2013 App Model
The SharePoint 2013 App ModelThe SharePoint 2013 App Model
The SharePoint 2013 App ModelSPC Adriatics
 
Oracle Apex Technical Introduction
Oracle Apex   Technical IntroductionOracle Apex   Technical Introduction
Oracle Apex Technical Introductioncrokitta
 
Oracle apex-hands-on-guide lab#1
Oracle apex-hands-on-guide lab#1Oracle apex-hands-on-guide lab#1
Oracle apex-hands-on-guide lab#1Amit Sharma
 
UNYOUG - APEX 19.2 New Features
UNYOUG - APEX 19.2 New FeaturesUNYOUG - APEX 19.2 New Features
UNYOUG - APEX 19.2 New Featuresmsewtz
 
Oracle APEX Dynamic Actions
Oracle APEX Dynamic ActionsOracle APEX Dynamic Actions
Oracle APEX Dynamic ActionsAnthony Rayner
 
Electronic patients records system based on oracle apex
Electronic patients records system based on oracle apexElectronic patients records system based on oracle apex
Electronic patients records system based on oracle apexJan Karremans
 
Introducing the new SharePoint 2013 app model
Introducing the new SharePoint 2013 app modelIntroducing the new SharePoint 2013 app model
Introducing the new SharePoint 2013 app modelJeremy Thake
 
APEX Boston Meetup - October 1st, 2019
APEX Boston Meetup - October 1st, 2019APEX Boston Meetup - October 1st, 2019
APEX Boston Meetup - October 1st, 2019msewtz
 
Web adi success story
Web adi success storyWeb adi success story
Web adi success storyguesta7771aa
 
Oracle application express
Oracle application expressOracle application express
Oracle application expressAbhinaw Kumar
 
Apex basics-for Beginners
Apex basics-for BeginnersApex basics-for Beginners
Apex basics-for Beginnershrakhra
 

What's hot (20)

Introduction to the new SharePoint 2013 App Model
Introduction to the new SharePoint 2013 App ModelIntroduction to the new SharePoint 2013 App Model
Introduction to the new SharePoint 2013 App Model
 
Oracle APEX
Oracle APEXOracle APEX
Oracle APEX
 
Creating Single Page Applications with Oracle Apex
Creating Single Page Applications with Oracle ApexCreating Single Page Applications with Oracle Apex
Creating Single Page Applications with Oracle Apex
 
Oracle Application Express 20.2 New Features
Oracle Application Express 20.2 New FeaturesOracle Application Express 20.2 New Features
Oracle Application Express 20.2 New Features
 
Intro to Application Express
Intro to Application ExpressIntro to Application Express
Intro to Application Express
 
Android SharePoint
Android SharePointAndroid SharePoint
Android SharePoint
 
Application express
Application expressApplication express
Application express
 
Oracle Web ADI Implementation Steps
Oracle Web ADI Implementation StepsOracle Web ADI Implementation Steps
Oracle Web ADI Implementation Steps
 
Integration of APEX and Oracle Forms
Integration of APEX and Oracle FormsIntegration of APEX and Oracle Forms
Integration of APEX and Oracle Forms
 
The SharePoint 2013 App Model
The SharePoint 2013 App ModelThe SharePoint 2013 App Model
The SharePoint 2013 App Model
 
Oracle Apex Technical Introduction
Oracle Apex   Technical IntroductionOracle Apex   Technical Introduction
Oracle Apex Technical Introduction
 
Oracle apex-hands-on-guide lab#1
Oracle apex-hands-on-guide lab#1Oracle apex-hands-on-guide lab#1
Oracle apex-hands-on-guide lab#1
 
UNYOUG - APEX 19.2 New Features
UNYOUG - APEX 19.2 New FeaturesUNYOUG - APEX 19.2 New Features
UNYOUG - APEX 19.2 New Features
 
Oracle APEX Dynamic Actions
Oracle APEX Dynamic ActionsOracle APEX Dynamic Actions
Oracle APEX Dynamic Actions
 
Electronic patients records system based on oracle apex
Electronic patients records system based on oracle apexElectronic patients records system based on oracle apex
Electronic patients records system based on oracle apex
 
Introducing the new SharePoint 2013 app model
Introducing the new SharePoint 2013 app modelIntroducing the new SharePoint 2013 app model
Introducing the new SharePoint 2013 app model
 
APEX Boston Meetup - October 1st, 2019
APEX Boston Meetup - October 1st, 2019APEX Boston Meetup - October 1st, 2019
APEX Boston Meetup - October 1st, 2019
 
Web adi success story
Web adi success storyWeb adi success story
Web adi success story
 
Oracle application express
Oracle application expressOracle application express
Oracle application express
 
Apex basics-for Beginners
Apex basics-for BeginnersApex basics-for Beginners
Apex basics-for Beginners
 

Similar to TiAppCamp Atlanta 2013: Alloy Overview

Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013ralcocer
 
Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013Ricardo Alcocer
 
Riding the Edge with Ember.js
Riding the Edge with Ember.jsRiding the Edge with Ember.js
Riding the Edge with Ember.jsaortbals
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Pythongturnquist
 
Getting started with Appcelerator Titanium
Getting started with Appcelerator TitaniumGetting started with Appcelerator Titanium
Getting started with Appcelerator TitaniumTechday7
 
Getting started with titanium
Getting started with titaniumGetting started with titanium
Getting started with titaniumNaga Harish M
 
Lec005 android start_program
Lec005 android start_programLec005 android start_program
Lec005 android start_programEyad Almasri
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...Mark Leusink
 
The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...Mark Roden
 
Modeveast Appcelerator Presentation
Modeveast Appcelerator PresentationModeveast Appcelerator Presentation
Modeveast Appcelerator PresentationAaron Saunders
 
Building your first android app using Xamarin
Building your first android app using XamarinBuilding your first android app using Xamarin
Building your first android app using XamarinGill Cleeren
 
Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010Lars Vogel
 
modeveast 2012 Appcelerator Alloy & Cloud Services Presentation
modeveast 2012 Appcelerator Alloy & Cloud Services Presentationmodeveast 2012 Appcelerator Alloy & Cloud Services Presentation
modeveast 2012 Appcelerator Alloy & Cloud Services PresentationAaron Saunders
 
Data Governance - Atlas 7.12.2015
Data Governance - Atlas 7.12.2015Data Governance - Atlas 7.12.2015
Data Governance - Atlas 7.12.2015Hortonworks
 
Titanium Alloy Framework
Titanium Alloy FrameworkTitanium Alloy Framework
Titanium Alloy FrameworkTechday7
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentationAlan Hietala
 
Creating a World-Class RESTful Web Services API
Creating a World-Class RESTful Web Services APICreating a World-Class RESTful Web Services API
Creating a World-Class RESTful Web Services APIDavid Keener
 

Similar to TiAppCamp Atlanta 2013: Alloy Overview (20)

Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013
 
Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013Appcelerator Alloy Deep Dive - tiTokyo 2013
Appcelerator Alloy Deep Dive - tiTokyo 2013
 
Riding the Edge with Ember.js
Riding the Edge with Ember.jsRiding the Edge with Ember.js
Riding the Edge with Ember.js
 
Intro to appcelerator
Intro to appceleratorIntro to appcelerator
Intro to appcelerator
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Python
 
Getting started with Appcelerator Titanium
Getting started with Appcelerator TitaniumGetting started with Appcelerator Titanium
Getting started with Appcelerator Titanium
 
Getting started with titanium
Getting started with titaniumGetting started with titanium
Getting started with titanium
 
Lec005 android start_program
Lec005 android start_programLec005 android start_program
Lec005 android start_program
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...
 
The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...
 
Modeveast Appcelerator Presentation
Modeveast Appcelerator PresentationModeveast Appcelerator Presentation
Modeveast Appcelerator Presentation
 
Building your first android app using Xamarin
Building your first android app using XamarinBuilding your first android app using Xamarin
Building your first android app using Xamarin
 
Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010
 
modeveast 2012 Appcelerator Alloy & Cloud Services Presentation
modeveast 2012 Appcelerator Alloy & Cloud Services Presentationmodeveast 2012 Appcelerator Alloy & Cloud Services Presentation
modeveast 2012 Appcelerator Alloy & Cloud Services Presentation
 
3. react - native: component
3. react - native: component3. react - native: component
3. react - native: component
 
Data Governance - Atlas 7.12.2015
Data Governance - Atlas 7.12.2015Data Governance - Atlas 7.12.2015
Data Governance - Atlas 7.12.2015
 
Titanium Alloy Framework
Titanium Alloy FrameworkTitanium Alloy Framework
Titanium Alloy Framework
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentation
 
Creating a World-Class RESTful Web Services API
Creating a World-Class RESTful Web Services APICreating a World-Class RESTful Web Services API
Creating a World-Class RESTful Web Services API
 
Titanium Alloy Tutorial
Titanium Alloy TutorialTitanium Alloy Tutorial
Titanium Alloy Tutorial
 

Recently uploaded

Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 

Recently uploaded (20)

Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 

TiAppCamp Atlanta 2013: Alloy Overview

  • 1. TiAppCamp Alloy Overview JAMIL HASSAN SPAIN, SOLUTIONS ARCHITECT @JAMILSPAIN SKYPE: JAMIL.HASSAN.SPAIN © 2011 Appcelerator, Inc.!
  • 2. Little Bit About Me •  Career software Engineer • From North Carolina, home of RedHat ( Big Fedora Fan ) • Started with PHP in early days 3.x or PHP F/I • Few years in Education, Cisco, open consulting market, entrepreneur to AppC in 2011 • Started career as Training Instructor for Titanium Certifications • Currently Solutions Architect for Enterprise Sales UIF-2 © 2011 Appcelerator, Inc.!
  • 3. Alloy Overview UIF-3 © 2011 Appcelerator, Inc.!
  • 4. Overview & Goals •  Titanium Classic was the de facto standard • Resulted in many different implementations ( code generation ) • Projects passed had learning curves, “learn my style” ( business ) • Many community solutions popped up.. Extanium •  MVC separates form and function • Speed and simplify development • Improve maintainability •  Alloy is Appcelerator’s MVC-like framework for Titanium UIF-4 © 2011 Appcelerator, Inc.!
  • 5. Alloy MVC Components •  Everything from Titanium Classic + •  •  •  •  •  Views Styles Controllers Models Widgets Alloy acts as a Pre-Compiler to convert MVC output to Titanium Classic Code in Resources Folder. UIF-5 © 2011 Appcelerator, Inc.!
  • 6. View – Index.xml Alloy View != Ti.UI.View ( that <div> like thing). We’re talking MVC View here. <Alloy> <Window class="container"> <Label id="label" onClick="doClick">Hello, World</Label> </Window> </Alloy> UIF-6 © 2011 Appcelerator, Inc.!
  • 7. Styles – Fugitives.tss ".container": { backgroundColor: "white" }, "Tab" : { icon: '/images/fugitives.png', }, "Window": { backgroundColor:'transparent', backgroundImage: 'images/grain.png', title: 'Fugitives', barColor: '#6d0a0c', }, '#table' : { backgroundColor: 'transparent' } © 2011 Appcelerator, Inc.!
  • 9. Models exports.definition = { config : { "columns" : { "name" : "string", "captured" : "integer", "url" : "string", "capturedLat" : "real", "capturedLong" : "real" }, "adapter" : { "type" : "sql", "collection_name" : "fugitives" } }, } © 2011 Appcelerator, Inc.!
  • 10. Convention Over Configuration File/Directory Contents & Purpose /app/config.json Specify global values, conditional environment and operating system values, and widget dependencies. /app/views XML View files /app/styles TSS Style Files /app/controllers JavaScript Controller Files /app/models JavaScript Model Files /app/migrations JSON files that describe incremental changes in your database, in the format DATETIME_modelname.json /app/assets Graphic, data file, and other app assets; not created by default /app/lib App-specific library files; not created by default. /app/themes Theme files and assets to customize your UI; not created by default /app/widgets Files and assets associated with widgets ( selfcontained app components ) © 2011 Appcelerator, Inc.!
  • 11. Controllers in Depth UIF-11 © 2011 Appcelerator, Inc.!
  • 12. Controllers •  Contain the application logic •  Communicate between Views and Models •  Handle user interaction and dynamic UI updates •  Access components via their id attribute: $.idstring © 2011 Appcelerator, Inc.!
  • 13. Views Without IDs // index.xml <Alloy> <Window class="container"> <Label id="label" onClick="doClick">Hello, World</Label> </Window> </Alloy> * Controller name determines controller open() unless you assign an ID for root element ( window ) // index.xml <Alloy> <Window class="container" id="mainwin"> <Label id="label" onClick="doClick">Hello, World</Label> </Window> </Alloy> // in index.js // Window tag has an id, so $.index.open() would fail! $.mainwin.open(); © 2011 Appcelerator, Inc.!
  • 14. Event Handling /* listening for an event on a Ti object with id of 'button' */ $.button.addEventListener('click', function(e){ // do something }); // firing an event $.button.fireEvent('click', {foo: 'bar'}); // adding and removing an event var listener = function() { Ti.API.info("Event listener called."); } $.win.addEventListener('click', listener); $.win.removeEventListener('click', listener); © 2011 Appcelerator, Inc.!
  • 15. Dynamically Creating Views Alloy.createController – factory method for instantiating controller Controller.getView – return the view associated with the controller Controller.#element – allows access directly to view elements // controller file something like index.js // we're dynamically loading and showing some other view var foo = Alloy.createController('foo').getView(); foo.open(); var foo = Alloy.createController(‘foo’); foo.mainwin.open(); © 2011 Appcelerator, Inc.!
  • 16. Controllers as Factories Using custom rows in a tableview var rows = []; // arr is some array of data to show in a table for (var i = 0; i < arr.length; i++) { var row = Alloy.createController('CustomRow', arr[i].toJSON()).getView(); rows.push(row); } // set the table $.table.setData(rows); © 2011 Appcelerator, Inc.!
  • 17. Passing Arguments Pass arguments when initializing a controller // controller row.js var args = arguments[0] || {}; $.rowView.title = args.title || ''; $.rowView.url = args.url || ''; // Controller index.js var data[]; for (var i=0; i < source.length; i++) { var arg = { title: source[i].postTitle, url: source[i].postLink }; var row = Alloy.createController('row', arg).getView(); data.push(row); } $.tableView.setData(data); © 2011 Appcelerator, Inc.!
  • 18. Controller Communication “into” Publish public methods for controllers // Controller index.js var web = Alloy.createController(“index2”); web.updateWebView(‘google.com’); // Controller index2.js exports.updateWebView = function(webpage){ $.web.setUrl(webpage); } © 2011 Appcelerator, Inc.!
  • 19. Controller Communication “outside” Trigger Events outside controllers // Controller index.js( index.xml ) <Require id=“bottom” onClick=“bottomBarClick” src=“index2” /> // Controller index2.js $.button.addEventListener(‘click’, function() { $.trigger(‘click’, { action: “show”, menu: “events” }); }); © 2011 Appcelerator, Inc.!
  • 20. Controller Communication “outside” Trigger Events outside controllers // Controller index.js( index.xml ) <Require id=“bottom” onClick=“bottomBarClick” src=“index2” /> // Controller index2.js $.button.addEventListener(‘click’, function() { $.trigger(‘click’, { action: “show”, menu: “events” }); }); © 2011 Appcelerator, Inc.!
  • 21. Alloy Views & Styles in Detail UIF-21 © 2011 Appcelerator, Inc.!
  • 22. View Tag Require // From other file like TabGroup/Window <Require type="view" src="fugitives" id="fugitivetab"/> // view file - fugitives.xml <Alloy> <ImageView id='foo' image='foo.png'/> </Alloy> // style file – fugitives.tss "#foo": { height:Ti.UI.SIZE, width: Ti.UI.SIZE } © 2011 Appcelerator, Inc.!
  • 23. NameSpaces “View Language” •  Imagine a create with <View, <NavigationGroup •  Defaults to the “Ti.UI” namespace * Create Elements not in the Ti.UI namespace: // for objects not in Ti.UI namespace, such as Ti.Map.View: <View ns="Ti.Map" id="map"/> // for objects in sub-namespaces, such as Ti.UI.iOS.NavigationGroup: <NavigationGroup platform="ios,mobileweb"/> © 2011 Appcelerator, Inc.!
  • 24. Style Files •  Component, class, and ID •  Global app.tss •  Constants •  i18n functions •  Alloy Globals © 2011 Appcelerator, Inc.!
  • 25. Style Files •  Component, class, and ID •  Global app.tss •  Constants •  i18n functions •  Alloy Globals ".activeButton": { backgroundColor:"blue" }, "Button": { width: Ti.UI.SIZE, height: Ti.UI.SIZE, color: "#000" }, "#iosBtn": { color: "#999", systemButton: Titanium.UI.iPhone.SystemButton.DISCLOSURE, title: L('iosbutton'), left: Alloy.Globals.computedWidth } © 2011 Appcelerator, Inc.!
  • 27. Platform & Form Factor •  Conditional Code •  App assets •  Platform Build-time Folders •  Markup-based Techniques •  TSS-based Qualifiers © 2011 Appcelerator, Inc.!
  • 28. Conditional Code •  OS_IOS, OS_Android, OS_MOBILEWEB •  ENV_DEV, ENV_TEST, ENV_PRODUCTION if (ENV_DEV && OS_IOS) { alert("You are running iOS in the simulator"); } © 2011 Appcelerator, Inc.!
  • 29. Asset Folders © 2011 Appcelerator, Inc.!
  • 30. Platform Overrides Work for Views, styles, and controllers.. Let me explain © 2011 Appcelerator, Inc.!
  • 31. Platform and Device Markup <Alloy> <Window class="container"> <View formFactor="handheld"> <Label>I'm a handheld!</Label> </View> <View formFactor="tablet"> <Label>I'm a tablet!</Label> </View> <View height="50" width="200" bottom="10" backgroundColor="#cdcdcd"> <Label class="platformLbl" platform="android" formFactor="tablet">android tablet</Label> <Label class="platformLbl" platform="android" formFactor="handheld">android handset</ Label> <Label class="platformLbl" platform="ios" formFactor="tablet">ios tablet</Label> <Label class="platformLbl" platform="ios" formFactor="handheld">ios handset</Label> </View> </Window> </Alloy> © 2011 Appcelerator, Inc.!
  • 32. TSS-Based Qualifiers "#mybutton[platform=android]" : { height:'40dp', }, "#mybutton[platform=ios]" : { height:50, }, "#osLabel[platform=ios formFactor=tablet]": { text: "iPad" }, "#osLabel[platform=ios formFactor=handheld]": { text: "iPhone" }, © 2011 Appcelerator, Inc.!
  • 33. Configurations // config.json file { "global": { "foo": 1}, "env:development": {}, "env:test": {}, "env:production": {}, "os:ios": { "foo": 2 }, "os:android": {}, "dependencies": {} } // in your code alert(Alloy.CFG.foo); // value is 1 or 2 depending on OS © 2011 Appcelerator, Inc.!
  • 34. Themes •  Named collection of styles and assets •  Applied via setting in the config.json file ( can be platform-specific ) •  Theme settings override base styles and assets •  Overrides are made on an attribute by attribute basis, not whole files © 2011 Appcelerator, Inc.!
  • 35. Themes Example // file system structure app/ assets/ appicon.png background.png styles/ app.tss index.tss themes/ mytheme/ assets/ background.png styles/ app.tss green/ ... // config.json { "global": { "theme":"mytheme" }, "env:development": {}, "env:test": {}, "env:production": {}, "os:ios": { "theme":"green" }, "os:android": { "theme":"blue" }, "dependencies": {} } © 2011 Appcelerator, Inc.!
  • 36. Alloy vs. “Traditional” •  It’s not all or nothing – Ti.UI.createView() and its brethren still are valid •  API techniques used withing controllers, in helper libraries ( network, database, etc ) •  Alloy is essentially a pre-compiler •  In the end, Alloy creates traditional “classic” code for you – Check out the Resources Folder!!! © 2011 Appcelerator, Inc.!
  • 37. Cool Utilities UIF-37 © 2011 Appcelerator, Inc.!
  • 38. TiShadow •  Historically, we had to build an app and wait about 20 or so seconds for it to build.. Iterative dev process •  Community Member David Bankier created TiShadow • https://github.com/dbankier/TiShadow •  Works as a way to cache the app build process and through command line, allow you to speed your workflow. •  Involves installing NPM package, downloading Github Package, starting the server, and running command line to build each project individually. © 2011 Appcelerator, Inc.!
  • 39. TiShadow Install Steps •  Npm install –g tishadow •  Download git repo, import the project into Studio, build project to install on simulator. https://github.com/dbankier/TiShadow •  Start the tishadow server component. Should be available to http://localhost:3000 •  Command line to project your are working on and run: To Start: Tishadow run ( in root of project ) After updates, run this command: alloy compile --config platform=ios && tishadow run © 2011 Appcelerator, Inc.!
  • 40. Introducing LiveView •  Feature of our Appcelerator Studio which comes with Appcelerator Platform •  Based on TiShadow theory, allows you to rapidly prototype your application UI. •  Quick Demo of the power .. Included with Appcelerator Platform subscription •  Other Enterprise Features are here: •  http://docs.appcelerator.com/platform/latest/#!/ guide/Enterprise_Features © 2011 Appcelerator, Inc.!
  • 41. Other Enterprise Features •  App Analytics for all your applications •  Appcelerator Studio which includes LiveView, Code Analysis, and Code Profiler. http://docs.appcelerator.com/platform/latest/#!/ guide/Enterprise_Features •  More information about the Platofrm •  http://www.appcelerator.com/products/ © 2011 Appcelerator, Inc.!
  • 42. Appcelerator Test •  Integrated Functional Test Automation to improve the workflow of your QA process © 2011 Appcelerator, Inc.!
  • 43. Appcelerator Performance Management •  Captures data in real-time to provide actionable information about user, device and application problems © 2011 Appcelerator, Inc.!
  • 44. Thank you JAMIL HASSAN SPAIN @JAMILSPAIN SKYPE: JAMIL.HASSAN.SPAIN JSPAIN@APPCELERATOR.COM © 2011 Appcelerator, Inc.!