├── .gitignore
├── .travis.yml
├── app.coffee
├── app.production.coffee
├── app.staging.coffee
├── app.sublime-project
├── assets
├── css
│ ├── _animations.styl
│ ├── _authors.styl
│ ├── _buttons.styl
│ ├── _colors.styl
│ ├── _feed.styl
│ ├── _footer.styl
│ ├── _header.styl
│ ├── _home.styl
│ ├── _icons.styl
│ ├── _language-selector.styl
│ ├── _natural-language-form.styl
│ ├── _nav.styl
│ ├── _scaffolding.styl
│ ├── _settings.styl
│ ├── _typography.styl
│ ├── _utils.styl
│ ├── font
│ │ └── clearsans
│ │ │ ├── clearsans-bold.eot
│ │ │ ├── clearsans-bold.svg
│ │ │ ├── clearsans-bold.ttf
│ │ │ ├── clearsans-bold.woff
│ │ │ ├── clearsans-light.eot
│ │ │ ├── clearsans-light.svg
│ │ │ ├── clearsans-light.ttf
│ │ │ ├── clearsans-light.woff
│ │ │ ├── clearsans-medium.eot
│ │ │ ├── clearsans-medium.svg
│ │ │ ├── clearsans-medium.ttf
│ │ │ ├── clearsans-medium.woff
│ │ │ ├── clearsans-regular.eot
│ │ │ ├── clearsans-regular.svg
│ │ │ ├── clearsans-regular.ttf
│ │ │ ├── clearsans-regular.woff
│ │ │ ├── clearsans-thin.eot
│ │ │ ├── clearsans-thin.svg
│ │ │ ├── clearsans-thin.ttf
│ │ │ └── clearsans-thin.woff
│ ├── guide.styl
│ ├── master.styl
│ └── prism.css
├── img
│ ├── .keep
│ ├── droid.svg
│ ├── favicon.ico
│ ├── fractal-blue.png
│ ├── intel_logo.png
│ ├── megacat.jpg
│ ├── placeholder.svg
│ ├── section-title-bg.png
│ └── tear.svg
└── js
│ ├── animations.coffee
│ ├── app.coffee
│ ├── commit.coffee
│ ├── disqus.coffee
│ ├── elqQ.coffee
│ ├── feed.coffee
│ ├── fonts.coffee
│ ├── ga-prod.coffee
│ ├── ga-stage.coffee
│ ├── grid.coffee
│ ├── language-selector.coffee
│ ├── natural-language-form.coffee
│ ├── prism.js
│ ├── search.coffee
│ ├── share.coffee
│ ├── text-effect.coffee
│ └── track.coffee
├── authors_readme.md
├── bower.json
├── commit.php
├── data
├── authors
│ ├── TomDawsonAH.yaml
│ ├── abhilegend.yaml
│ ├── admin.yaml
│ ├── argyleink.yaml
│ ├── blundell.yaml
│ ├── buitren9.yaml
│ ├── dennisstrein.yaml
│ ├── edisonw.yaml
│ ├── iamdankaufman.yaml
│ ├── lapiellosolutions.yaml
│ ├── lifeluvr.yaml
│ ├── nglauber.yaml
│ ├── peachpellen.yaml
│ ├── smartnotify.yaml
│ ├── tamer1an.yaml
│ └── twoh.yaml
├── meta.yaml
├── paths.yaml
└── social.yaml
├── deploy_key.enc
├── jasmine-runner.js
├── package.json
├── posts
├── TomDawsonAH
│ ├── first_post.jade
│ ├── library
│ │ ├── AndroidMarshmallow.jpg
│ │ └── LostTablet.jpeg
│ └── post_two.jade
├── abhilegend
│ ├── Unity_and_Android_Build.jade
│ └── library
│ │ ├── 1.png
│ │ ├── 2.png
│ │ ├── 3.png
│ │ ├── 4.png
│ │ ├── 5.png
│ │ ├── 6.png
│ │ ├── 7.png
│ │ ├── 8.png
│ │ ├── 9.png
│ │ └── Picture3a.png
├── admin
│ ├── contribute.jade
│ └── library
│ │ ├── android-hero.png
│ │ └── new-author.gif
├── argyleink
│ ├── library
│ │ ├── bolt.jpg
│ │ ├── purify.png
│ │ └── uglify.png
│ └── webviews.jade
├── blundell
│ ├── Inspecting_databases_with_Stetho.jade
│ ├── Pushing_the_limit.jade
│ ├── You_have_permission_to.jade
│ └── library
│ │ ├── android-hero.png
│ │ ├── crash-hero.png
│ │ ├── limit-hero.jpeg
│ │ ├── stetho-database-data.png
│ │ ├── stetho-device-selection.png
│ │ └── stetho-sql-commands.png
├── buitren9
│ ├── How_I_get_started.jade
│ └── library
│ │ ├── activity_lifecycle.png
│ │ ├── evsas.png
│ │ ├── hero_image.png
│ │ └── smartphone_blocks.jpg
├── dennisstrein
│ ├── Develop_apps_on_your.jade
│ └── library
│ │ ├── aide.png
│ │ ├── image1.png
│ │ ├── image2.png
│ │ ├── image3.png
│ │ ├── image4.png
│ │ ├── image5.png
│ │ ├── image6.png
│ │ ├── image7.png
│ │ ├── image8.png
│ │ └── image9.png
├── edisonw
│ ├── Penn_Station.jade
│ ├── buck.jade
│ └── library
│ │ ├── buck.png
│ │ └── edisonpost2.jpeg
├── iamdankaufman
│ ├── 4_Tips_on_How.jade
│ ├── Future_of_App_Development.jade
│ ├── The_Future_of_Android.jade
│ ├── library
│ │ ├── FutureofAppDev.jpg
│ │ ├── Top7Techniques.jpg
│ │ ├── dan_androidfuture.jpg
│ │ ├── four_tips.jpg
│ │ └── topreasonsinvest.png
│ ├── top_7_techniques.jade
│ └── top_reasons_invest.jade
├── lapiellosolutions
│ ├── Introduction_to_cross_platform_mobile_apps_development.jade
│ └── library
│ │ ├── intel_xdk2.jpg
│ │ └── intelxdk.png
├── lifeluvr
│ ├── An_Android_Debugging_Bridge.jade
│ ├── Useful_ADB_Commands.jade
│ ├── Useful_ADB_Commands_II.jade
│ └── library
│ │ ├── EricPost2.jpeg
│ │ ├── adbAction1.png
│ │ ├── adbAction2.png
│ │ ├── adbAction3.png
│ │ ├── cd2platform-tools.png
│ │ ├── copyNpaste.png
│ │ ├── ericpost1.jpg
│ │ ├── hero4eric.jpeg
│ │ └── usrBin.png
├── nglauber
│ ├── Android_Search.jade
│ └── library
│ │ ├── AndroidSearch_1.png
│ │ └── AndroidSearch_Hero.jpg
├── npm-debug.log
├── peachpellen
│ ├── 5_Apps_for_Android.jade
│ ├── Dealing_with_Android_Fragmentation.jade
│ ├── Infographic_Android_in_2015.jade
│ ├── Interview-_Peach_Pellen_on.jade
│ └── library
│ │ ├── android2015-hero.png
│ │ ├── android_2015_header.jpg
│ │ ├── android_infographic.jpg
│ │ ├── bolt.jpg
│ │ ├── devices-hero.jpg
│ │ ├── golden_gate.jpg
│ │ ├── header.jpg
│ │ ├── interview-header.jpg
│ │ ├── interview-header2.jpg
│ │ ├── peach_devices.jpg
│ │ ├── purify.png
│ │ ├── top5androidapps.jpg
│ │ └── uglify.png
├── smartnotify
│ ├── Geolocation_in_Apps.jade
│ ├── QA_with_Android_Developer.jade
│ └── library
│ │ ├── geolocation.jpg
│ │ └── gregpost1.jpg
├── tamer1an
│ ├── android-iot-big-data.jade
│ └── library
│ │ └── android-iot-big-data.jpeg
├── template.jade
└── twoh
│ ├── Easy_Android_Maps_Part.jade
│ └── library
│ ├── app1.png
│ ├── app2.png
│ ├── cred1.png
│ ├── cred2.jpg
│ ├── cred3.png
│ ├── hafizhpost1.jpg
│ └── map1.png
├── readme.md
├── reviewer_readme.md
├── scripts
├── copy-field-guide.sh
├── copy-library.js
├── create-thumbs.js
├── deploy.sh
├── deploy_production.sh
├── get-author-image.js
├── get-author.js
├── get-categories.js
├── get-featured.js
├── get-hero-image.js
├── get-merged-posts.js
├── get-post-git-data.js
├── get-related-posts.js
├── git-json.js
├── new-author.js
├── new-post.js
├── prep_l18n.sh
├── social-link.js
└── sort-by-last-name.js
├── spec
├── androidHub
│ ├── AuthorSpec.js
│ └── PostSpec.js
├── helpers
│ └── jasmine_examples
│ │ └── SpecHelper.js
└── support
│ └── jasmine.json
└── views
├── 404.jade
├── about.jade
├── authors.jade
├── commit.jade
├── feed.jade
├── includes
├── _facebook_tracking.jade
├── _font-strategy.jade
├── _footer-sitemap.jade
├── _footer-strip.jade
├── _footer.jade
├── _intel_tracking.jade
├── _site-meta.jade
├── _social-icons.jade
└── svg
│ ├── _arrow.jade
│ ├── _codepen.jade
│ ├── _commit.jade
│ ├── _droid-hub.jade
│ ├── _droid.jade
│ ├── _facebook.jade
│ ├── _github.jade
│ ├── _googleplus.jade
│ ├── _hub-logo.jade
│ ├── _instagram.jade
│ ├── _link.jade
│ ├── _search.jade
│ ├── _twitter-bird.jade
│ ├── _twitter.jade
│ └── _youtube.jade
├── index.jade
├── layouts
├── _general.jade
└── _single.jade
├── mixins
├── _author.jade
├── _feed-home-item.jade
├── _feed-item.jade
├── _language-selector.jade
├── _nav.jade
├── _og-meta.jade
├── _related-post.jade
├── _tracking-pixel.jade
└── _twitter-meta.jade
├── redirector.jade
├── robots.txt
└── robots_disallow.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | public
4 | assets/library
5 | bower_components
6 | *.sublime-workspace
7 | deploy_key
8 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | before_script:
3 | - travis_retry npm install -g roots
4 | - travis_retry npm install -g bower
5 | script:
6 | - npm test
7 | - travis_retry bower install
8 | - echo $TRAVIS_TAG; if [ "$TRAVIS_TAG" != "" ]; then export env='production'; else export env='staging'; fi; echo $env;
9 | - travis_retry roots compile -e $env
10 | - scripts/prep_l18n.sh
11 | node_js:
12 | - '4'
13 | sudo: false
14 | cache:
15 | directories:
16 | - node_modules
17 | - bower_components
18 | notifications:
19 | email:
20 | recipients:
21 | - aegaas@deloitte.com
22 | - aargyle@deloitte.com
23 | webhooks:
24 | urls:
25 | - http://hubot.ddhive.com/hubot/travis?room=intel-android
26 | addons:
27 | ssh_known_hosts:
28 | - androidhub-int.wdg.infra-host.com
29 | - androidhub-prod.wdg.wdg.infra-host.com
30 | deploy:
31 | - provider: script
32 | script: scripts/deploy.sh
33 | skip_cleanup: true
34 | on:
35 | branch: master
36 | - provider: script
37 | script: scripts/deploy_production.sh
38 | skip_cleanup: true
39 | on:
40 | tags: true
41 |
--------------------------------------------------------------------------------
/app.coffee:
--------------------------------------------------------------------------------
1 | axis = require 'axis'
2 | rupture = require 'rupture'
3 | autoprefixer = require 'autoprefixer-stylus'
4 | js_pipeline = require 'js-pipeline'
5 | css_pipeline = require 'css-pipeline'
6 | dynamic = require 'dynamic-content'
7 | roots_yaml = require 'roots-yaml'
8 | records = require 'roots-records'
9 | shell = require 'shelljs'
10 | copyLibrary = require './scripts/copy-library'
11 | createThumbs = require './scripts/create-thumbs'
12 | hasRunOnce = false
13 |
14 | module.exports =
15 | ignores: [
16 | 'readme.md'
17 | 'authors_readme.md'
18 | 'ship.*conf'
19 | '**/layout.*'
20 | '**/_*'
21 | '.gitignore'
22 | 'scripts/**'
23 | 'bower.json'
24 | 'app.sublime-project'
25 | 'spec/**'
26 | 'tmp'
27 | 'jasmine-runner.js',
28 | '.travis.yml',
29 | 'deploy_key*',
30 | '*.zip'
31 | # 'data/**'
32 | ]
33 |
34 | extensions: [
35 | roots_yaml()
36 | dynamic write: 'content.json'
37 | records git: file: 'public/posts-git.json'
38 | js_pipeline
39 | files: [
40 | 'bower_components/fastclick/lib/fastclick.js'
41 | 'bower_components/es6-promise/promise.min.js'
42 | 'bower_components/fontfaceobserver/fontfaceobserver.js'
43 | 'bower_components/isotope/dist/isotope.pkgd.min.js'
44 | 'bower_components/lazysizes/lazysizes.min.js'
45 | 'bower_components/sweetalert/dist/sweetalert-dev.js'
46 | 'bower_components/velocity/velocity.js'
47 | 'bower_components/velocity/velocity.ui.js'
48 | # simple no deps
49 | 'assets/js/app.coffee'
50 | 'assets/js/fonts.coffee'
51 | 'assets/js/share.coffee'
52 | 'assets/js/track.coffee'
53 | 'assets/js/disqus.coffee'
54 | 'assets/js/natural-language-form.coffee'
55 | 'assets/js/language-selector.coffee'
56 | # classes
57 | 'assets/js/grid.coffee'
58 | 'assets/js/search.coffee'
59 | # view controllers
60 | 'assets/js/feed.coffee'
61 | 'assets/js/commit.coffee'
62 | 'assets/js/animations.coffee'
63 | 'assets/js/text-effect.coffee'
64 | ]
65 | css_pipeline
66 | files: [
67 | 'bower_components/reflex-grid/css/reflex.css'
68 | 'bower_components/sweetalert/dist/sweetalert.css'
69 | 'assets/css/master.styl'
70 | ]
71 | ]
72 |
73 | stylus:
74 | use: [
75 | axis()
76 | rupture()
77 | autoprefixer()
78 | ]
79 | sourcemap: true
80 |
81 | 'coffee-script':
82 | sourcemap: true
83 | bare: true
84 |
85 | jade:
86 | pretty: true
87 |
88 | locals:
89 | env: 'dev'
90 | _: require 'lodash'
91 | moment: require 'moment'
92 | helpers:
93 | getAuthor: require './scripts/get-author'
94 | getAuthorImage: require './scripts/get-author-image'
95 | getCategories: require './scripts/get-categories'
96 | getMergedPosts: require './scripts/get-merged-posts'
97 | getPostGitData: require './scripts/get-post-git-data'
98 | getFeatured: require './scripts/get-featured'
99 | getRelatedPosts: require './scripts/get-related-posts'
100 | socialLink: require './scripts/social-link'
101 | getHeroImage: require './scripts/get-hero-image'
102 | sortByLastName: require './scripts/sort-by-last-name.js'
103 |
104 | before: ->
105 | if not hasRunOnce
106 | shell.exec 'npm run posts-git-log'
107 | copyLibrary()
108 | hasRunOnce = true
109 | # createThumbs()
110 | return true
111 |
112 | debug: true
113 |
--------------------------------------------------------------------------------
/app.production.coffee:
--------------------------------------------------------------------------------
1 | axis = require 'axis'
2 | rupture = require 'rupture'
3 | autoprefixer = require 'autoprefixer-stylus'
4 | js_pipeline = require 'js-pipeline'
5 | css_pipeline = require 'css-pipeline'
6 | dynamic = require 'dynamic-content'
7 | roots_yaml = require 'roots-yaml'
8 | records = require 'roots-records'
9 | shell = require 'shelljs'
10 | copyLibrary = require './scripts/copy-library'
11 | createThumbs = require './scripts/create-thumbs'
12 | # hash = (new Date()).valueOf().toString()
13 |
14 | module.exports =
15 | ignores: [
16 | 'readme.md'
17 | 'authors_readme.md'
18 | 'ship.*conf'
19 | '**/layout.*'
20 | '**/_*'
21 | '.gitignore'
22 | 'scripts/**'
23 | 'bower.json'
24 | 'app.sublime-project'
25 | 'spec/**'
26 | 'tmp'
27 | 'jasmine-runner.js',
28 | '.travis.yml',
29 | 'deploy_key*',
30 | '*.zip'
31 | # 'data/**'
32 | ]
33 |
34 | extensions: [
35 | roots_yaml()
36 | dynamic write: 'content.json'
37 | records git: file: 'public/posts-git.json'
38 | js_pipeline
39 | files: [
40 | 'bower_components/fastclick/lib/fastclick.js'
41 | 'bower_components/es6-promise/promise.min.js'
42 | 'bower_components/fontfaceobserver/fontfaceobserver.js'
43 | 'bower_components/isotope/dist/isotope.pkgd.min.js'
44 | 'bower_components/lazysizes/lazysizes.min.js'
45 | 'bower_components/sweetalert/dist/sweetalert-dev.js'
46 | 'bower_components/velocity/velocity.js'
47 | 'bower_components/velocity/velocity.ui.js'
48 | # simple no deps
49 | 'assets/js/app.coffee'
50 | 'assets/js/fonts.coffee'
51 | 'assets/js/share.coffee'
52 | 'assets/js/track.coffee'
53 | 'assets/js/disqus.coffee'
54 | 'assets/js/natural-language-form.coffee'
55 | 'assets/js/language-selector.coffee'
56 | # classes
57 | 'assets/js/grid.coffee'
58 | 'assets/js/search.coffee'
59 | # view controllers
60 | 'assets/js/feed.coffee'
61 | 'assets/js/commit.coffee'
62 | 'assets/js/animations.coffee'
63 | 'assets/js/text-effect.coffee'
64 | 'assets/js/ga-prod.coffee'
65 | 'assets/js/elqQ.coffee'
66 | ]
67 | out: "js/app.js"
68 | minify: true
69 | hash: false
70 |
71 | css_pipeline
72 | files: [
73 | 'bower_components/reflex-grid/css/reflex.css'
74 | 'assets/css/guide.styl'
75 | ]
76 | out: 'css/guide.css'
77 | minify: true
78 | hash: false
79 | opts:
80 | keepSpecialComments: 0
81 |
82 | css_pipeline
83 | files: [
84 | 'bower_components/reflex-grid/css/reflex.css'
85 | 'bower_components/sweetalert/dist/sweetalert.css'
86 | 'assets/css/master.styl'
87 | ]
88 | out: "css/app.css"
89 | minify: true
90 | hash: false
91 | opts:
92 | keepSpecialComments: 0
93 | ]
94 |
95 | stylus:
96 | "include-css": true
97 | use: [
98 | axis()
99 | rupture()
100 | autoprefixer()
101 | ]
102 |
103 | 'coffee-script':
104 | bare: true
105 |
106 | locals:
107 | env: 'prod'
108 | timestamp: Math.round(new Date().getTime()/1000)
109 | _: require 'lodash'
110 | moment: require 'moment'
111 | helpers:
112 | getAuthor: require './scripts/get-author'
113 | getAuthorImage: require './scripts/get-author-image'
114 | getCategories: require './scripts/get-categories'
115 | getMergedPosts: require './scripts/get-merged-posts'
116 | getPostGitData: require './scripts/get-post-git-data'
117 | getFeatured: require './scripts/get-featured'
118 | getRelatedPosts: require './scripts/get-related-posts'
119 | socialLink: require './scripts/social-link'
120 | getHeroImage: require './scripts/get-hero-image'
121 | sortByLastName: require './scripts/sort-by-last-name.js'
122 |
123 | before: ->
124 | shell.exec 'npm run posts-git-log'
125 | copyLibrary()
126 | createThumbs()
127 |
128 | after: ->
129 | shell.exec "node_modules/purify-css/bin/purifycss public/css/app.css public/index.html public/feed.html public/about.html public/authors.html public/commit.html public/posts/argyleink/webviews.html public/js/app.js --info --out public/css/app.css"
130 | shell.exec "node_modules/csso/bin/csso public/css/app.css public/css/app.css"
131 | shell.exec 'cp -R posts/* public/posts'
132 |
--------------------------------------------------------------------------------
/app.staging.coffee:
--------------------------------------------------------------------------------
1 | axis = require 'axis'
2 | rupture = require 'rupture'
3 | autoprefixer = require 'autoprefixer-stylus'
4 | js_pipeline = require 'js-pipeline'
5 | css_pipeline = require 'css-pipeline'
6 | dynamic = require 'dynamic-content'
7 | roots_yaml = require 'roots-yaml'
8 | records = require 'roots-records'
9 | shell = require 'shelljs'
10 | copyLibrary = require './scripts/copy-library'
11 | createThumbs = require './scripts/create-thumbs'
12 |
13 | module.exports =
14 | ignores: [
15 | 'readme.md'
16 | 'authors_readme.md'
17 | 'ship.*conf'
18 | '**/layout.*'
19 | '**/_*'
20 | '.gitignore'
21 | 'scripts/**'
22 | 'bower.json'
23 | 'app.sublime-project'
24 | 'spec/**'
25 | 'tmp'
26 | 'jasmine-runner.js',
27 | '.travis.yml',
28 | 'deploy_key*',
29 | '*.zip'
30 | # 'data/**'
31 | ]
32 |
33 | extensions: [
34 | roots_yaml()
35 | dynamic write: 'content.json'
36 | records git: file: 'public/posts-git.json'
37 | js_pipeline
38 | files: [
39 | 'bower_components/fastclick/lib/fastclick.js'
40 | 'bower_components/es6-promise/promise.min.js'
41 | 'bower_components/fontfaceobserver/fontfaceobserver.js'
42 | 'bower_components/isotope/dist/isotope.pkgd.min.js'
43 | 'bower_components/lazysizes/lazysizes.min.js'
44 | 'bower_components/sweetalert/dist/sweetalert-dev.js'
45 | 'bower_components/velocity/velocity.js'
46 | 'bower_components/velocity/velocity.ui.js'
47 | # simple no deps
48 | 'assets/js/app.coffee'
49 | 'assets/js/fonts.coffee'
50 | 'assets/js/share.coffee'
51 | 'assets/js/track.coffee'
52 | 'assets/js/disqus.coffee'
53 | 'assets/js/natural-language-form.coffee'
54 | 'assets/js/language-selector.coffee'
55 | # classes
56 | 'assets/js/grid.coffee'
57 | 'assets/js/search.coffee'
58 | # view controllers
59 | 'assets/js/feed.coffee'
60 | 'assets/js/commit.coffee'
61 | 'assets/js/animations.coffee'
62 | 'assets/js/text-effect.coffee'
63 | 'assets/js/ga-stage.coffee'
64 | ]
65 | out: 'js/app.js'
66 | minify: true
67 | hash: false
68 |
69 | css_pipeline
70 | files: [
71 | 'bower_components/reflex-grid/css/reflex.css'
72 | 'assets/css/guide.styl'
73 | ]
74 | out: 'css/guide.css'
75 | minify: true
76 | hash: false
77 | opts:
78 | keepSpecialComments: 0
79 |
80 | css_pipeline
81 | files: [
82 | 'bower_components/reflex-grid/css/reflex.css'
83 | 'bower_components/sweetalert/dist/sweetalert.css'
84 | 'assets/css/master.styl'
85 | ]
86 | out: 'css/app.css'
87 | minify: true
88 | hash: false
89 | opts:
90 | keepSpecialComments: 0
91 | ]
92 |
93 | stylus:
94 | "include-css": true
95 | use: [
96 | axis()
97 | rupture()
98 | autoprefixer()
99 | ]
100 |
101 | 'coffee-script':
102 | bare: true
103 |
104 | locals:
105 | env: 'staging'
106 | timestamp: Math.round(new Date().getTime()/1000)
107 | _: require 'lodash'
108 | moment: require 'moment'
109 | helpers:
110 | getAuthor: require './scripts/get-author'
111 | getAuthorImage: require './scripts/get-author-image'
112 | getCategories: require './scripts/get-categories'
113 | getMergedPosts: require './scripts/get-merged-posts'
114 | getPostGitData: require './scripts/get-post-git-data'
115 | getFeatured: require './scripts/get-featured'
116 | getRelatedPosts: require './scripts/get-related-posts'
117 | socialLink: require './scripts/social-link'
118 | getHeroImage: require './scripts/get-hero-image'
119 | sortByLastName: require './scripts/sort-by-last-name.js'
120 |
121 | before: ->
122 | shell.exec 'npm run posts-git-log'
123 | copyLibrary()
124 | createThumbs()
125 |
126 | after: ->
127 | shell.exec 'node_modules/purify-css/bin/purifycss public/css/app.css public/index.html public/feed.html public/about.html public/authors.html public/commit.html public/posts/argyleink/webviews.html public/js/app.js --info --out public/css/app.css'
128 | shell.exec 'node_modules/csso/bin/csso public/css/app.css public/css/app.css'
129 | shell.exec 'cp views/robots_disallow.txt public/robots.txt'
130 | shell.exec 'cp -R posts/* public/posts'
131 |
--------------------------------------------------------------------------------
/app.sublime-project:
--------------------------------------------------------------------------------
1 | {
2 | "folders":
3 | [
4 | {
5 | "path": "."
6 | }
7 | ],
8 | "settings":
9 | {
10 | "tab_size": 2,
11 | "translate_tabs_to_spaces": true,
12 | "detect_indentation": true,
13 | "binary_file_patterns": ["public/*", "node_modules/*", "bower_components/*"]
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/assets/css/_animations.styl:
--------------------------------------------------------------------------------
1 | .animate-prep
2 | opacity:0
3 |
4 | .lazyanimate
5 | position:relative
6 | // will-change:top, opacity
7 | &.lazyload,
8 | &.lazyloading
9 | opacity:0
10 | // transform:translateY(5px)
11 | top:5px
12 |
13 | &.lazyloaded
14 | opacity:1
15 | // transform:translateY(0)
16 | top:0
17 | transition:top 0.3s ease, opacity 0.3s ease
18 |
19 | .droid-hero > path:first-child
20 | transform-origin:center center
21 | animation:rotateForever 14s linear infinite
22 | animation-delay:1.5s
23 | will-change:transform
24 |
25 | @keyframes rotateForever
26 | from
27 | transform:rotateZ(0)
28 | to
29 | transform:rotateZ(360deg)
30 |
31 | @-moz-document url-prefix()
32 | .droid-hero > path:first-child
33 | transform-origin:175px 175px
34 |
35 | .droid-hero > g > path
36 | animation:superSaiyan 3s ease-in-out infinite
37 | animation-delay:1.5s
38 | will-change:transform
39 |
40 | @keyframes superSaiyan
41 | 0%, 100%
42 | transform:translateY(0)
43 | 50%
44 | transform:translateY(-10px)
45 |
46 | .animate-fill
47 | transition:fill 0.3s ease
--------------------------------------------------------------------------------
/assets/css/_authors.styl:
--------------------------------------------------------------------------------
1 | .authors-horizontal-list
2 | margin:4rem 0
3 |
4 | .author
5 | img
6 | height:240px
7 |
8 | .name
9 | margin-top:0.25rem
10 |
11 | small
12 | display:block
13 |
14 | .author-social
15 | margin-top:5px
16 | > a
17 | text-decoration:none
18 | padding:0.25rem
19 | path
20 | fill:lighten(desaturate(blue, 100%), 50%)
21 | svg
22 | path
23 | @extend .animate-fill
--------------------------------------------------------------------------------
/assets/css/_buttons.styl:
--------------------------------------------------------------------------------
1 | @require _settings
2 |
3 | .btn
4 | text-decoration:none
5 | color:default-color
6 | padding:0.25rem 0.5rem
7 | border-radius:2px
8 | display:inline-block
9 |
10 | &.clear
11 | color:white
12 | border:none
13 | padding:0
14 |
15 | &.blue:hover
16 | color:blue
17 | background:transparent
18 | g
19 | stroke:blue
20 |
21 | &:hover
22 | text-decoration:underline
23 | > svg
24 | transform:translateX(10px)
25 |
26 | &.blue
27 | color:blue
28 |
29 | g
30 | stroke:blue
31 |
32 | &:hover
33 | background:blue
34 | color:white
35 | g
36 | stroke:white
37 | > svg
38 | transform:translateX(10px)
39 |
40 | &.bordered
41 | border:1px solid blue
42 |
43 | &.small
44 | font-size:0.8rem
45 |
46 | &.large
47 | font-size:1.2rem
48 |
49 | &.disabled
50 | button-disabled()
51 |
52 | > svg
53 | transition:transform 0.3s ease
54 | position:relative
55 | top:0.3em
56 |
--------------------------------------------------------------------------------
/assets/css/_colors.styl:
--------------------------------------------------------------------------------
1 | .light-grey-bg
2 | background-color:#eee
--------------------------------------------------------------------------------
/assets/css/_feed.styl:
--------------------------------------------------------------------------------
1 | #feed-grid
2 | margin-bottom:2rem
3 | will-change:height
4 |
5 | +below(mobile)
6 | margin-bottom:0
7 |
8 | &[data-empty]:after
9 | content:"No results"
10 | width:100%
11 | text-align:center
12 |
13 | .feed-item
14 | border-radius:2px
15 | will-change:transform, top, left
16 |
17 | > a
18 | text-decoration:none
19 | color:initial
20 | &:hover .post-title
21 | text-decoration:underline
22 |
23 | > .feed-item-category
24 | color:hsl(214, 4%, 34%)
25 | margin-bottom:0.5rem
26 | font-size:0.7rem
27 |
28 | img
29 | height:200px
30 | overflow:hidden
31 |
32 | &.lazyloading
33 | @extend .placeholder-background-image
34 |
35 | +above(desktop)
36 | height:150px
37 |
38 | .post-title
39 | margin:0.5rem 0 0.25rem
40 | color:blue
41 |
42 | .post-meta
43 | color:intel-grey
44 | margin:0.25rem 0
45 | > span
46 | margin:0 4px
47 | color:hsl(0, 0%, 55%)
48 | white-space: nowrap
49 |
50 | > address
51 | color:intel-grey
52 | display:inline
53 | font-style:normal
54 |
55 | .post-excerpt
56 | color:hsl(0,0%,13%)
57 |
58 | .post-meta, .post-excerpt
59 | font-size:0.7rem
60 | display:block
61 |
62 | .feed-manipulators .grid
63 | // +below(tablet)
64 | // h3
65 | // display:none
66 | +below(mobile)
67 | .grid__col-sm-8
68 | align-items:center
69 |
70 | #feed-filter
71 | border:none
72 | outline:none
73 | background:none
74 | color:white
75 | font-size:1.17em
76 | position:relative
77 | top:0.03rem
78 |
79 | .chrome-on-windows, .windows-ie-10, .windows-ie-11
80 | #feed-filter > option
81 | color:blue
82 | background:white
83 |
84 | .related-posts
85 | > .related-post
86 | &:first-child
87 | border-top:none
88 | padding-top:0
89 | margin-top:0
90 |
91 | .related-post
92 | border-top:1px solid #eee
93 | margin-top:2rem
94 | padding-top:2rem
95 |
96 | img
97 | height:100px
98 | padding-bottom:1rem
99 | +above(mobile)
100 | padding-bottom:0
101 | padding-right:1rem
102 | +above(tablet)
103 | height:170px
104 |
105 | .windows-ie-10, .windows-ie-11
106 | .feed-item a, .related-post a
107 | height:100%
108 | .feed-item img, .related-post img
109 | height:auto
110 |
--------------------------------------------------------------------------------
/assets/css/_footer.styl:
--------------------------------------------------------------------------------
1 | footer
2 | background:white
3 |
4 | h2
5 | +below(mobile)
6 | font-size:1rem
7 |
8 | .link-nav-set
9 | a
10 | margin-right: 1em
11 | text-align: left
12 | text-align-last: left
13 |
14 | &:last-child
15 | margin-right: 0
16 |
17 | +below(mobile)
18 | margin:1rem 0
19 |
20 | .site-map
21 | padding:2rem 0
22 | +below(laptop)
23 | padding:2rem
24 | +below(mobile)
25 | padding:1rem
26 | .grid--direction-column
27 | align-items:center
28 | .grid--justify-end
29 | justify-content:center
30 |
31 | .inline-social
32 | margin-right:1rem
33 | text-decoration:none
34 | text-align:left
35 | display: table
36 |
37 | &:hover
38 | cursor:pointer
39 | > .social-text
40 | text-decoration:underline
41 | +below(tablet)
42 | margin:0 0.5rem
43 |
44 | .social-icon-wrap, .social-text
45 | display: table-cell
46 | vertical-align: middle
47 |
48 | .social-icon-wrap
49 | min-width: 65px
50 |
51 | .social-text
52 | color:white
53 | padding-left: 5px
54 |
55 | +below(tablet)
56 | display: none
57 |
58 | .dark-grey-bg
59 | background-color:hsl(0,0%,22%)
60 | color:white
61 | padding:2rem 0
62 |
63 | +below(mobile)
64 | padding:1rem 0 0
65 |
--------------------------------------------------------------------------------
/assets/css/_header.styl:
--------------------------------------------------------------------------------
1 | header
2 | background-size:cover
3 | background-position:center center
4 | color:white
5 | text-shadow:1px 1px 0 hsla(0,0%,0%,0.2)
6 |
7 | &:before
8 | content: " "
9 | position: absolute
10 | top:0
11 | bottom:0
12 | left:0
13 | right:0
14 | background-color:hsla(0,0%,0%,0.3)
15 |
16 | .centered-title
17 | margin:5vh auto auto
18 | +above(900px)
19 | margin:15vh auto auto
20 |
21 | .header-title
22 | margin-top:0
23 | margin-bottom:2rem
24 | +below(mobile)
25 | font-size:1.5em
26 |
27 | .header-date
28 | font-size:0.9rem
29 | display:flex
30 | align-items:center
31 | > a
32 | font-size:0.7em
33 |
34 | .header-subtitle
35 | @extend .ellipsis
36 | font-size:0.8rem
37 | margin-bottom:0.5rem
38 | +below(mobile)
39 | font-size:0.7rem
40 |
41 | .header-author
42 | margin-bottom:0
43 |
44 | .header-nameplate
45 | position:relative
46 | z-index:1
47 | top:1.5rem
48 |
49 | > a > .avatar
50 | float:left
51 | width:90px
52 | height:90px
53 | > .meta svg
54 | filter: drop-shadow(1px 1px 0 hsla(0,0%,0%,0.2))
55 |
56 | .header-social
57 | > a
58 | margin-right:0.25rem
59 | text-decoration:none
60 |
61 | .section-title
62 | padding:1rem 0
63 | background:blue
64 | background-image:
65 | linear-gradient(left, hsla(202, 100%, 38%, 80%), hsla(202, 100%, 68%, 20%)),
66 | url(/img/section-title-bg.png)
67 | background-size:auto 100%
68 | color:white
--------------------------------------------------------------------------------
/assets/css/_home.styl:
--------------------------------------------------------------------------------
1 | .hero
2 | padding:2.5rem 0
3 | padding:5vh 0
4 | position:relative
5 | overflow:hidden
6 | text-shadow:0 2px 4px hsla(0,0%,0%,0.15)
7 | color:white
8 | background:hsl(0,0%,70%)
9 |
10 | +above(laptop)
11 | padding:5rem 0
12 | padding:10vh 0
13 |
14 | +above(desktop)
15 | padding:10rem 0
16 | padding:15vh 0
17 |
18 | .heroimage
19 | position:absolute
20 | top:0
21 | left:0
22 | z-index:1
23 | width:auto
24 | height:100%
25 | filter: grayscale(100%)
26 | width:100%
27 | height:auto
28 |
29 | section
30 | position:relative
31 | z-index:2
32 |
33 | &:after
34 | content:" "
35 | display:block
36 | position:absolute
37 | top:0
38 | left:0
39 | right:0
40 | bottom:0
41 | background-color:hsla(0,0%,0%,0.4)
42 | z-index:1
43 |
44 | .hero-title
45 | margin:0.25rem 0 2rem
46 | +below(mobile)
47 | font-size:1.5em
48 |
49 | .author-nameplate
50 | .avatar
51 | float:left
52 | margin-right:1rem
53 | small
54 | display:inherit
55 | margin-top:-0.25em
56 |
57 | .avatar
58 | width:40px
59 | height:40px
60 | box-shadow:0 2px 4px hsla(0,0%,0%,0.4)
61 | transition:box-shadow 0.3s ease, transform 0.3s ease
62 | &:hover
63 | transform:scale3d(1.1, 1.1, 1)
64 | box-shadow:0 3px 6px hsla(0,0%,0%,0.4)
65 |
66 | .intro
67 | background-color:#eee
68 |
69 | .text-overlay
70 | position:absolute
71 | top:3rem
72 | left:0
73 | width:100%
74 | margin:0 auto
75 |
76 | // &:hover .droid-hero > path:first-child
77 | // animation-duration:7s
78 |
79 | .recent
80 | overflow:hidden
81 | background-color:white
82 | padding-top:2rem
83 | > section
84 | position:relative
85 |
86 | .recent-title
87 | margin-top:0
88 |
89 | .commit,
90 | .recent-commit
91 | position:absolute
92 | top:6px
93 | left:-2rem
94 |
95 | &:before
96 | content:" "
97 | position:absolute
98 | top:15px
99 | left:8px
100 | width:2px
101 | height:400px
102 | background:white
103 |
104 | .recent-commit
105 | top:6px
106 |
107 | .commit
108 | path
109 | fill:white
110 |
111 | .recent-commit
112 | &:before
113 | background:intel-grey
114 | bottom:25px
115 | top:auto
116 | height:40px
117 |
118 | .testimonial
119 | background:blue
120 | background-size:cover
121 | color:white
122 | padding:4rem 0 3rem
123 | position:relative
124 | overflow:hidden
125 |
126 | &:before
127 | content:" "
128 | background-image:url(/img/tear.svg)
129 | background-size:auto 100%
130 | position:absolute
131 | top:-3px
132 | left:-8px
133 | width:102%
134 | height:39px
135 | filter: drop-shadow(0 1px 2px hsla(0,0%,0%,0.3))
136 |
137 | .pop-out
138 | position:absolute
139 | top:6px
140 | left:-40px
141 | +below(tablet)
142 | position:relative
143 | top:-1rem
144 | left:0
145 |
146 | .btn.clear:hover
147 | color:white
148 |
--------------------------------------------------------------------------------
/assets/css/_icons.styl:
--------------------------------------------------------------------------------
1 | .hub-logo
2 | &:hover
3 | path:last-child
4 | fill:lighten(default-color, 20%)
5 |
6 | .icon-search
7 | width:15px
8 | height:15px
9 | position:relative
10 | top:3px
11 | right:5px
12 | path
13 | fill:white
14 |
15 | .icon-arrow
16 | height:20px
17 |
18 | .tweet > .social-icon-wrap > svg,
19 | .post > .social-icon-wrap > svg,
20 | .plus > .social-icon-wrap > svg,
21 | .tweet > svg,
22 | .post > svg,
23 | .plus > svg
24 | width:65px
25 | height:65px
26 | filter: drop-shadow(1px 1px 3px hsla(0,0%,0%,0.4))
27 | ellipse
28 | fill:white
29 | path
30 | fill:twitter
31 |
32 | .inline-social
33 | .icon-twitter path
34 | fill:twitter
35 | .icon-facebook path
36 | fill:facebook
37 | .icon-googleplus path
38 | fill:gplus
39 |
40 | &:hover
41 | .icon-twitter
42 | ellipse
43 | fill:twitter
44 | path
45 | fill:white
46 | .icon-facebook
47 | ellipse
48 | fill:facebook
49 | path
50 | fill:white
51 | .icon-googleplus
52 | ellipse
53 | fill:gplus
54 | path
55 | fill:white
56 |
57 | a:hover
58 | .icon-twitter-bird path
59 | fill:twitter
60 | .icon-link path
61 | fill:default-color
62 | .icon-codepen path
63 | fill:codepen
64 | .icon-github path
65 | fill:github
66 |
--------------------------------------------------------------------------------
/assets/css/_language-selector.styl:
--------------------------------------------------------------------------------
1 | .language-selector
2 | font-size: 16px // Sets the proper font size for the field guide
3 | background-color: #383838
4 |
5 | section
6 | font-size: 0.875em
7 |
8 | .grid__col-12
9 | padding-top: .5em
10 | padding-bottom: .5em
11 |
12 | +below(tablet)
13 | font-size: .75em
14 |
15 | select
16 | border:none
17 | outline:none
18 | background:#383838
19 | color:white
20 | position:relative
21 |
22 | .chrome-on-windows, .windows-ie-10, .windows-ie-11
23 | & > option
24 | color: white
25 | background: #383838
26 |
27 | label
28 | color: white
29 | font-weight: bold
30 |
--------------------------------------------------------------------------------
/assets/css/_natural-language-form.styl:
--------------------------------------------------------------------------------
1 | .nl-form
2 | width:100%
3 | margin:0 auto
4 | font-size: 1.7em
5 | line-height: 1.5
6 |
7 | +below(tablet)
8 | padding-top 1rem
9 | font-size 2em
10 |
11 | +below(mobile)
12 | font-size 1.5em
13 |
14 | ul
15 | list-style none
16 | margin 0
17 | padding 0
18 |
19 | input, textarea
20 | &:focus
21 | outline none
22 |
23 | textarea
24 | width:100%
25 | height:200px
26 | border:1px solid lighten(blue, 50%)
27 | margin:2rem 0 1rem
28 | color:blue
29 |
30 | .nl-field-go
31 | position absolute
32 | right 0
33 | top 0
34 | height 100%
35 | cursor pointer
36 | background darken(blue, 20%)
37 | width 1.8em
38 | text-align center
39 |
40 | .nl-submit
41 | padding 0.5em 1em
42 | font-size 1rem
43 |
44 | input, select, button
45 | border none
46 | background transparent
47 | font-family inherit
48 | font-size inherit
49 | color inherit
50 | font-weight inherit
51 | line-height inherit
52 | display inline-block
53 | padding 0
54 | margin 0
55 | appearance none
56 |
57 | input
58 | &::-webkit-input-placeholder
59 | color lighten(blue, 90%)
60 | &::-moz-placeholder
61 | color lighten(blue, 90%)
62 | &:-ms-input-placeholder
63 | color lighten(blue, 90%)
64 |
65 | input:active::-webkit-input-placeholder ,
66 | input:focus::-webkit-input-placeholder
67 | color lighten(blue, 10%)
68 |
69 | input:active::-moz-placeholder,
70 | input:focus::-moz-placeholder
71 | color lighten(blue, 10%)
72 |
73 | input:active::-ms-input-placeholder ,
74 | input:focus::-ms-input-placeholder
75 | color lighten(blue, 10%)
76 |
77 | .nl-field
78 | display inline-block
79 | position relative
80 |
81 | &.error > a
82 | color:red
83 | border-bottom-color:red
84 |
85 | &.complete > a
86 | color:default-color
87 | border-bottom-color:transparent
88 |
89 | &.nl-field-open
90 | z-index 100
91 |
92 | ul
93 | visibility visible
94 | opacity 1
95 | transform translateY(-50%) scale(1)
96 | transition visibility 0s 0s, opacity 0.3s, transform 0.3s
97 |
98 | & ~ .nl-overlay
99 | opacity 1
100 | visibility visible
101 | transition-delay 0s
102 |
103 | ul
104 | position absolute
105 | visibility hidden
106 | background blue
107 | left -0.5em
108 | top 50%
109 | opacity 0
110 | transform translateY(-40%) scale(0.9)
111 | transition visibility 0s 0.3s, opacity 0.3s, transform 0.3s
112 | +below(mobile)
113 | font-size 80%
114 |
115 | li
116 | color #fff
117 | position relative
118 |
119 | .nl-field-toggle,
120 | .nl-form input,
121 | .nl-form select
122 | line-height inherit
123 | display inline-block
124 | color blue
125 | cursor pointer
126 | border-bottom 1px solid blue
127 |
128 | .nl-dd
129 | ul
130 | li
131 | padding 0 1.5em 0 0.5em
132 | cursor pointer
133 | white-space nowrap
134 |
135 | &.nl-dd-checked
136 | color darken(blue, 50%)
137 |
138 | .no-touch
139 | .nl-dd
140 | ul li:hover
141 | background rgba(0,0,0,0.05)
142 | &:active
143 | color #478982
144 |
145 | .nl-ti-text
146 | ul
147 | min-width 12em
148 |
149 | li
150 | &.nl-ti-input
151 | input
152 | width 100%
153 | padding 0.2em 2em 0.2em 0.5em
154 | border-bottom none
155 | color #fff
156 |
157 | &.nl-ti-example
158 | font-size 60%
159 | font-style italic
160 | font-weight 400
161 | padding 0.4em 1em
162 | color #fff
163 | border-top 1px dashed lighten(blue, 70%)
164 |
165 | em
166 | color #fff
167 |
168 | .nl-submit-wrap
169 | margin-top 0.4em
170 |
171 | .no-touch .nl-form .nl-submit:hover,
172 | .no-touch .nl-form .nl-submit:active
173 | background darken(blue, 20%)
174 |
175 | .nl-overlay
176 | position fixed
177 | top 0
178 | left 0
179 | width 100%
180 | height 100%
181 | background rgba(0,0,0,0.5)
182 | opacity 0
183 | z-index 99
184 | visibility hidden
185 | transition visibility 0s 0.3s, opacity 0.3s
186 |
--------------------------------------------------------------------------------
/assets/css/_nav.styl:
--------------------------------------------------------------------------------
1 | nav
2 | box-shadow:0 2px 5px hsla(0,0%,0%,0.13)
3 | padding:1em 0
4 | background-color:white
5 | position:relative
6 | z-index:2
7 | font-size: 16px // This sets the proper size for the field guide
8 |
9 | > section
10 | +below(mobile)
11 | padding:0 0.5em
12 |
13 | .link-nav-set
14 | > a
15 | color:hsl(0,0%,20%)
16 |
17 | &:first-child
18 | margin-left:0
19 | &:last-child
20 | margin-right:0
21 |
22 | +below(tablet)
23 | padding-bottom:0.5em
24 | .link-nav-set > a
25 | padding:0.5em 0.25em
26 |
27 | .grid > div:not(.link-nav-set)
28 | justify-content:center
29 | > a
30 | text-align:center
31 | align-self:center
32 |
33 |
34 | .link-nav-set
35 | > a
36 | text-decoration:none
37 | color:hsl(0,0%,50%)
38 | font-size:0.8em
39 | margin:0 0.25em
40 | cursor:pointer
41 | position:relative
42 |
43 | +above(tablet)
44 | font-size:0.9em
45 |
46 | &:hover, &.active
47 | color:blue
48 |
49 | .social-icon
50 | @extend .flex-child-image-fix
51 | margin:0 2px
52 | height:25px
53 | width:25px
54 | &:last-child
55 | margin-right:0
56 | &:hover
57 | > svg
58 | ellipse
59 | fill:default-color
60 |
61 | .icon-youtube > ellipse
62 | fill:youtube
63 | .icon-instagram > ellipse
64 | fill:instagram
65 | .icon-twitter > ellipse
66 | fill:twitter
67 | .icon-facebook > ellipse
68 | fill:facebook
69 | .icon-googleplus > ellipse
70 | fill:gplus
71 |
72 | .logo
73 | margin-right:2em
74 |
75 | .field-guide
76 | margin-left:1em
77 |
78 | .social-sidebar
79 | position:fixed
80 | // @extend .sticky
81 | top:50%
82 | left:0
83 | padding:0.5em 0.8em
84 | background:white
85 | width:60px
86 | box-shadow:0 2px 2px hsla(0,0%,0%,0.2)
87 | font-size:0.8em
88 |
89 | +below(desktop)
90 | display:none
91 |
92 | > a
93 | width:30px
94 | height:30px
95 | margin:0.3em auto
96 |
97 | .tweet > svg, .post > svg, .plus > svg
98 | width:30px
99 | height:30px
100 | filter:none
101 |
102 | path
103 | fill:white
104 |
105 | .tweet > svg
106 | ellipse
107 | fill:twitter
108 | .post > svg
109 | ellipse
110 | fill:facebook
111 | .plus > svg
112 | ellipse
113 | fill:gplus
114 |
--------------------------------------------------------------------------------
/assets/css/_scaffolding.styl:
--------------------------------------------------------------------------------
1 | html, body
2 | background-color:white
3 |
4 | .grid
5 | &.reverse-margin-sm
6 | margin:0 -0.5em
7 | width:calc(100% + 1em)
8 | max-width:calc(100% + 1em)
9 | &.reverse-margin-md
10 | margin:0 -1em
11 | width:calc(100% + 2em)
12 | max-width:calc(100% + 2em)
13 |
14 | main
15 | background-color:#eee
16 |
17 | &.post
18 | padding-bottom:1rem
19 | overflow:hidden
20 | position:relative
21 |
22 | > section
23 | +below(mobile)
24 | padding:0
25 |
26 | section
27 | margin:0 auto
28 | max-width:992px
29 |
30 | +below(992px)
31 | padding:0 1rem
32 |
33 | img, svg
34 | max-width:100%
35 |
36 | a[href]
37 | color:blue
38 | &:hover
39 | color:darken(blue,20%)
40 |
41 | &.light, &.dark, &.inherit-color
42 | text-decoration:none
43 | &:hover
44 | text-decoration:underline
45 |
46 | &.light
47 | color:white
48 | &:hover
49 | color:white
50 | &.dark
51 | color:#555
52 | &:hover
53 | color:#222
54 | &.inherit-color
55 | color:inherit
56 | &:hover
57 | color:inherit
58 |
59 | img[src=""]
60 | @extend .placeholder-background-image
61 |
62 | article
63 | max-width:768px
64 | margin:0 auto
65 | padding:0 0 2rem 0
66 | overflow:hidden
67 |
68 | aside
69 | border-top:1px solid #ddd
70 |
71 | input[type='search']
72 | appearance:none
73 | border:none
74 | background:none
75 | outline:none
76 | box-shadow:none
77 | border-radius:0
78 | border-bottom:1px solid white
79 | &::-webkit-input-placeholder
80 | color:hsla(0,0%,100%,0.5)
81 | &::-moz-placeholder
82 | color:hsla(0,0%,100%,0.5)
83 | &:-ms-input-placeholder
84 | color:hsla(0,0%,100%,0.5)
85 |
86 | blockquote
87 | font-family: clearsans-thin
88 | position:relative
89 | background:blue
90 | color:white
91 | font-size:1.6rem
92 | padding:0.5rem 2rem 1.5rem
93 |
94 | a[href]
95 | color:white
96 | &:hover
97 | color:white
98 |
99 | +below(tablet)
100 | margin:0
101 |
102 | &:after
103 | content:" "
104 | background-image:url(/img/tear.svg)
105 | background-size:auto 100%
106 | position:absolute
107 | transform:rotate(180deg)
108 | bottom:-17px
109 | left:-8px
110 | width:102%
111 | height:39px
--------------------------------------------------------------------------------
/assets/css/_settings.styl:
--------------------------------------------------------------------------------
1 | // Axis Settings (http://roots.cx/axis)
2 |
3 | // default font stack
4 | font-stack = sans-serif
5 | font-size = 16
6 | font-color = #555
7 |
8 | // colors (via http://clrs.cc - slightly modded)
9 | navy = #001F3F
10 | blue = #007BC4
11 | aqua = #7FDBFF
12 | teal = #39CCCC
13 | olive = #3D9970
14 | green = #2ECC40
15 | lime = #01FF70
16 | yellow = #FFDC00
17 | orange = #FF851B
18 | red = #D13F19
19 | maroon = #85144B
20 | fuchsia = #F012BE
21 | purple = #B10DC9
22 | white = #FFFFFF
23 | silver = #DDDDDD
24 | gray = #AAAAAA
25 | black = #222222
26 |
27 | // default color
28 | default-color = #a4c739
29 | intel-grey = hsl(214, 4%, 34%)
30 |
31 | // social network colors
32 | facebook = #39569E
33 | twitter = #0FAAF5
34 | gplus = #DC4E41
35 | instagram = #3f729b
36 | youtube = #e52d27
37 | github = #666666
38 | codepen = #FF6A67
39 |
40 | // text highlight color
41 | highlight-color = default-color
42 |
43 | // responsive breakpoints by name
44 | mobile = 480px
45 | tablet = 768px
46 | laptop = 992px
47 | desktop = 1200px
48 |
49 | // ligatures
50 | ligatures = false
51 |
52 | // vertical rhythm
53 | base-line-height = 24px
54 | default-rhythm-border-style = solid
55 | relative-font-sizing = true
56 | round-to-nearest-half-line = false
57 | min-line-padding = 2px
58 |
59 | // custom image base path for roots mixins
60 | img-path = ''
61 |
62 | // support for old IE
63 | support-for-ie = true
64 |
65 | // progressive IE (http://css3pie.com/)
66 | pie-enabled = false
67 | pie-path = '/pie.htc'
68 |
--------------------------------------------------------------------------------
/assets/css/_typography.styl:
--------------------------------------------------------------------------------
1 | font-face('clearsans-thin', 'font/clearsans')
2 | // font-face('clearsans-light', 'font/clearsans')
3 | font-face('clearsans-regular', 'font/clearsans')
4 | // font-face('clearsans-medium', 'font/clearsans')
5 | font-face('clearsans-bold', 'font/clearsans')
6 |
7 | .fonts-loaded
8 | body
9 | font-family: clearsans-regular
10 | .clearsans-thin, .thin-type
11 | font-family: clearsans-thin
12 | // .clearsans-light
13 | // font-family: clearsans-light
14 | .clearsans-regular, .normal-type
15 | font-family: clearsans-regular
16 | // .clearsans-medium
17 | // font-family: clearsans-medium
18 | .clearsans-bold, .bold-type
19 | font-family: clearsans-bold
20 |
21 | h1,h2,h3,h4,h5,h6
22 | font-family: clearsans-bold
23 |
24 | p
25 | paragraph: 1em false
26 |
27 | .fix-reflex-type
28 | word-spacing:normal !important
29 | letter-spacing:normal !important
30 | line-height:1.2 !important
31 |
32 | .ellipsis
33 | text-overflow:ellipsis
34 | white-space:nowrap
35 | overflow:hidden
36 |
37 | .text-left
38 | text-align:left
39 |
40 | .text-right
41 | text-align:right
42 |
43 | .text-center
44 | text-align:center
45 |
46 | text-selection(default-color)
47 |
--------------------------------------------------------------------------------
/assets/css/_utils.styl:
--------------------------------------------------------------------------------
1 | .card
2 | background:hsl(0,0%,100%)
3 | box-shadow:0 2px 5px hsla(0,0%,0%,0.18)
4 | padding:2rem 4rem
5 | width:calc(100% + 8rem)
6 | margin:0 -4rem
7 |
8 | +below(1120px)
9 | margin:0
10 | width:100%
11 |
12 | +below(laptop)
13 | padding:1rem 2rem
14 |
15 | +below(mobile)
16 | padding:0 1rem 1rem
17 |
18 | .hidden-xs
19 | +below(mobile)
20 | display:none
21 |
22 | .hidden-sm
23 | +below(tablet)
24 | display:none
25 |
26 | .hidden-lg
27 | +below(desktop)
28 | display:none
29 |
30 | .spacer
31 | &.xs
32 | padding:1rem 0
33 | &.sm
34 | padding:2rem 0
35 | &.md
36 | padding:4rem 0
37 | &.lg
38 | padding:8rem 0
39 |
40 | .marginless
41 | margin:0
42 |
43 | .push-top
44 | margin-top:1rem
45 | .push-bottom
46 | margin-bottom:1rem
47 | .push-bottom-sm
48 | margin-bottom:0.5rem
49 | .push-left
50 | margin-left:1rem
51 | .push-right
52 | margin-right:1rem
53 |
54 | .paddingless
55 | padding:0
56 |
57 | .bg-cover
58 | background-size:cover
59 |
60 | .cover
61 | object-fit:cover
62 |
63 | .bg-contain
64 | background-size:contain
65 |
66 | .contain
67 | object-fit:contain
68 |
69 | .flex-child-image-fix
70 | display:inherit
71 |
72 | .circle
73 | border-radius:50%
74 |
75 | .sticky
76 | position:sticky
77 | top:0
78 |
79 | .full-width-white
80 | padding:2rem 4rem
81 | background:white
82 | +below(tablet)
83 | padding:1rem
84 | +below(mobile)
85 | padding:0
86 |
87 | .auto-width-xs
88 | +above(mobile)
89 | width:auto
90 |
91 | .pop-forward-sm
92 | position:relative
93 | z-index:2
94 |
95 | .placeholder-background-image
96 | background-image:url(/img/placeholder.svg)
97 | background-position:center center
98 | background-repeat:no-repeat
99 | background-color:#f2f2f2
100 | background-size:60% auto
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-bold.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-bold.eot
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-bold.ttf
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-bold.woff
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-light.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-light.eot
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-light.ttf
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-light.woff
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-medium.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-medium.eot
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-medium.ttf
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-medium.woff
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-regular.eot
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-regular.ttf
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-regular.woff
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-thin.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-thin.eot
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-thin.ttf
--------------------------------------------------------------------------------
/assets/css/font/clearsans/clearsans-thin.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/css/font/clearsans/clearsans-thin.woff
--------------------------------------------------------------------------------
/assets/css/guide.styl:
--------------------------------------------------------------------------------
1 | @import '../../bower_components/reflex-grid/css/reflex.css'
2 | @require '_settings'
3 | @require '_utils'
4 | @require '_icons'
5 | @require '_colors'
6 | @require '_nav'
7 | @require '_language-selector'
8 | @require '_footer'
9 |
10 | section
11 | margin:0 auto
12 | max-width:992px
13 |
14 | +below(992px)
15 | padding:0 1rem
16 |
17 | img, svg
18 | max-width:100%
19 |
--------------------------------------------------------------------------------
/assets/css/master.styl:
--------------------------------------------------------------------------------
1 | normalize-css()
2 | base()
3 |
4 | @require '_settings'
5 | @require '_utils'
6 | @require '_typography'
7 | @require '_icons'
8 | @require '_colors'
9 | @require '_scaffolding'
10 | @require '_buttons'
11 | @require '_animations'
12 | @require '_nav'
13 | @require '_language-selector'
14 | @require '_feed'
15 | @require '_header'
16 | @require '_footer'
17 | @require '_authors'
18 | @require '_home'
19 | @require '_natural-language-form'
20 |
--------------------------------------------------------------------------------
/assets/img/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/img/.keep
--------------------------------------------------------------------------------
/assets/img/droid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/img/favicon.ico
--------------------------------------------------------------------------------
/assets/img/fractal-blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/img/fractal-blue.png
--------------------------------------------------------------------------------
/assets/img/intel_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/img/intel_logo.png
--------------------------------------------------------------------------------
/assets/img/megacat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/img/megacat.jpg
--------------------------------------------------------------------------------
/assets/img/placeholder.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/img/section-title-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/assets/img/section-title-bg.png
--------------------------------------------------------------------------------
/assets/js/animations.coffee:
--------------------------------------------------------------------------------
1 | class Animations
2 |
3 | els =
4 | socialNavIcons: document.querySelectorAll 'nav .auto-width-xs > a'
5 | hubTitle: document.querySelector '.text-overlay > h5'
6 | homeHeader: document.querySelectorAll '.heroimage, .hero-title, .author-nameplate'
7 | heroNameplate: document.querySelectorAll '.author-nameplate > h4, .author-nameplate > a'
8 | homeHero: document.querySelector '.heroimage'
9 | sectionTitle: document.querySelector '.section-title h3'
10 | homeFeedItems: document.querySelectorAll '.recent .feed-item'
11 | intelLogo: document.querySelector '.intel-logo'
12 | commitButton: document.querySelector '.site-map .btn.blue'
13 | articleAvatar: document.querySelector '.header-nameplate .avatar'
14 | nameplate: document.querySelectorAll '.meta > *'
15 |
16 | # top nav social svg icons
17 | if els.socialNavIcons
18 | Velocity els.socialNavIcons, 'transition.expandIn',
19 | drag: true
20 | stagger: 200
21 |
22 | # home page hero image
23 | animateHomeHero = ->
24 | Velocity els.homeHeader, 'transition.slideUpIn',
25 | drag: true
26 | stagger: 250
27 | display: ''
28 | complete: ->
29 | Velocity els.heroNameplate, 'transition.slideLeftIn',
30 | drag: true
31 | stagger: 250
32 | display: ''
33 |
34 | if els.homeHero
35 | if els.homeHero.complete then animateHomeHero()
36 | else els.homeHero.onload = animateHomeHero
37 |
38 | # home page recent posts items
39 | if els.homeFeedItems
40 | for el in els.homeFeedItems
41 | el.querySelector('img').addEventListener 'load', (e) ->
42 | Velocity e.target.parentNode.parentNode, 'transition.slideUpIn', display: ''
43 |
44 | # if els.hubTitle
45 | # Velocity els.hubTitle, 'callout.pulse',
46 | # delay: 3000
47 | # display: ''
48 |
49 | # each page title that's just under the nav
50 | if els.sectionTitle
51 | Velocity els.sectionTitle, 'transition.slideDownIn'
52 |
53 | # article hero image
54 | animateArticleHero = ->
55 | # remove class so hover animation is proper
56 | els.articleAvatar.classList.remove 'lazyanimate'
57 | # animate in avatar name and social
58 | Velocity els.nameplate, 'transition.slideLeftIn',
59 | drag: true
60 | stagger: 250
61 | display: ''
62 | delay: 500
63 |
64 | if els.articleAvatar && els.nameplate
65 | if els.articleAvatar.complete then animateArticleHero()
66 | else els.articleAvatar.onload = animateArticleHero
67 |
68 | # footer intel logo
69 | els.intelLogo.addEventListener 'load', ->
70 | Velocity els.commitButton, 'callout.tada', delay: 1500
71 |
--------------------------------------------------------------------------------
/assets/js/app.coffee:
--------------------------------------------------------------------------------
1 | class App
2 | ES6Promise.polyfill()
3 | FastClick.attach document.body
4 |
5 | lazySizesConfig.loadMode = 1
6 | lazySizesConfig.expand = 100
7 | lazySizesConfig.preloadAfterLoad = false
8 |
9 | document.addEventListener 'lazybeforeunveil', (e) ->
10 | bg = e.target.getAttribute 'data-bg'
11 | if bg
12 | e.target.style.backgroundImage = "url(#{bg})"
13 | e.target.removeAttribute 'data-bg'
--------------------------------------------------------------------------------
/assets/js/commit.coffee:
--------------------------------------------------------------------------------
1 | App.Commit = (->
2 | # dont do anything unless we're on the feed grid page
3 | @form = document.getElementById 'nl-form'
4 | return unless @form
5 | new NLForm @form
6 |
7 | @requiredFormElements =
8 | name: document.getElementById 'author-name'
9 | email: document.getElementById 'author-email'
10 | expertise: document.getElementById 'author-expertise'
11 | site: document.getElementById 'author-site'
12 |
13 | document
14 | .querySelector 'button[type=submit]'
15 | .addEventListener 'click', (e) =>
16 | e.preventDefault()
17 |
18 | # verify all fields are filled out
19 | for k,v of @requiredFormElements
20 | complete = checkEl(v)
21 |
22 | if complete then done() else notDone()
23 |
24 | # @form.addEventListener 'change', (e) =>
25 | # checkEl(e.target.parentNode.parentNode.parentNode.nextSibling)
26 |
27 | checkEl = (el) ->
28 | if el.value && el.checkValidity()
29 | complete = true
30 | el.previousSibling.classList.remove('error')
31 | # el.previousSibling.classList.add('complete')
32 | else
33 | complete = false
34 | # el.previousSibling.classList.remove('complete')
35 | el.previousSibling.classList.add('error')
36 |
37 | return complete
38 |
39 | notDone = () ->
40 | swal
41 | title: @form.dataset.errorTitle
42 | text: @form.dataset.errorText
43 | type: 'error'
44 |
45 | done = () ->
46 | data =
47 | name: @requiredFormElements.name.value
48 | email: @requiredFormElements.email.value
49 | expertise: @requiredFormElements.expertise.value
50 | site: @requiredFormElements.site.value
51 | message: document.getElementById('author-message').value
52 |
53 | console.log data
54 |
55 | xobj = new XMLHttpRequest()
56 | xobj.overrideMimeType "application/json"
57 | xobj.open 'POST', '/commit.php'
58 | xobj.onreadystatechange = () =>
59 | if xobj.readyState == 4 and xobj.status == 200
60 | json = JSON.parse(xobj.responseText)
61 | swal
62 | title: @form.dataset.successTitle
63 | text: @form.dataset.successText
64 | type: 'success'
65 | @form.style.display = 'none'
66 | xobj.send JSON.stringify data
67 |
68 | )()
69 |
--------------------------------------------------------------------------------
/assets/js/disqus.coffee:
--------------------------------------------------------------------------------
1 | App.Disqus = (->
2 | @disqus = document.getElementById 'disqus_thread'
3 | return unless @disqus
4 |
5 | disqus_shortname = 'intel-android-developer-hub'
6 | do ->
7 | dsq = document.createElement('script')
8 | dsq.type = 'text/javascript'
9 | dsq.async = true
10 | dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'
11 | (document.getElementsByTagName('head')[0] or document.getElementsByTagName('body')[0]).appendChild dsq
12 | )()
--------------------------------------------------------------------------------
/assets/js/elqQ.coffee:
--------------------------------------------------------------------------------
1 | _elqQ = _elqQ or []
2 | _elqQ.push [
3 | 'elqSetSiteId'
4 | '334284386'
5 | ]
6 | _elqQ.push [ 'elqTrackPageView' ]
7 |
8 | do ->
9 | async_load = ->
10 | s = document.createElement('script')
11 | s.type = 'text/javascript'
12 | s.async = true
13 | s.src = '//img03.en25.com/i/elqCfg.min.js'
14 | x = document.getElementsByTagName('script')[0]
15 | x.parentNode.insertBefore s, x
16 |
17 | if window.addEventListener
18 | window.addEventListener 'DOMContentLoaded', async_load, false
19 | else if window.attachEvent
20 | window.attachEvent 'onload', async_load
--------------------------------------------------------------------------------
/assets/js/feed.coffee:
--------------------------------------------------------------------------------
1 | App.Feed = (->
2 | # dont do anything unless we're on the feed grid page
3 | return unless document.getElementById 'feed-grid'
4 |
5 | # init grid from Grid class
6 | @FeedGrid = new App.Grid
7 | id: 'feed-grid'
8 | item: '.feed-item'
9 |
10 | # init search class and pass grid class
11 | new App.Search(@FeedGrid)
12 | )()
--------------------------------------------------------------------------------
/assets/js/fonts.coffee:
--------------------------------------------------------------------------------
1 | App.Fonts = (->
2 | # dont load the fonts if we've already loaded them on the first page visit
3 | # see includes/_font-strategy.jade
4 | return if !!localStorage['fonts-loaded']
5 |
6 | reg = new FontFaceObserver 'clearsans-regular', weight: 300
7 | light = new FontFaceObserver 'clearsans-thin', weight: 100
8 | bold = new FontFaceObserver 'clearsans-bold', weight: 600
9 |
10 | window.Promise
11 | .all([
12 | reg.check()
13 | light.check()
14 | bold.check()
15 | ])
16 | .then(
17 | () ->
18 | document.documentElement.className += 'fonts-loaded'
19 | localStorage['fonts-loaded'] = true
20 | () ->
21 | console.error 'error loading font'
22 | )
23 | )()
--------------------------------------------------------------------------------
/assets/js/ga-prod.coffee:
--------------------------------------------------------------------------------
1 | _gaq = _gaq or []
2 | _gaq.push [
3 | '_setAccount'
4 | 'UA-17890616-1'
5 | ]
6 | _gaq.push ['_setDomainName', 'androidhub.intel.com']
7 | _gaq.push [ '_trackPageview' ]
8 | do ->
9 | ga = document.createElement('script')
10 | ga.type = 'text/javascript'
11 | ga.async = true
12 | ga.src = (if 'https:' == document.location.protocol then 'https://ssl' else 'http://www') + '.google-analytics.com/ga.js'
13 | s = document.getElementsByTagName('script')[0]
14 | s.parentNode.insertBefore ga, s
--------------------------------------------------------------------------------
/assets/js/ga-stage.coffee:
--------------------------------------------------------------------------------
1 | _gaq = _gaq or []
2 | _gaq.push [
3 | '_setAccount'
4 | 'UA-29829591-5'
5 | ]
6 | _gaq.push [ '_trackPageview' ]
7 | do ->
8 | ga = document.createElement('script')
9 | ga.type = 'text/javascript'
10 | ga.async = true
11 | ga.src = (if 'https:' == document.location.protocol then 'https://ssl' else 'http://www') + '.google-analytics.com/ga.js'
12 | s = document.getElementsByTagName('script')[0]
13 | s.parentNode.insertBefore ga, s
--------------------------------------------------------------------------------
/assets/js/grid.coffee:
--------------------------------------------------------------------------------
1 | class App.Grid
2 | constructor: (options) ->
3 | @filters = document.getElementById 'feed-filter'
4 | @initGrid(options)
5 | @restoreState()
6 | @listen()
7 |
8 | filter: (q) ->
9 | @feedgrid.arrange filter: q
10 |
11 | initGrid: (options) ->
12 | @feedgrid = new Isotope '#' + options.id,
13 | itemSelector: options.item
14 | layoutMode: 'fitRows'
15 | # set min height on the grid container for tall browsers
16 | footer = document.querySelector 'footer'
17 | grid = document.querySelector '#feed-grid'
18 | docHeight = footer.offsetTop + footer.offsetHeight
19 | winHeight = window.innerHeight
20 | grid.style.minHeight = grid.offsetHeight + (winHeight - docHeight) + 10 + 'px'
21 |
22 | restoreState: ->
23 | hash = location.hash.replace '#', '.'
24 |
25 | if hash
26 | @filter hash
27 | if hash == '' then hash = 'all' else hash = hash.replace '.', ''
28 | @setActiveItem hash
29 |
30 | setState: (filter) ->
31 | if filter == 'all' then filter = ''
32 | location.hash = filter
33 |
34 | setActiveItem: (val) ->
35 | @filters.value = val
36 |
37 | listen: ->
38 | # selectbox change event
39 | @filters.addEventListener 'change', (e) =>
40 | filter = e.target.value
41 | @setState filter
42 |
43 | # convert select value to filter that isotope wants
44 | filter = if filter == 'all' then '*' else '.' + filter
45 | @filter filter
46 |
--------------------------------------------------------------------------------
/assets/js/language-selector.coffee:
--------------------------------------------------------------------------------
1 | do (window) ->
2 |
3 | return unless document.getElementById 'language-selector'
4 |
5 | languages = ['en', 'zh-hans', 'pt', 'ru', 'es']
6 | defaultLanguage = 'en'
7 | languageSelector = document.getElementById 'language-selector'
8 | urlParts = []
9 |
10 | _getUrl = ->
11 | window.location.href
12 |
13 | _urlParts = ->
14 | urlParts = _getUrl().split '/'
15 |
16 | _getCurrentLanguage = ->
17 | currentLanguage = urlParts[3]
18 | if languages.indexOf(currentLanguage) isnt -1
19 | currentLanguage
20 | else
21 | defaultLanguage
22 |
23 | _setCurrentLanguage = ->
24 | languageSelector.value = _getCurrentLanguage()
25 |
26 | _changeLanguage = (language) ->
27 | urlParts[3] = language
28 | window.location.href = urlParts.join '/'
29 |
30 | _watchSelector = ->
31 | languageSelector.addEventListener 'change', (ev) ->
32 | _changeLanguage ev.target.value
33 |
34 | Init = ->
35 | _urlParts()
36 | _setCurrentLanguage()
37 | _watchSelector()
38 |
39 | Init()
40 |
--------------------------------------------------------------------------------
/assets/js/search.coffee:
--------------------------------------------------------------------------------
1 | class App.Search
2 | constructor: (FeedGrid) ->
3 | @Grid = FeedGrid
4 | @gridNode = document.querySelector '#feed-grid'
5 | @listen()
6 | @loadPostsJSON (posts) =>
7 | @posts = @matchPostsWithAuthors posts.posts
8 |
9 |
10 | listen: ->
11 | document
12 | .querySelector '#search'
13 | .addEventListener 'change', (e) =>
14 | query = e.target.value.toLowerCase()
15 | if window.ga then ga 'send', 'event', 'input', 'search', query
16 | results = []
17 |
18 | # query posts object: title, content, url
19 | for key, author of @posts when key isnt 'items'
20 | for post in author.items when post.title.toLowerCase().indexOf(query) > -1 or post.content.indexOf(query) > -1 or post._url.indexOf(query) > -1 or (post.authorName && post.authorName.indexOf(query) > -1)
21 | results.push post.title
22 |
23 | # filter grid items by matching titles
24 | # @Grid.setState query
25 | @Grid.filter (el) ->
26 | # el is returned by isotope, for each of them, and this determines visibility
27 | title = el.querySelector('.post-title').textContent or el.querySelector('.post-title').innerText
28 | results.indexOf(title) > -1
29 |
30 | # show empty results message
31 | if !results.length
32 | @gridNode.setAttribute 'data-empty', true
33 | else
34 | @gridNode.removeAttribute 'data-empty'
35 |
36 | loadPostsJSON: (cb) ->
37 | xobj = new XMLHttpRequest()
38 | xobj.overrideMimeType "application/json"
39 | xobj.open 'GET', '/content.json', true
40 | xobj.onreadystatechange = () ->
41 | if xobj.readyState == 4 and xobj.status == 200
42 | cb JSON.parse(xobj.responseText)
43 | xobj.send null
44 |
45 | matchPostsWithAuthors: (posts) ->
46 | postNodes = @gridNode.querySelectorAll '.feed-item'
47 | for node in postNodes
48 | for key, author of posts when key isnt 'items'
49 | for post in author.items
50 | if (window.location.origin + post._url) == node.querySelector('a').href
51 | name = node.querySelector('address').textContent or node.querySelector('address').innerText
52 | post.authorName = name.toLowerCase()
53 | return posts
54 |
--------------------------------------------------------------------------------
/assets/js/share.coffee:
--------------------------------------------------------------------------------
1 | App.Share = (->
2 |
3 | els = document.querySelectorAll '.share'
4 | share =
5 | url: 'http://androidhub.intel.com'
6 | tags: 'AndroidDevs'
7 | twitter: 'The Android Developer Hub, by developers, for developers, find tips, tuts, and tricks here.'
8 | facebook: 'The Android Developer Hub, a community where developers can talk to, share with, and learn from other like-minded developers, whether you’re getting ready to develop your first app or an experienced dev with specific questions about the Android development process. Find tips, tuts, and tricks here.'
9 | googleplus: 'The Android Developer Hub, a community where developers can talk to, share with, and learn from other like-minded developers, whether you’re getting ready to develop your first app or an experienced dev with specific questions about the Android development process. Find tips, tuts, and tricks here.'
10 |
11 | dialogTop = ->
12 | window.innerHeight / 2 - 225
13 |
14 | dialogLeft = ->
15 | window.innerWidth / 2
16 |
17 | grabUrl = ->
18 | if location.href.indexOf('posts/') >= 0 then return location.href else return share.url
19 |
20 | shareToTwitter = ->
21 | # if we're sharing an article detail
22 | if document.querySelector 'main.post'
23 | attribute = document.getElementsByTagName('meta')['twitter:creator'].content
24 | attribute = attribute.substr 1, attribute.length
25 | share.twitter = document.querySelector('.header-title').textContent
26 |
27 | window.open "http://twitter.com/share?url=#{grabUrl()}&text=#{share.twitter}&hashtags=#{share.tags}&url=#{grabUrl()}&via=#{attribute}", "twitterwindow", "height=450, width=550, top=#{dialogTop()}, left=#{dialogLeft()}, toolbar=0, location=0, menubar=0, directories=0, scrollbars=0"
28 |
29 | shareToFacebook = ->
30 | window.open "https://facebook.com/sharer/sharer.php?u=#{escape(grabUrl())}", "facebookwindow", "height=450, width=550, top=#{dialogTop()}, left=#{dialogLeft()}, toolbar=0, location=0, menubar=0, directories=0, scrollbars=0"
31 |
32 | shareToGoogle = ->
33 | window.open "https://plus.google.com/share?url=#{escape(grabUrl())}", "googlepluswindow", "height=600, width=600, toolbar=0, location=0, menubar=0, directories=0, scrollbars=yes"
34 |
35 | [].forEach.call els, (el) ->
36 | el.addEventListener 'click', (e) ->
37 | e.preventDefault()
38 | target = e.currentTarget.getAttribute('share-target')
39 |
40 | switch target
41 | when 'twitter' then shareToTwitter()
42 | when 'facebook' then shareToFacebook()
43 | when 'google' then shareToGoogle()
44 |
45 | if ga then ga 'send', 'event', 'button', 'click', target
46 |
47 | )()
--------------------------------------------------------------------------------
/assets/js/text-effect.coffee:
--------------------------------------------------------------------------------
1 | class TextEffect
2 | random_num = document.querySelectorAll '.nbr'
3 | timer = 8
4 | data = 0
5 | letters = "Android tips, tuts and tricks from one developer to another.".split ''
6 |
7 | for num in random_num
8 | change = Math.round (Math.random() * 100)
9 | num.setAttribute 'data-change', change
10 |
11 | random = ->
12 | return Math.round(Math.random() * 9)
13 |
14 | select = ->
15 | return Math.round(Math.random() * random_num.length+1)
16 |
17 | value = ->
18 | el = document.querySelector ".nbr:nth-child(#{select()})"
19 | if not el then return
20 | el.innerHTML = random()
21 | el.setAttribute 'data-number', data
22 | data++
23 |
24 | for num, i in random_num
25 | if parseInt(num.getAttribute('data-number')) > parseInt(num.getAttribute('data-change'))
26 | num.innerHTML = letters[i]
27 | num.className = ''
28 |
29 | if data.length >= random_num.length * 2
30 | clearInterval it
31 |
32 | it = setInterval value, timer
--------------------------------------------------------------------------------
/assets/js/track.coffee:
--------------------------------------------------------------------------------
1 | App.Track = (->
2 |
3 | els =
4 | homeHero: document.querySelector '.hero > section > a'
5 | homeRecent: document.querySelectorAll '.recent .feed-item > a'
6 | homeTestimonial: document.querySelector '.testimonial a'
7 | footerCommit: document.querySelector 'footer .btn.blue'
8 | relatedPost: document.querySelector '.related-post a'
9 | feedItem: document.querySelectorAll '#feed-grid > .feed-item > a'
10 | feedFilter: document.querySelector '#feed-filter'
11 | formSubmit: document.querySelector '.nl-submit-wrap'
12 | allLinks: document.querySelectorAll 'a'
13 |
14 | if els.homeHero then els.homeHero.addEventListener 'click', -> track 'home-hero'
15 | if els.homeTestimonial then els.homeTestimonial.addEventListener 'click', -> track 'home-testimonial'
16 | if els.footerCommit then els.footerCommit.addEventListener 'click', -> track 'footer-commit'
17 | if els.relatedPost then els.relatedPost.addEventListener 'click', -> track 'related-post'
18 | if els.formSubmit then els.formSubmit.addEventListener 'click', -> track 'form-submit'
19 | if els.feedFilter then els.feedFilter.addEventListener 'change', (e) ->
20 | if window.ga then ga 'send', 'event', 'input', 'filter', e.target.value
21 |
22 | if els.homeRecent
23 | for el in els.homeRecent
24 | el.addEventListener 'click', -> track 'home-recent'
25 |
26 | if els.feedItem
27 | for el in els.feedItem
28 | el.addEventListener 'click', -> track 'feed-item'
29 |
30 | # GA Tracking
31 | track = (target) ->
32 | if window.ga then ga 'send', 'event', 'button', 'click', target
33 |
34 | # QQ Tracking
35 | if window._elq
36 | for el in els.allLinks
37 | el.addEventListener 'click', ->
38 | _elq.trackEvent this
39 |
40 | )()
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "intel-android",
3 | "version": "0.0.0",
4 | "authors": [
5 | "Adam Argyle "
6 | ],
7 | "license": "MIT",
8 | "ignore": [
9 | "**/.*",
10 | "node_modules",
11 | "bower_components",
12 | "test",
13 | "tests"
14 | ],
15 | "dependencies": {
16 | "es6-promise": "~3.0.2",
17 | "fastclick": "~1.0.6",
18 | "fontfaceobserver": "~1.5.1",
19 | "isotope": "~2.2.1",
20 | "lazysizes": "~1.1.5",
21 | "reflex-grid": "~1.0.4",
22 | "sweetalert": "~1.1.0",
23 | "velocity": "~1.2.2"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/commit.php:
--------------------------------------------------------------------------------
1 | false
27 | ));
28 | } else {
29 | header('HTTP/1.1 200 OK');
30 | echo json_encode(array(
31 | 'success' => true
32 | ));
33 | }
34 |
35 | function formatData($data) {
36 | $emailBody = array();;
37 |
38 | foreach ($data as $key => $value) {
39 | $emailBody[] = $key . ': ' . $value;
40 | }
41 |
42 | return implode("\r\n", $emailBody);
43 | }
44 |
45 | function email($to, $subject, $body, $headers, $args) {
46 | if (DEBUG_MODE) {
47 | return TRUE;
48 | }
49 |
50 | return mail($to, $subject, $body, $headers, $args);
51 | }
52 |
53 | function detectRequestBody() {
54 | $rawInput = fopen('php://input', 'r');
55 | $tempStream = fopen('php://temp', 'r+');
56 | stream_copy_to_stream($rawInput, $tempStream);
57 | rewind($tempStream);
58 |
59 | return $tempStream;
60 | }
61 |
--------------------------------------------------------------------------------
/data/authors/TomDawsonAH.yaml:
--------------------------------------------------------------------------------
1 | displayname: Tom Dawson
2 | github: TomDawsonAH
3 | company: Android Headlines
4 | title: Editor-in-Chief
5 | website: 'http://www.androidheadlines.com/'
6 | twitter: androidheadline
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/abhilegend.yaml:
--------------------------------------------------------------------------------
1 | displayname: Abhishek Nandy
2 | github: abhilegend
3 | company: Geek Monkey Studios
4 | title: CEO
5 | website: https://geekmonkeystudios.wordpress.com
6 | twitter: abhisheknandy81
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/admin.yaml:
--------------------------------------------------------------------------------
1 | # Personal Info
2 | displayname: 'Intel Android Hub Admin'
3 | nickname: 'admin'
4 | website: 'http://androidhub.intel.com'
5 | title: 'Admin'
6 | company: 'Intel'
7 |
8 | # Social Networks
9 | twitter: 'intelsoftware'
10 | github: 'intel-android'
11 | codepen: ''
--------------------------------------------------------------------------------
/data/authors/argyleink.yaml:
--------------------------------------------------------------------------------
1 | # Personal Info
2 | displayname: 'Adam Argyle'
3 | nickname: 'Adrock'
4 | website: 'http://www.deloittedigital.com/'
5 | title: 'Web Engineer'
6 | company: 'Deloitte Digital'
7 |
8 | # Social Networks
9 | twitter: 'argyleink'
10 | github: 'argyleink'
11 | codepen: 'argyleink'
--------------------------------------------------------------------------------
/data/authors/blundell.yaml:
--------------------------------------------------------------------------------
1 | displayname: Paul Blundell
2 | github: blundell
3 | company: Novoda
4 | title: Senior Android Developer
5 | website: http://www.blog.blundellapps.com
6 | twitter: blundell_apps
7 | codepen: ''
8 | founder: true
--------------------------------------------------------------------------------
/data/authors/buitren9.yaml:
--------------------------------------------------------------------------------
1 | displayname: Francisco Buitrago
2 | github: buitren9
3 | company: Telefonica
4 | title: Software Developer
5 | website: 'http://technotopics.es'
6 | twitter: franbuitragopa
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/dennisstrein.yaml:
--------------------------------------------------------------------------------
1 | displayname: Dennis Strein
2 | github: dennisstrein
3 | company: appfour
4 | title: Co-founder
5 | website: http://www.appfour.com
6 | twitter: '@AndroidIDE'
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/edisonw.yaml:
--------------------------------------------------------------------------------
1 | # Personal Info
2 | displayname: 'Edison Wang'
3 | nickname: 'Edison'
4 | website: 'http://edisonwang.com'
5 | title: 'Senior Android Engineer'
6 | company: 'Twitter/Vine'
7 |
8 | # Social Networks
9 | twitter: 'wew'
10 | github: 'edisonw'
11 |
--------------------------------------------------------------------------------
/data/authors/iamdankaufman.yaml:
--------------------------------------------------------------------------------
1 | displayname: Daniel Kaufman
2 | github: iamdankaufman
3 | company: Brooklyn Labs
4 | title: Co-Founder
5 | website: 'http://www.danielerickaufman.com'
6 | twitter: iamdankaufman
7 | codepen: iamdankaufman
8 |
--------------------------------------------------------------------------------
/data/authors/lapiellosolutions.yaml:
--------------------------------------------------------------------------------
1 | displayname: Fabrizio Lapiello
2 | github: lapiellosolutions
3 | company: ''
4 | title: Intel Software Innovator
5 | website: 'http://www.lapiellosolutions.com'
6 | twitter: flapiello
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/lifeluvr.yaml:
--------------------------------------------------------------------------------
1 | displayname: Eric Payne
2 | github: lifeluvr
3 | company: Elite Computer Repair
4 | title: Owner
5 | website: ''
6 | twitter: erdapa
7 | codepen: erdapa
8 |
--------------------------------------------------------------------------------
/data/authors/nglauber.yaml:
--------------------------------------------------------------------------------
1 | displayname: Nelson Glauber
2 | github: nglauber
3 | company: CESAR
4 | title: Senior Software Engineer
5 | website: http://www.nglauber.com.br
6 | twitter: nglauber
7 | codepen: ''
8 | founder: false
--------------------------------------------------------------------------------
/data/authors/peachpellen.yaml:
--------------------------------------------------------------------------------
1 | displayname: Peach Pellen
2 | github: peachpellen
3 | company: Platino
4 | title: Chief Technology Officer
5 | website: 'http://peachpellen.com/'
6 | twitter: peachpellen
7 | codepen: ''
8 | founder: true
9 |
--------------------------------------------------------------------------------
/data/authors/smartnotify.yaml:
--------------------------------------------------------------------------------
1 | displayname: Gregory Menvielle
2 | github: smartnotify
3 | company: SmartNotify
4 | title: President
5 | website: https://www.smartnotify.us/blogs
6 | twitter: pyramedium
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/tamer1an.yaml:
--------------------------------------------------------------------------------
1 | displayname: Andrii Trybynenko
2 | github: tamer1an
3 | company: Zultys
4 | title: Senior Front-End Developer
5 | website: 'http://www.zultys.com/'
6 | twitter: trybynenko
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/authors/twoh.yaml:
--------------------------------------------------------------------------------
1 | displayname: Hafizh Herdi
2 | github: twoh
3 | company: "TWOH's Engineering"
4 | title: Founder
5 | website: http://www.twoh.co
6 | twitter: twoh
7 | codepen: ''
8 |
--------------------------------------------------------------------------------
/data/meta.yaml:
--------------------------------------------------------------------------------
1 | twitter:
2 | account: 'intelsoftware'
3 | site: 'https://androidhub.intel.com'
4 | title: 'Intel / Android Developer Hub'
5 | description: 'Engage with Intel for all things software and join a worldwide community of software developers on the Intel Developer Zone.'
6 | creator: 'intelsoftware'
7 | image: 'https://pbs.twimg.com/profile_images/451797078142767104/LjIk-xW-.png'
8 |
9 | opengraph:
10 | title: 'Intel / Android Developer Hub'
11 | url: 'https://androidhub.intel.com'
12 | image: 'https://pbs.twimg.com/profile_images/451797078142767104/LjIk-xW-.png'
13 | site: 'Intel / Android Developer Hub'
14 | description: 'Engage with Intel for all things software and join a worldwide community of software developers on the Intel Developer Zone.'
15 | author: 'Intel'
16 |
--------------------------------------------------------------------------------
/data/paths.yaml:
--------------------------------------------------------------------------------
1 | field_guide: '/android-field-guide/'
2 | github: 'https://github.com/intel-android/androidhub'
3 | home: '/'
4 | feed: '/feed.html'
5 | authors: '/authors.html'
6 | about: '/about.html'
7 | commit: '/commit.html'
8 | terms: 'http://www.intel.com/content/www/us/en/legal/terms-of-use.html'
9 | privacy: 'http://www.intel.com/content/www/us/en/privacy/intel-privacy-notice.html'
10 | cookies: 'http://www.intel.com/content/www/us/en/privacy/intel-cookie-notice.html'
11 | trademarks: 'http://www.intel.com/content/www/us/en/legal/trademarks.html'
12 |
--------------------------------------------------------------------------------
/data/social.yaml:
--------------------------------------------------------------------------------
1 | twitter: 'https://twitter.com/intelsoftware'
2 | google_plus: 'https://plus.google.com/+IntelSoftware'
3 | facebook: 'https://www.facebook.com/IntelDeveloperZone'
4 | youtube: 'https://www.youtube.com/user/intelswnetwork'
5 | instagram: 'https://instagram.com/inteldeveloperzone/'
6 | email: 'info@html5hub.com'
7 |
--------------------------------------------------------------------------------
/deploy_key.enc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/deploy_key.enc
--------------------------------------------------------------------------------
/jasmine-runner.js:
--------------------------------------------------------------------------------
1 | var Jasmine = require('jasmine');
2 | var SpecReporter = require('jasmine-spec-reporter');
3 | var noop = function() {};
4 |
5 | var jrunner = new Jasmine();
6 | jrunner.configureDefaultReporter({print: noop}); // remove default reporter logs
7 | jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
8 | jasmine.getEnv().addReporter(new SpecReporter()); // add jasmine-spec-reporter
9 | jrunner.loadConfigFile(); // load jasmine.json configuration
10 | jrunner.execute();
11 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "intel-android-hub",
3 | "description": "Intel Android Hub",
4 | "repository": "git@github.com:intel-android/androidhub.git",
5 | "version": "0.0.1",
6 | "license": "pending",
7 | "scripts": {
8 | "test": "node jasmine-runner.js",
9 | "posts-git-log": "node ./scripts/git-json.js",
10 | "new": "node ./scripts/new-author.js",
11 | "post": "node ./scripts/new-post.js"
12 | },
13 | "dependencies": {
14 | "autoprefixer-stylus": "0.5.x",
15 | "axis": "0.3.x",
16 | "coffee-script": "1.8.x",
17 | "css-pipeline": "0.3.x",
18 | "csso": "^1.5.4",
19 | "dynamic-content": "^0.3.x",
20 | "filesize-parser": "^1.3.1",
21 | "inquirer": "^0.9.0",
22 | "jade": "1.x",
23 | "js-pipeline": "0.2.x",
24 | "lodash": "^3.10.0",
25 | "marked": "0.3.x",
26 | "mime": "^1.3.4",
27 | "moment": "^2.11.2",
28 | "purify-css": "^1.1.2",
29 | "roots-records": "^0.5.0",
30 | "roots-yaml": "0.0.4",
31 | "rupture": "0.6.x",
32 | "shelljs": "^0.5.3",
33 | "stylus": "0.49.x"
34 | },
35 | "devDependencies": {
36 | "glob": "^5.0.14",
37 | "imagemagick": "^0.1.3",
38 | "jasmine": "^2.3.2",
39 | "jasmine-expect": "^2.0.1",
40 | "jasmine-node": "^1.14.5",
41 | "jasmine-spec-reporter": "^2.4.0",
42 | "js-yaml": "^3.5.3",
43 | "jstransformer-coffee-script": "^1.0.0",
44 | "jstransformer-marked": "^1.0.1",
45 | "request": "^2.60.0"
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/posts/TomDawsonAH/library/AndroidMarshmallow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/TomDawsonAH/library/AndroidMarshmallow.jpg
--------------------------------------------------------------------------------
/posts/TomDawsonAH/library/LostTablet.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/TomDawsonAH/library/LostTablet.jpeg
--------------------------------------------------------------------------------
/posts/abhilegend/library/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/1.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/2.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/3.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/4.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/5.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/6.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/7.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/8.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/9.png
--------------------------------------------------------------------------------
/posts/abhilegend/library/Picture3a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/abhilegend/library/Picture3a.png
--------------------------------------------------------------------------------
/posts/admin/library/android-hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/admin/library/android-hero.png
--------------------------------------------------------------------------------
/posts/admin/library/new-author.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/admin/library/new-author.gif
--------------------------------------------------------------------------------
/posts/argyleink/library/bolt.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/argyleink/library/bolt.jpg
--------------------------------------------------------------------------------
/posts/argyleink/library/purify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/argyleink/library/purify.png
--------------------------------------------------------------------------------
/posts/argyleink/library/uglify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/argyleink/library/uglify.png
--------------------------------------------------------------------------------
/posts/blundell/library/android-hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/blundell/library/android-hero.png
--------------------------------------------------------------------------------
/posts/blundell/library/crash-hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/blundell/library/crash-hero.png
--------------------------------------------------------------------------------
/posts/blundell/library/limit-hero.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/blundell/library/limit-hero.jpeg
--------------------------------------------------------------------------------
/posts/blundell/library/stetho-database-data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/blundell/library/stetho-database-data.png
--------------------------------------------------------------------------------
/posts/blundell/library/stetho-device-selection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/blundell/library/stetho-device-selection.png
--------------------------------------------------------------------------------
/posts/blundell/library/stetho-sql-commands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/blundell/library/stetho-sql-commands.png
--------------------------------------------------------------------------------
/posts/buitren9/library/activity_lifecycle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/buitren9/library/activity_lifecycle.png
--------------------------------------------------------------------------------
/posts/buitren9/library/evsas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/buitren9/library/evsas.png
--------------------------------------------------------------------------------
/posts/buitren9/library/hero_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/buitren9/library/hero_image.png
--------------------------------------------------------------------------------
/posts/buitren9/library/smartphone_blocks.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/buitren9/library/smartphone_blocks.jpg
--------------------------------------------------------------------------------
/posts/dennisstrein/library/aide.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/aide.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image1.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image2.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image3.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image4.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image5.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image6.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image7.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image8.png
--------------------------------------------------------------------------------
/posts/dennisstrein/library/image9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/dennisstrein/library/image9.png
--------------------------------------------------------------------------------
/posts/edisonw/buck.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Reducing Build Time on Android by Adopting Buck'
3 | categories: [build]
4 | heroimage: 'buck.png'
5 | excerpt: 'Hate pixel pushing with gradle but wants all the functionalities of it? Use Buck for debug builds.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | Note: I was asked to do a topic discussion at NY Mobile Forum the past weekend at Facebook and I decided to do one on developer productivity hacks, the content of this article was used to ignite the conversation.
13 |
14 | [This is part of Vine 's Engineering Blog series. ](http://engineering.vine.co/post/117873038742/reducing-build-times-by-adopting-buck)
15 |
16 | Since we started working on Vine for Android, we have used the following tools for development:
17 |
18 | - Android Studio (Intellij before Android Studio 0.1.0 was released)
19 | - Gradle build system
20 | - Crashlytics and other third party plugins
21 | - Jenkins for CI
22 |
23 | In this post, we’ll talk about how we reduced our iteration time during Android development by adopting Buck along side of our current Gradle structure.
24 |
25 | We like Gradle because it supports different configuration targets well, and it’s very easy to config and have everything merged for you. For example, currently we have to support multiple apks that are compiled from twenty different library modules that work on different platform versions, different remote targets, different app stores, and different test scenarios. Gradle scales well and makes all these configurations easy to build and test. It also works well with Maven and has native support within Android Studio. On top of that, we also have several custom build steps and plugins during different phases of the build process for some of our builds.
26 |
27 | Since we first released Vine for Android, two things have happened: (a) the app has gotten much bigger as we add more assets and (b) build time has increased as more build steps are added.
28 |
29 | Currently a clean build takes about four to five minutes, and a one-line change on the end of the dependency chain takes about one minute to build and install. That’s with “–parallel –daemon –offline” enabled. It takes even more time without that flag. Across our small (and growing) Android team, we spend a few hours of dev time every day on build and install.
30 |
31 | We tried to figure out why it was so slow by using “–profile” on Gradle, and it turns out that for a one-line change, “dex” (the merge of all the pre-dex-ed modules into “.dex”) and “install” (sending the apk to a device via USB and install the app) takes about 90% of that minute. And if we can fix that, we should be good.
32 |
33 | Turns out, Facebook’s Buck build system has an “ExoPackage” mode that does the exact thing. Buck does many tricks, such as smart-compiling dependents only when the method signature has changed, which results in fewer files needing to be compiled and a faster dex that is O(nlogn) instead of O(n^2). The thing that makes it really fast, though, is the multi-dex trick: it will only “dex” the module that have changed (not merging all existing ones), and it transfers only that modified dex file (instead of the entire APK) to the device when you make a single line of change, which is what usually happens during development.
34 |
35 | Knowing this, we wanted to move to Buck. It was intimidating because we depend on Gradle for many things, so we decided to make Buck live along Gradle and see how things go. With that approach, the task would not be as intimidating and could easily be broken down into a few steps:
36 |
37 | - Grab all the remote jars and aars and make them local
38 | - Change assumed final R values to be assigned during runtime
39 | - Create a merged AndroidManifest.xml file for Buck
40 | - Create Buck config for our debug config
41 |
42 | The whole process took about three dev days, and the results are amazing. Our clean builds now take about 40 seconds, and our one-line changes take about three to ten seconds, depending on the module you’re changing.
43 |
44 | Doing it this way we are able to use Buck for development of features, not break Gradle for Android Studio and still use Gradle for release builds to different stores or manufacturers. The con is, of course, every time we lose maven for dynamic dependency upgrades, and the changes for manifest files for Gradle modules need to get merged to the respected Buck config files. We opted to do it this way because we think that chances that we will be modifying our AndroidManifest now is rare, and we rarely update our dependencies.
45 |
46 | The next step is to make the sync process between Gradle and Buck more automated. We are quite happy with the current flow, and we think you should consider doing same if you also have a slow Gradle configuration that is slowing down your iteration cycles.
47 |
--------------------------------------------------------------------------------
/posts/edisonw/library/buck.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/edisonw/library/buck.png
--------------------------------------------------------------------------------
/posts/edisonw/library/edisonpost2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/edisonw/library/edisonpost2.jpeg
--------------------------------------------------------------------------------
/posts/iamdankaufman/4_Tips_on_How.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: '4 Tips on How to Choose a Mobile App Development Agency'
3 | categories: [launch]
4 | heroimage: 'four_tips.jpg'
5 | excerpt: 'Several businesses have discovered the need of having a mobile workforce...'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | Several businesses have discovered the need of having a mobile workforce, which simply works between the office and the fieldwork. Getting the required mobile app development agency could mean the difference between a beneficial mobile business for you, and spending money unnecessarily on useless code just to experience completely slow business death. It is therefore advisable to take proper research, assess, and examine any prospective partner you will work with. Any business that deals on warehousing require mainly different apps in contrast to a business that is into maintenance of household electronics. Android application development, - due to its popularity since it was introduced - has increased very rapidly, and it should not be difficult to get a good agency of developers who can create apps that suit the exact needs.
13 | Below are the necessary things to be considered before hiring an agency for mobile app development.
14 |
15 | # Check Their Experience in App Development
16 |
17 | The existing level of the agency before hiring must be noted. Know if it was recently established or has lasted for a couple of decades. That doesn’t mean you should depend only on the newbie developers. Check for the agencies that have experience leaders working with apps and their development. For instance, an HTML5 developer that has been in the coding and development industry will have the skills and knowledge needed to address any kind of mobile app development.
18 |
19 | # Ask to See Previous Work
20 |
21 | With this, one can easily identify if the agency is the main company to handle the project. Talking about apps for business an HTML5 developer with no sample of application is not the best choice. Your own experience should be noted while checking some sample work. Remember that the content and the form or design of the app is of utmost important. Agencies that create apps for the mobile platform and are definitely out for business will not waste much time to show their previous work to you knowing full well that it facilitates the business.
22 |
23 | # Find Out About your Point of Contact
24 |
25 | Real and adequate communication during the process of development is vital in accomplishing any app. Do not be far away from the developing team. You must be close to them too address your needs of functionality as well as design. If by any chance, you want to get an app built for android, it is necessary to have the project manager as your point of contact for the android application development team. It can easily be managed properly if you keep speaking with the same person from the starting point to the end of the project.
26 |
27 | # Ability to deliver on time
28 |
29 | This should be mostly considered. How fast does your app development agency respond to deadlines? Delay in delivery is a sign of setback because of the terms of cost and wasted opportunity which must have been encountered. You have to know if the agency is capable of reaching to their deadline as promised. With all the above information, you have gotten how to choose a mobile app development agency.
30 |
--------------------------------------------------------------------------------
/posts/iamdankaufman/Future_of_App_Development.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Future of App Development - The Hot Trends to Follow'
3 | categories: [build]
4 | heroimage: 'FutureofAppDev.jpg'
5 | excerpt: 'Formerly it was said that there is nothing that Google doesnt know, however, this verity is now true for mobile phone applications too.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | Formerly it was said that there is nothing that Google doesn’t know, however, this verity is now true for mobile phone applications too. From playing games to scientific calculator utility and from mobile phone shopping applications for almost anything and everything is probable in the app world. With 14 million apps and 3.2 billion users on app stores, there is a sturdy struggle when we talk about apps in the app store. These application development companies are spending a lot of money on marketing and app development as the Darwin’s law of “survival of fittest” operates in app world as well.
13 |
14 | Be it android or iOS or windows all of them are facing a hard-hitting antagonism. With unique ideas of application development coming everyday it is important to understand what’s next. We are all aware of the first mover advantage, that the one who will craft the best solution at the earliest to the problem through its application will be a sure winner in any scenario.
15 |
16 | Here are the upcoming trends in application development in near future –
17 |
18 | ## 1. Wearable and Smart Objects
19 | It all started by GARMIN followed by world electronic giant SAMSUNG and Now even APPLE is in the race. Apple has just launched a new smart watch. It is the first phase of iOS on smart watch. They have a new challenge of designing their apps compatible with the new wearable and also to design something that adds value preposition. To date most of the applications that are offered by the developers are basically based on health and fitness. But the time is about to change, the future teller of developers are predicting that one day using smart phones will be calibrated by the market of smart wearable. New devices are tested and experimented every day, so developers have a challenge to adapt their applications accordingly.
20 |
21 | ## 2. App Security
22 | Once upon a time it was said that it is almost impossible to breach security offered by Apple. iOS being a popular platform which markets itself as the safest operating system for smartphones. The company follows a zero tolerance policy towards any security threat. Your smart phones carry your personal as well as business related data. Hackers are always in pursuit to fetch this data from weak application base of the application, accessing to all confidential data on the mobile phone. Hence app security is the biggest threat to any application and therefore the developers should code application in such a way that these facades no more threat to anyone.
23 |
24 | ## 3. Location based Wifi
25 | Like I-Beacon technology, these 21st century smartphones are highly interactive and marketer can use this for marketing the products. These devices will interact with your mobile phones when you come across a wifi device and will send you information regarding their offerings. Developers must focus on the potential of this technology and should develop the software keeping this boon industry in the mind.
26 |
27 | The app development environment is very dynamic and thus developers should always update themselves on the current trends in iOS application development.
28 |
--------------------------------------------------------------------------------
/posts/iamdankaufman/The_Future_of_Android.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'The Future of Android: Android N the Future of Things to Come in Open Source'
3 | categories: [ideate]
4 | heroimage: 'dan_androidfuture.jpg'
5 | excerpt: 'To the casual Android user, there are not many changes that can disrupt the platforms future. But the latest code which developers have unearthed in the just-released flagship Android OS release by Google has definitely hit many in the middle.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | To the casual Android user, there are not many changes that can disrupt the platforms future. But the latest code which developers have unearthed in the just-released flagship Android OS release by Google has definitely hit many in the middle.
13 |
14 | ## Google’s Documentation says so, too
15 |
16 | It appears that it is not just the developer code that is hinting of changes set to come to the OS but it is also in the official document that Google Inc, has included with the release.
17 | The disruption hidden in layers of code and official small print is that Android too will go the way of hybrids.
18 | If that does not shock you enough, here is more. The hybrid will not be just a common platform but a ‘true hybrid’ much like Windows 10. Chrome OS and Chromebook could soon sit side-by-side with tablets, laptops, smartphones, PCs and even wearables, merging seamlessly.
19 |
20 | ## Android N: The Future of things to Come in Open Source
21 |
22 | The release of Android N with native support has definitely set the mobile computing world on a new course correction. The new additions include native support or split-screening apps, multiple window app display, closely following the refinement curve happening on Windows OS on these features.
23 |
24 | Android N has caught most by surprise, because, all along developers of this open source platform have consciously stayed away from hybridizing the system. Similarly, Apple’s OS developers have maintained that they do not need to welcome other nativities on their proprietary OS. However, these are public bravado by the two software giants, opined mobile industry insiders.
25 |
26 | The ring side view in the mobile industry is that, Apple OS and Android OS are running towards hybrid systems because they smell their biggest ever challenge is round the corner, in the form of the giant blue juggernaut – Microsoft’s Windows OS version 10.
27 |
28 | Microsoft with CEO Satya Nadella at the helm has been moving at an explosive speed, despite the visible ganglions across its product offerings. But the larger and long-term vision he holds for Windows OS penetrating into every visible digital aspect has Android and Apple OS developers looking to support Windows OS natively!
29 |
30 |
31 | The bottom line is that, Android OS will soon be packed into Chrome thanks to Windows OS greatness!
32 |
--------------------------------------------------------------------------------
/posts/iamdankaufman/library/FutureofAppDev.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/iamdankaufman/library/FutureofAppDev.jpg
--------------------------------------------------------------------------------
/posts/iamdankaufman/library/Top7Techniques.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/iamdankaufman/library/Top7Techniques.jpg
--------------------------------------------------------------------------------
/posts/iamdankaufman/library/dan_androidfuture.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/iamdankaufman/library/dan_androidfuture.jpg
--------------------------------------------------------------------------------
/posts/iamdankaufman/library/four_tips.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/iamdankaufman/library/four_tips.jpg
--------------------------------------------------------------------------------
/posts/iamdankaufman/library/topreasonsinvest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/iamdankaufman/library/topreasonsinvest.png
--------------------------------------------------------------------------------
/posts/iamdankaufman/top_7_techniques.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Top 7 Innovative Techniques to Improve Your Mobile Application'
3 | categories: [design, build]
4 | heroimage: 'Top7Techniques.jpg'
5 | excerpt: 'The actual achievements of any mobile app are reliant upon how its development and marketing occurs.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | The actual achievements of any mobile app are reliant upon how its development and marketing occurs. Any developer who will be good at programming and has technological capabilities can begin to make mobile applications immediately after getting sufficient knowledge of the application development. However, they have to consider the problems involved in mobile software development. Otherwise, they may have to fork out great costs of their mistakes.
13 |
14 | ## Including a lot of features
15 |
16 | Developers might believe developing a mobile application with comprehensive functions would be a sudden hit. However, it truly is not the proper approach to have too many functions at the first launch; a person discovers the software challenging to comprehend and could not be equipped to know what exactly is useful for these and what not will be, thus losing awareness. A mobile application should always be simple, user-friendly and most importantly purposeful.
17 |
18 | ## Developing on several platforms from the first go
19 |
20 | Developers should not create applications for a number of mobile platforms, just about all at once. It really is important to first focus on one mobile platform after which, move to the others. In case of any future changes, the developers could have to apply them on all the platforms, leading to help more efforts and great costs.
21 |
22 | As a result, it is important to formulate any well-thought technique for the release on one platform first after launching it on the other platforms.
23 |
24 | ## No room for flexibility
25 |
26 | A mobile application developer should often develop software, which is functional enough to have improvements. Improving is really a continuous process; an app should work in modern improved versions at the same time. It is important for any developer to make sure that the application works efficiently and perfectly even with upgrading mobile operating software several periods.
27 |
28 | ## Focusing everywhere other than on the buyer experience
29 |
30 | A developer has to create mobile applications by maintaining keeping at the center. It can be quite important to focus on purchaser encounter part, as the end-users should look for the app straightforward, simple to make use of, and eye-catching. The an app should always be user-friendly and straightforward to understand. An application will not be effective if it does not enlighten customers and provides them a best encounter.
31 |
32 | ## Improper monetization setting up
33 |
34 | Planning about monetizing your application is really a trial. Many developers do not succeed to tactic on the monetization part considering they're going to generate quickly through advertisements or customers are going to pay for their software. Developers can include two versions of an app, 100% totally free version and the best quality version consisting of additional functions or even keep in-app buys option.
35 |
36 | ## Not realizing the importance of marketing
37 |
38 | Uploading a mobile application at the store does not guarantee achievements. Its marketing is similarly important, as the viewers should come to know about its release. Developers should not delay to market the app after its release from the store. Exposure is important from the very start, for that they should market their application well.
39 |
40 | ## Not applying statistics services
41 |
42 | Developers will not have the ability to evaluate the achievements of the mobile application without keeping track of tools and stats. They can make use of any statistics remedies that best suits their specifications and utilize the recovered information for development from the future produces.
43 |
44 | ## Therefore, it truly is important to include statistics from the very start
45 |
46 | Avoiding mistakes will much likely guide mobile application developers to be effective in app stores; keeping the customers involved will improve the ROI. No doubt, the idea of the application could possibly be innovative, but the execution is similarly important.
47 |
--------------------------------------------------------------------------------
/posts/iamdankaufman/top_reasons_invest.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Top Reasons Why You Should Invest in Mobile App Development'
3 | categories: [ideate]
4 | heroimage: 'topreasonsinvest.png'
5 | excerpt: 'With mobile apps made for mobile OS from Android, Apple and others, you can make brand awareness and reliability between the vast number of present and potential customers.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | With mobile apps made for mobile OS from Android, Apple and others, you can make brand awareness and reliability between the vast number of present and potential customers. Several customers now expect a business or brand to have its own reliable mobile app. This indicates that it is not only becoming a need to get a reasonable edge over other businesses. Having a dedicated mobile app enhances to the reliability of the brand.
13 |
14 | Bear in mind the significance of that mobile application holds nowadays in society; it is only intelligent to make one for your business. Here is some reason why you should invest in mobile app development.
15 |
16 | ## 1. Mobile Apps Deliver On-The-Go Advertising
17 |
18 | With mobile apps your present customers can contact your business from any place and at any time in a customer friendly environment. Regular use of your app will emphasize your brand or business. This means that when they want to buy something, probabilities are they will come to you. You have formed a relationship with them using the app and this is equal to placing your business in your users’ pockets.
19 |
20 | ## 2. The World has gone Mobile
21 |
22 | There is no fraction that the globe has gone mobile and there is no turning back. Customers are using their phones to find local commerce. Your online branding attempts are being viewed by mobile networks. Therefore, just having a site is not sufficient anymore. Consumers are turning away from the desktop browsers and depend on mobile apps. Unlike outdated websites which overwhelm your six inch mobile displays, apps succeed as a spontaneous purchasing and browsing substitute.
23 |
24 | ## 3. Apps Increase Interest
25 |
26 | When you develop an app, it delivers you a simple way to show your products or services to your present and future customers. Every time they need to buy something, they can simply use it as a one-stop point to obtain all the info they want.
27 |
28 | ## 4. A Larger, Fresher Viewers
29 |
30 | Most young persons went mobile a long time before. Nearly 75 percent of the millennial age group will have smartphones by the end of the year. It is tough to involve the youth age group using old-fashioned techniques. Young person’s select to depend on their mobile devices, even though they might have access to an outdated personal computer. Smartphones have become the novel tool for talking with families and friends, browsing and buying goods and services online. To reach these viewers, you want to have a mobile app.
31 |
32 | ## 5. It Can Be a Social Platform
33 |
34 | It nearly goes without talk about that persons are passionate with social media. So you will need to be a part of their things well. Adding social features such as likes, comments,in-app messaging and thus onward in your app can aid your business increase its social standing. People spend more time on social media, particularly Facebook and Twitter. Thus, by having a mobile app that provides them whole features they get into social media means that they’ll spend more and more time in your mobile app.
35 |
36 |
--------------------------------------------------------------------------------
/posts/lapiellosolutions/Introduction_to_cross_platform_mobile_apps_development.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Introduction to cross-platform mobile apps development'
3 | categories: [ideate, build]
4 | heroimage: 'intel_xdk2.jpg'
5 | excerpt: "Did you know that high quality mobile cross-platform apps can be developed just using HTML,CSS and JavaScript?"
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | Did you know that high quality mobile cross-platform apps can be developed just using HTML,CSS and JavaScript?
13 | Ok, stupid question, lots of people know it but a big part of developers don’t know it, or they’re sceptic, or however not that much convinced about using those technologies in mobile field; for this last reason I decided to write several blog posts and some tech articles that will be linked down in this blog post for showing you how to use your skills in web field and with the IDE Intel XDK it can be developed into high quality mobile apps in a quick and extremely efficient way.
14 | For the purpose of these posts series, it is important to understand that apps executed on a mobile device are essentially of 3 kind:
15 |
16 | ## Mobile Web App
17 | These kind of apps are basically web sites developed for working as they were mobile apps but executed in a web browser on the device.
18 |
19 | ## Native Apps
20 | These kind of apps are developed with a specific programming language such as Objective-C in IOS field, Java in Android, BlackBerry, or for example C# in Windows Phone. The so-called native apps, unlike the mobile web apps, can access every device and operative system functionality and can be of a different kind. In fact, they range from simple apps to very complex 3D games.
21 |
22 | ## Hybrid Native Apps
23 | These kind of apps will characterize this series of blog posts. They are developed in HTML but unlike web apps, they are executed in a native container. The Hybrid Native Apps can access a lot of the device and operative system funcionality such as the camera, the gyroscope, the accelerometer etc.
24 |
25 | If you've come this far and are still asking _"Why develop hybrid apps?"_ There are multiple differentiators:
26 | - Savings in term of human resources (company side).
27 | - Ease of learning technologies (developer side).
28 | - Development costs and tests are extremely low and quick.
29 | - Development of an app for every OS.
30 | - The app developed can be sold in stores like native apps.
31 |
32 | If you are a web developer surely you’ll have the required skills for setting up a mobile app, or, more generally, if you know how to develop a web site surely you can develope a mobile app. Let’s see what you need to start developing Hybrid apps and for following this posts series :
33 | Intel XDK -> https://software.intel.com/en-us/intel-xdk
34 | Intel XDK Documentation -> https://software.intel.com/en-us/xdk/docs/intel-xdk-overview
35 |
36 | Fabrizio Lapiello
37 | Intel Software Innovator
38 |
--------------------------------------------------------------------------------
/posts/lapiellosolutions/library/intel_xdk2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lapiellosolutions/library/intel_xdk2.jpg
--------------------------------------------------------------------------------
/posts/lapiellosolutions/library/intelxdk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lapiellosolutions/library/intelxdk.png
--------------------------------------------------------------------------------
/posts/lifeluvr/An_Android_Debugging_Bridge.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'An Android Debugging Bridge Breakdown'
3 | categories: [launch]
4 | heroimage: 'hero4eric.jpeg'
5 | excerpt: 'Installing ADB Binaries on multiple devices so they can communicate via ADB commands in terminal.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | ADB, by itself, is NOT a program or application. It's actually part of a much larger program, Android Studio. ADB is often included in many other applications that communicate directly with Android devices because of it's unique abilities.
13 |
14 | Technically, ADB is a binary file. The ADB binaries are a key part of every Android Operating System. Often referred to as the "Back End" in programming, it does the work that the "Front End" tells it to do. The "Front End" being the part of a program that user sees and interacts with. All programs must have a stable back end. Or else, the front end will not function properly. Make sense?
15 |
16 | Since ADB doesn't have a GUI or front end, we're forced to use the terminal to access it's abilities but, to give your terminal these added ADB abilities your terminal MUST be open in the same directory or working folder that contains the ADB binaries! If you are not, your terminal will not know what ADB is and won’t know what to do with ADB commands! To do this we'll use the "cd" (change directory) command followed by the location of the ADB binaries:
17 |
18 | ````
19 | ~$ cd location/of/ADB/binaries
20 | ````
21 |
22 | Another method is to use the file manager to open the location of the ADB binaries. After you're in the same folder, right-click on any empty spot and select "Open in terminal".
23 |
24 | If you've downloaded and unpacked Android Studio already, the ADB binaries are located in the _Android/android-studio/platform-tools_ folder. You can also find the ADB binaries online but, Android Studio's binaries are always current and up to date (If you update Android Studio).
25 |
26 | 
27 |
28 | That's all it takes to make ADB commands recognizable while using the terminal! You can check by typing:
29 |
30 | ````
31 | ~$ adb
32 | ````
33 |
34 | or plug your Android in with USB Debugging set to _ON_ and type:
35 |
36 | ````
37 | ~$ adb devices
38 | ````
39 |
40 | _But_
41 |
42 | We don't want to bother with that every time we want to use ADB commands, right?
43 |
44 | If you open the file manager to the Linux root system files. There is a folder named "usr". Inside of that folder is another folder named "bin". In this case, bin is short for "Linux Root System’s User Binary Folder" but, who wants to type all of that, right? In the terminal you can get there by typing:
45 |
46 | ````
47 | ~$ cd /usr/bin
48 | ````
49 |
50 | 
51 |
52 | If you add the ADB binaries to that system binary location, your linux terminal will always have ADB abilities and, you won't have to bother with being in the same directory or folder with ADB!
53 |
54 | *IMPORTANT! It's best to NOT remove Android Studio's ADB binaries! Use copy n' paste and, make copies instead!*
55 |
56 | Let's use the "Front End" method, with root permissions, so we can watch all the action! Open up your terminal and type:
57 |
58 | ````
59 | ~$ sudo nautilus
60 | ````
61 |
62 | Enter your password. When the file manager opens you'll need to navigate to the /usr/bin folder. Next, open a second file manager (root is optional) and go to the folder containing your downloaded ADB binaries. Now, copy n' paste the ADB binaries into the open /usr/bin folder and do the same thing with "Fastboot" while we're here. Exit all of your open windows.
63 |
64 | 
65 |
66 | You now have ADB binaries installed on BOTH your devices! Finally, your devices can communicate via ADB commands in the terminal!
67 |
68 | That's it! You're all done and super-charged with awesome ADB and Fastboot powers! Any where you want!
--------------------------------------------------------------------------------
/posts/lifeluvr/Useful_ADB_Commands.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Useful ADB Commands'
3 | categories: [launch, build]
4 | heroimage: 'ericpost1.jpg'
5 | excerpt: 'What they do and how to use them!'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | For this tutorial you will need to have _ADB_ installed on your computer, your Android's _USB Debugging_ set to _ON_ and your device plugged into your computer! Ready?
13 |
14 | Here's the #1 _ADB_ command!
15 | In your computer's terminal, type:
16 |
17 | ```
18 | ~$ adb devices
19 | ```
20 |
21 | Basically, this is a system check. It tells if you have good connection and if your settings are correct!
22 |
23 | 
24 |
25 | These next two commands are pretty easy to understand.
26 | They're used to start and stop the _ADB_ server!
27 |
28 | ```
29 | ~$ adb start-server
30 | ~$ adb kill-server
31 | ```
32 |
33 | The next command (my favorite) is:
34 |
35 | ```
36 | ~$ adb install /path/to/.apk
37 | ```
38 |
39 | The way I like to use this command is to type, "adb install " (space after install). Then, _drag n' drop_ any .apk file from anywhere onto the terminal and press _Enter_ for super fast app installs from your computer!
40 |
41 | 
42 |
43 | Now, we'll look at the reboot commands:
44 |
45 | ```
46 | ~$ adb reboot
47 | ~$ adb reboot-recovery
48 | ~$ adb reboot-bootloader
49 | ```
50 |
51 | That's right! You can reboot your devices into 3 different modes without touching it! That's pretty awesome if you ask me!
52 |
53 | The next two commands are kind of the same but opposite:
54 |
55 | ```
56 | ~$ adb push /file/to/push /where/to/push it
57 | ```
58 |
59 | To understand this better we'll use the old _drag n' drop_ trick! Type, "adb push " (space after push). Then, _drag n' drop_ the file you want to push to your Android. Lastly, tell the file where to go!
60 | Example:
61 |
62 | ```
63 | ~$ adb push /home/Downloads/awesome.mp3 /sdcard/Music/
64 | ```
65 |
66 | Now for the other one:
67 |
68 | ```
69 | ~$ adb pull /file/to/pull /where/to/put it
70 | ```
71 |
72 | Let's use _adb push_'s example but, switched around a little bit. This is because we're pulling from the Android device instead!
73 | Example:
74 |
75 | ```
76 | ~$ adb pull /sdcard/Music/awesome.mp3 /home/Downloads/
77 | ```
78 |
79 | 
80 |
81 |
82 |
83 | Starting to get the hang of using _ADB_ ?
84 | Stay Tuned!
85 |
86 | Up next:
87 | #### Useful _ADB_ Commands II
88 |
--------------------------------------------------------------------------------
/posts/lifeluvr/Useful_ADB_Commands_II.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Useful ADB Commands II'
3 | categories: [launch, build]
4 | heroimage: 'EricPost2.jpeg'
5 | excerpt: 'Continuation of Useful ADB Commands I'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | For this tutorial you will need to have _ADB_ installed on your computer, your Android's _USB Debugging_ set to _ON_ and your device plugged into your computer! Ready?
13 |
14 | Today, we're going to make a full backup of your Android device. This backup doesn't take up any space on your Android and, you can restore your backup just by plugging your device into your computer!
15 |
16 | First, on your computer, let's make a new folder somewhere handy (mine's on my Desktop) and, name it "Android Backup". Next, open your new folder and right-click on an empty space and select "Open in terminal" (for Windows, press and hold 'Shift' when you right-click).
17 |
18 | 
19 |
20 | The first command we're going to look at is:
21 |
22 | ```
23 | ~$ adb backup -all
24 | ```
25 |
26 | After you press 'Enter', you will be asked to confirm this on your Android device. Set a password if you want your backup to be encrypted or, just leave it blank and tap "Back up my data".
27 |
28 | 
29 |
30 | Backups can take awhile, so, be patient! Your terminal will show you when it's completed. Do not close the terminal before it completes or your backup wont work!
31 |
32 | When it's done, you'll have a new file in your Android Backup folder called "backup.ab". However, technically, you've only backed up the device data and the app data, not any of your .apk files! To do this we add the "-apk" attribute. Example:
33 |
34 | ```
35 | ~$ adb backup -all -apk
36 | ```
37 |
38 | * Add " -system" or " -no system" if you want to backup just system apps or exclude system apps.
39 |
40 | There are more attributes you can add but, now, it's time for the second half of the tutorial.
41 |
42 | Here is how to restore your Android device with the backup we just made:
43 |
44 | ```
45 | ~$ adb restore /file/you want/to restore
46 | ```
47 |
48 | Here is where I like to use the _drag n' drop_ trick. Type, "adb restore " (space after restore). Then _drag n' drop_ the backup.ab file onto the terminal and press 'Enter'.
49 |
50 | 
51 |
52 | That's it! Now you know how to backup and restore your Android device using _ADB_!
53 |
54 | Stay tuned for the next edition:
55 |
56 | ### Useful _ADB_ commands III
57 |
58 | For more information about _ADB_ backup please go [here.](http://forum.xda-developers.com/galaxy-nexus/general/guide-phone-backup-unlock-root-t1420351)
--------------------------------------------------------------------------------
/posts/lifeluvr/library/EricPost2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/EricPost2.jpeg
--------------------------------------------------------------------------------
/posts/lifeluvr/library/adbAction1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/adbAction1.png
--------------------------------------------------------------------------------
/posts/lifeluvr/library/adbAction2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/adbAction2.png
--------------------------------------------------------------------------------
/posts/lifeluvr/library/adbAction3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/adbAction3.png
--------------------------------------------------------------------------------
/posts/lifeluvr/library/cd2platform-tools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/cd2platform-tools.png
--------------------------------------------------------------------------------
/posts/lifeluvr/library/copyNpaste.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/copyNpaste.png
--------------------------------------------------------------------------------
/posts/lifeluvr/library/ericpost1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/ericpost1.jpg
--------------------------------------------------------------------------------
/posts/lifeluvr/library/hero4eric.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/hero4eric.jpeg
--------------------------------------------------------------------------------
/posts/lifeluvr/library/usrBin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/lifeluvr/library/usrBin.png
--------------------------------------------------------------------------------
/posts/nglauber/library/AndroidSearch_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/nglauber/library/AndroidSearch_1.png
--------------------------------------------------------------------------------
/posts/nglauber/library/AndroidSearch_Hero.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/nglauber/library/AndroidSearch_Hero.jpg
--------------------------------------------------------------------------------
/posts/npm-debug.log:
--------------------------------------------------------------------------------
1 | 0 info it worked if it ends with ok
2 | 1 verbose cli [ '/usr/local/Cellar/node/5.1.0/bin/node',
3 | 1 verbose cli '/usr/local/bin/npm',
4 | 1 verbose cli 'install',
5 | 1 verbose cli '-g',
6 | 1 verbose cli 'bower' ]
7 | 2 info using npm@1.4.29
8 | 3 info using node@v5.1.0
9 | 4 warn deprecated This version of npm lacks support for important features,
10 | 5 warn deprecated such as scoped packages, offered by the primary npm
11 | 6 warn deprecated registry. Consider upgrading to at least npm@2, if not the
12 | 7 warn deprecated latest stable version. To upgrade to npm@2, run:
13 | 8 warn deprecated npm -g install npm@latest-2
14 | 9 warn deprecated To upgrade to the latest stable version, run:
15 | 10 warn deprecated npm -g install npm@latest
16 | 11 warn deprecated (Depending on how Node.js was installed on your system, you
17 | 12 warn deprecated may need to prefix the preceding commands with `sudo`, or if
18 | 13 warn deprecated on Windows, run them from an Administrator prompt.)
19 | 14 warn deprecated If you're running the version of npm bundled with
20 | 15 warn deprecated Node.js 0.10 LTS, be aware that the next version of 0.10 LTS
21 | 16 warn deprecated will be bundled with a version of npm@2, which has some small
22 | 17 warn deprecated backwards-incompatible changes made to `npm run-script` and
23 | 18 warn deprecated semver behavior.
24 | 19 error Error: Cannot find module 'sha'
25 | 19 error at Function.Module._resolveFilename (module.js:338:15)
26 | 19 error at Function.Module._load (module.js:289:25)
27 | 19 error at Module.require (module.js:366:17)
28 | 19 error at require (module.js:385:17)
29 | 19 error at Object. (/usr/local/lib/node_modules/npm/lib/cache/add-local-tarball.js:7:11)
30 | 19 error at Module._compile (module.js:425:26)
31 | 19 error at Object.Module._extensions..js (module.js:432:10)
32 | 19 error at Module.load (module.js:356:32)
33 | 19 error at Function.Module._load (module.js:313:12)
34 | 19 error at Module.require (module.js:366:17)
35 | 19 error at require (module.js:385:17)
36 | 20 error If you need help, you may report this *entire* log,
37 | 20 error including the npm and node versions, at:
38 | 20 error
39 | 21 error System Darwin 14.4.0
40 | 22 error command "/usr/local/Cellar/node/5.1.0/bin/node" "/usr/local/bin/npm" "install" "-g" "bower"
41 | 23 error cwd /Users/peachpellen/androidhub/posts
42 | 24 error node -v v5.1.0
43 | 25 error npm -v 1.4.29
44 | 26 error code MODULE_NOT_FOUND
45 | 27 verbose exit [ 1, true ]
46 |
--------------------------------------------------------------------------------
/posts/peachpellen/5_Apps_for_Android.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: '5 Apps for Android Developers'
3 | categories: [ideate, launch, design]
4 | heroimage: 'top5androidapps.jpg'
5 | excerpt: 'A short list of apps available for Android that are designed to help developers with various day-to-day tasks'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | Today I'd like to share a short list of apps available for Android that are designed to help developers with various day-to-day tasks that I am hoping you will find useful; I know I have!
13 |
14 | ### [Developer Tools](https://play.google.com/store/apps/details?id=com.roysolberg.android.developertools)
15 |
16 | This app is so useful for not only getting to the somewhat buried developer options in your system menu, but also allows you to:
17 |
18 | - Quickly check your log for errors, no digging needed
19 | - Send that same log to yourself to view later
20 | - See your configuration and features and add both to the log if desired
21 | - View your app's manifest
22 | - See resource allocation
23 |
24 | It was built by a developer hoping to simplify some common Android development tasks and is a great time saver; plus it's free.
25 |
26 | ### [Developer Console](https://play.google.com/store/apps/details?id=com.google.android.apps.playconsole)
27 | Summed up by the name, "Developer Console" let's you access Google's Play Store developer console from your phone, as well as Google AdWords and even Google Analytics, which I've found especially useful.
28 |
29 | It may not be groundbreaking, but viewing any of these on a phone previously was pretty tedious; this app allows you to monitor your app easily which is especially important when you've just launched and you're eager to monitor progress closely without being tied to your computer.
30 |
31 |
32 | ### [Libraries for Developers](https://play.google.com/store/apps/details?id=com.desarrollodroide.repos)
33 | This is an **amazing** app; it has a massive number of libraries created by developers for all kinds of applications. You can preview features of each library within the app, see snippets, get information and figure out which you would like to implement in your app - all for free. (Yes, there are ads that can be a little intrusive at times but it's more than worth it.)
34 |
35 | If you only download one app from this list, you can't go wrong with Libraries for Developers.
36 |
37 | ### [UI Design for Android](https://play.google.com/store/apps/details?id=com.boopathy.raja.tutorial)
38 | The good? it's free, it's a great way to mock up your UI quickly and on the go and it is extremely easy to use. 90% or so of the widgets seem to work as expected, and *sometimes* you can get source code.
39 |
40 | The not so good? It's got some bugs. A few widgets don't seem to work correctly and some users have had issues getting their source code to download - however if you care more about mocking up the visuals than getting some quick cut-and-paste code you're happy to write yourself, then this is still an invaluable app.
41 |
42 |
43 |
44 | ### [AIDE- IDE for Android Java C++](https://play.google.com/store/apps/details?id=com.aide.ui)
45 | With over 22,000 five-star ratings and counting, this is another tool for letting you work on developing your app on the go.
46 |
47 | This is an app for creating apps - a pocket IDE. You can code as you normally would with the ability to do pretty much everything you would in Android Studio.
48 |
49 | The app is free, however it is worth investing in a good, travel-size bluetooth keyboard if you care about your thumbs.
50 |
51 |
52 |
53 | --------------
54 | If you have an app you rely on heavily to help you with development, I'd love to hear about it - my Dell Venue still has plenty of space left to fill!
55 |
--------------------------------------------------------------------------------
/posts/peachpellen/Infographic_Android_in_2015.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Infographic: Android in 2015'
3 | categories: [design, build]
4 | heroimage: 'android_2015_header.jpg'
5 | excerpt: 'This infographic highlights a few important Android statistics from 2015'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 | :marked
12 | This infographic highlights a few important Android statistics from 2015
13 |
14 | 
15 |
16 |
17 | One of the most difficult things a developer deals with on a regular basis is fragmentation; and this is never more of an issue than when dealing with Android.
18 |
19 | Android has been available on smartphones for just over 7 years, (the first went on sale in October, 2008,) and in that time has grown to become the most-used mobile OS today; in no small part due to adoption in emerging markets, where affordability is a major factor for consumers.
20 |
21 | In the process of creating devices catering to the widest possible audience, Android became so incredibly fragmented that I can’t even find a reliable estimate of how many different resolutions there are; though over 100 seems reasonable. New Android devices are being produced so rapidly, with hardware varying so drastically, that it’s impossible for a developer to truly target every device.
22 |
23 | The point of this simple infographic is not to lament these difficulties, but rather to step back and appreciate that while the sheer magnitude of Android's fragmentation can be overwhelming, it's also impressive, and it's a "problem" we as developers have many solutionss for; and we are coming up with new ones all the time.
24 |
25 | My next article will discuss some tips for dealing with Android fragmentation, which will surely continue to increase in 2016 - but in the meantime, as a developer myself the best advice I can give is to use a third party SDK with support for multiple platforms.
26 |
27 | It doesn’t matter if you’re developing for Android, iOS, Windows Phone and Desktop, or just Android; many cross platform SDKs have built in functionality that greatly simplify scaling, as well as other issues you might encounter. (Just be sure to pick a good one; for 2D you can’t go wrong with [Platino](http://platino.io/) or [Intel’s XDK](https://software.intel.com/en-us/intel-xdk), while for 3D [Unity](http://unity3d.com/) is a fantastic choice.)
28 |
29 | --------------
30 | If you have any tips for handling fragmentation, please share them with me via [Twitter](http://twitter.com/peachpellen) so I can include them in my next post :-)
31 |
--------------------------------------------------------------------------------
/posts/peachpellen/library/android2015-hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/android2015-hero.png
--------------------------------------------------------------------------------
/posts/peachpellen/library/android_2015_header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/android_2015_header.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/android_infographic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/android_infographic.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/bolt.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/bolt.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/devices-hero.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/devices-hero.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/golden_gate.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/golden_gate.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/header.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/interview-header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/interview-header.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/interview-header2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/interview-header2.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/peach_devices.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/peach_devices.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/purify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/purify.png
--------------------------------------------------------------------------------
/posts/peachpellen/library/top5androidapps.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/top5androidapps.jpg
--------------------------------------------------------------------------------
/posts/peachpellen/library/uglify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/peachpellen/library/uglify.png
--------------------------------------------------------------------------------
/posts/smartnotify/Geolocation_in_Apps.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Geolocation in Apps'
3 | categories: [launch, build]
4 | heroimage: 'geolocation.jpg'
5 | excerpt: 'A video covering some of the challenges you will run into when using Geolocation in your app.'
6 | ---
7 |
8 | extends ../../views/layouts/_single
9 |
10 | block content
11 |
12 |
--------------------------------------------------------------------------------
/posts/smartnotify/library/geolocation.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/smartnotify/library/geolocation.jpg
--------------------------------------------------------------------------------
/posts/smartnotify/library/gregpost1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/smartnotify/library/gregpost1.jpg
--------------------------------------------------------------------------------
/posts/tamer1an/library/android-iot-big-data.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/tamer1an/library/android-iot-big-data.jpeg
--------------------------------------------------------------------------------
/posts/template.jade:
--------------------------------------------------------------------------------
1 | ---
2 | title: '{{title}}'
3 | categories: [ideate, launch, design, build]
4 | heroimage: ''
5 | excerpt: 'Short description of the article'
6 | _ignore: true
7 | ---
8 |
9 | extends ../views/layouts/_single
10 |
11 | block content
12 | :marked
13 | Here's my first post on this little blog. **How exciting!**
14 |
--------------------------------------------------------------------------------
/posts/twoh/library/app1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/app1.png
--------------------------------------------------------------------------------
/posts/twoh/library/app2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/app2.png
--------------------------------------------------------------------------------
/posts/twoh/library/cred1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/cred1.png
--------------------------------------------------------------------------------
/posts/twoh/library/cred2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/cred2.jpg
--------------------------------------------------------------------------------
/posts/twoh/library/cred3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/cred3.png
--------------------------------------------------------------------------------
/posts/twoh/library/hafizhpost1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/hafizhpost1.jpg
--------------------------------------------------------------------------------
/posts/twoh/library/map1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intel-android/androidhub/89523104f3301e6a0cf0dd95dee670ada8974157/posts/twoh/library/map1.png
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | [](https://travis-ci.org/intel-android/androidhub)
2 | [](https://gitter.im/intel-android/androidhub?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
3 |
4 | ### Required Tools
5 | > These tools need to be installed on your machine, hopefully they're already there. We also expect you to have a GitHub account, and have used CLI tools a bit.
6 |
7 | - [ImageMagick](http://www.imagemagick.org/script/binary-releases.php)
8 | - [Node/NPM](https://nodejs.org/)
9 | - [Roots](http://roots.cx/) `npm i roots -g`
10 | - [Bower](http://bower.io/) `npm i bower -g`
11 | - Git
12 |
13 | ### Getting Started
14 | - run `npm i && bower i` to kick off installation of project and front end deps
15 | - run `roots watch` to begin dev development with live reload
16 |
17 | ### Author App Overview / Folder Architecture
18 | - `data/`
19 | Each .yaml files found in this folder is turned into a json object and passed to jade templates.
20 | - `posts/`
21 | Holds authors posts/articles. Each author has their own folder which holds their images and articles.
22 |
23 | ### Contributing!?
24 | Whether you want to write articles or help fix bugs, it's as easy as fork and pull request. For more information, see the [author readme](https://github.com/intel-android/androidhub/blob/master/authors_readme.md).
25 |
26 | ### Testing
27 | `npm test`
28 |
--------------------------------------------------------------------------------
/scripts/copy-field-guide.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | mkdir -p public/android-field-guide
4 | cp -R ../intel_android-field-guide/public/* public/android-field-guide
5 |
--------------------------------------------------------------------------------
/scripts/copy-library.js:
--------------------------------------------------------------------------------
1 | require('shelljs/global');
2 |
3 | var glob = require('glob');
4 | var path = require('path');
5 |
6 | module.exports = function() {
7 | console.log('copying library items...')
8 | mkdir('-p', path.normalize(path.join('public', 'library')));
9 | var authors = glob.sync(path.normalize(path.join("posts", "*")));
10 |
11 | for (var i = 0; i < authors.length; i++) {
12 | var author_path = authors[i];
13 | var author = author_path.split(path.sep)[1];
14 | mkdir('-p', path.normalize(path.join('public', 'library', author)));
15 | library = glob.sync(path.normalize(path.join("posts", author, 'library', '*')));
16 | for (var j = 0; j < library.length; j++) {
17 | var asset = library[j];
18 | var filename = asset.split(path.sep).pop();
19 | cp(asset, path.normalize(path.join('public', 'library', author, filename)));
20 | }
21 | }
22 | return true;
23 | };
24 |
--------------------------------------------------------------------------------
/scripts/create-thumbs.js:
--------------------------------------------------------------------------------
1 | var shell = require('shelljs')
2 | var glob = require('glob')
3 |
4 | module.exports = function() {
5 | console.log('making thumbnails of library images...')
6 |
7 | // grab images that were copied over, ignoring any already created thumbs
8 | var images = glob.sync("public/library/**/*.{jpg,jpeg,png}", {
9 | ignore: '**/*-thumb.*'
10 | })
11 |
12 | images.forEach(function(image, i){
13 | var pos = image.indexOf('.')
14 | var thumb = [image.slice(0, pos), '-thumb', image.slice(pos)].join('')
15 | shell.exec('convert '+ image +' -resize 300 ' + thumb)
16 | })
17 |
18 | return true
19 | }
--------------------------------------------------------------------------------
/scripts/deploy.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | openssl aes-256-cbc -K $encrypted_fd017f77ecb3_key -iv $encrypted_fd017f77ecb3_iv -in deploy_key.enc -out deploy_key -d
4 |
5 | eval "$(ssh-agent -s)" #start the ssh agent
6 | chmod 600 deploy_key
7 | ssh-add deploy_key
8 |
9 | rsync -i deploy_key --delete --exclude android-field-guide --exclude en/android-field-guide --exclude es --exclude ru --exclude --pt --exclude --zh=hans -r public/* ${DEPLOY_USER}@${DEPLOY_IP}:${DEPLOY_PATH}
10 |
--------------------------------------------------------------------------------
/scripts/deploy_production.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | openssl aes-256-cbc -K $encrypted_fd017f77ecb3_key -iv $encrypted_fd017f77ecb3_iv -in deploy_key.enc -out deploy_key -d
4 |
5 | eval "$(ssh-agent -s)" #start the ssh agent
6 | chmod 600 deploy_key
7 | ssh-add deploy_key
8 |
9 | rsync -i deploy_key --delete --exclude android-field-guide --exclude en/android-field-guide --exclude es --exclude ru --exclude --pt --exclude --zh=hans -r public/* ${DEPLOY_USER}@${DEPLOY_IP}:${DEPLOY_PATH_PROD}
10 |
--------------------------------------------------------------------------------
/scripts/get-author-image.js:
--------------------------------------------------------------------------------
1 | module.exports = function(author) {
2 | return author.twitter ? 'https://twitter.com/'+ author.twitter +'/profile_image?size=original' : '/img/placeholder.svg'
3 | }
--------------------------------------------------------------------------------
/scripts/get-author.js:
--------------------------------------------------------------------------------
1 | module.exports = function(post, data) {
2 | if (!post) return 'Missing post object parameter'
3 |
4 | var author_handle, author;
5 |
6 | if (post._categories && post._categories.length)
7 | author_handle = post._categories[1] ? post._categories[1] : 'admin'
8 | else
9 | // sometimes post._categories isnt present, we should fallback by extracting it from the url
10 | author_handle = post._url && post._url.split('/')[2]
11 |
12 | author = data.authors[author_handle]
13 | author.image = author.twitter ? 'https://twitter.com/'+ author.twitter +'/profile_image?size=original' : 'http://placehold.it/200x200?text=' + author.displayname
14 | author.hero = '/library/' + author_handle + '/' + author['heroimage']
15 |
16 | return author
17 | }
18 |
--------------------------------------------------------------------------------
/scripts/get-categories.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash')
2 |
3 | module.exports = function(site) {
4 | if (!site) return 'Missing post object parameter'
5 |
6 | var allCats = _.map(site.posts.all(), function(post){ return post.categories })
7 | var flatCats = _.flatten(allCats)
8 | var uniqCats = _.uniq(flatCats, function(cat){ return cat })
9 |
10 | return uniqCats
11 |
12 | // return
13 | // _.chain(site.posts.all())
14 | // .map(function(post){
15 | // return post.categories
16 | // })
17 | // .flatten()
18 | // .uniq(function(cat){ return cat })
19 | }
--------------------------------------------------------------------------------
/scripts/get-featured.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash')
2 |
3 | module.exports = function(site) {
4 | if (!site) return 'Missing site object parameter'
5 | return _.filter(site.posts.all(), 'featured')
6 | }
--------------------------------------------------------------------------------
/scripts/get-hero-image.js:
--------------------------------------------------------------------------------
1 | module.exports = function(post) {
2 | author_handle = post._url && post._url.split('/')[2];
3 |
4 | return post.heroimage ? '/library/' + author_handle + '/' + post.heroimage : '/img/placeholder.svg';
5 | };
6 |
--------------------------------------------------------------------------------
/scripts/get-merged-posts.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash')
2 |
3 | module.exports = function(site, records) {
4 | if (!site) return 'Missing site object parameter'
5 |
6 | // remove template post
7 | var filteredPosts = _.filter(site.posts.all(), function(post){
8 | return !post._ignore
9 | })
10 |
11 | // rename all post urls to jade names, to match the git keys
12 | var renamedPostUrls = _.forEach(filteredPosts, function(post){
13 | post.git_url = post._url.substr(1, post._url.length - 6) + '.jade'
14 | })
15 |
16 | // merge posts and git objects based on new key created
17 | var mergedObjects = _.forEach(renamedPostUrls, function(post){
18 | post.git = records.git[post.git_url] ? records.git[post.git_url] : records.git['posts/argyleink/first.jade']
19 | })
20 |
21 | return mergedObjects
22 | }
--------------------------------------------------------------------------------
/scripts/get-post-git-data.js:
--------------------------------------------------------------------------------
1 | module.exports = function(post, records) {
2 | if (!post) return 'Missing post object parameter'
3 |
4 | var url = post._url.substr(1, post._url.length - 6) + '.jade'
5 | var git = records.git[url] ? records.git[url] : records.git['posts/argyleink/first.jade']
6 |
7 | return git
8 | }
--------------------------------------------------------------------------------
/scripts/get-related-posts.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash')
2 |
3 | module.exports = function(post, posts) {
4 | if (!post) return 'Missing post object parameter'
5 |
6 | var filtered, catMatches, results
7 |
8 | // remove current post and template from that collection
9 | filtered = _.filter(posts, function(p){
10 | return p._url !== post._url && p._url !== '/posts/template.html'
11 | })
12 |
13 | // get all posts that share categories in the post
14 | catMatches = _.filter(filtered, function(p){
15 | return _.intersection(p.categories, post.categories).length
16 | })
17 |
18 | // limit to 2 results
19 | results = _.slice(catMatches, 0, 2)
20 |
21 | // if we have results, then send them over, otherwise send 2 other posts
22 | return results.length > 0 ? results : _.slice(filtered, 0, 2)
23 | }
--------------------------------------------------------------------------------
/scripts/git-json.js:
--------------------------------------------------------------------------------
1 | // "posts-git-log": "mkdir -p public && touch public/posts-git.json && ./scripts/git-json.sh posts/*/*.jade > public/posts-git.json",
2 | require('shelljs/global');
3 | var glob = require('glob');
4 | var path = require('path');
5 |
6 | if (!which('git')) {
7 | echo('Sorry, this script requires git');
8 | exit(1);
9 | }
10 |
11 | mkdir('-p', 'public');
12 | var json = [];
13 | var files_path = path.join('posts', '*', '*.jade');
14 | var files = glob.sync(path.normalize(files_path));
15 |
16 | var object = {};
17 | var formatter = "";
18 |
19 |
20 | formatter = '{%n ^@^commit^@^: ^@^%H^@^,%n ^@^author^@^: ^@^%an <%ae>^@^,%n ^@^date^@^: ^@^%ad^@^,%n ^@^message^@^: ^@^%s^@^%n}';
21 |
22 | for(var i=0; i
3 | // nickname :
4 | // website : 'http://aegaas.com'
5 | // title : 'Web Services Engineer'
6 | // company : 'Deloitte Digital'
7 | //
8 | // # Social Networks
9 | // twitter : 'aegaas'
10 | // github : 'aegaas'
11 | // codepen : 'aegaas'
12 |
13 | var inquirer = require("inquirer"),
14 | fs = require("fs"),
15 | path = require("path"),
16 | request = require('request'),
17 | yaml = require("js-yaml"),
18 | shell = require("shelljs");
19 |
20 | var root = path.resolve(__dirname + '/../');
21 |
22 | console.log('NEW AUTHOR SETUP\n');
23 | console.log('questions marked with * are required');
24 |
25 | var required = function(input) {
26 | return input.length > 0;
27 | };
28 |
29 | var validUrl = function(input) {
30 | if (input.length < 1) {
31 | return "Required question. Please try again.";
32 | }
33 |
34 | if (input.indexOf('http://') === -1) {
35 | if (input.indexOf('www') === -1) {
36 | input = 'www.' + input;
37 | }
38 | input = 'http://' + input;
39 | }
40 |
41 | var done = this.async();
42 | console.log(' fetching ' + input + ' ...');
43 | request.head(input, function(err, res) {
44 | if (err) {
45 | done("You must return a valid URL.");
46 | return;
47 | }
48 |
49 | console.log('received HTTP status code ' + res.statusCode);
50 |
51 | if (res.statusCode == 200) {
52 | done(true);
53 | } else {
54 | done("You must return a valid URL.");
55 | }
56 | });
57 | };
58 |
59 | var checkIfNewAuthor = function(input) {
60 | var done = this.async();
61 |
62 | if (!required(input)) {
63 | return done("github username is required");
64 | }
65 |
66 | fs.exists(path.resolve(root + '/data/authors/' + input + '.yaml'), function(exists) {
67 | if (exists) {
68 | done("this username already exists. Pick another.");
69 | } else {
70 | done(true);
71 | }
72 | });
73 | };
74 |
75 | var questions = [
76 | {
77 | type : 'input',
78 | message : 'What is your full name? *',
79 | name : 'displayname',
80 | validate: required
81 | },
82 | {
83 | type : 'input',
84 | message : 'What is your *github* username? *',
85 | name : 'github',
86 | validate: checkIfNewAuthor
87 | },
88 | {
89 | type : 'input',
90 | message : 'What is the name of the company you work for? *',
91 | name : 'company',
92 | validate: required
93 | },
94 | {
95 | type : 'input',
96 | message : 'What is your title at this company? *',
97 | name : 'title',
98 | validate: required
99 | },
100 | {
101 | type : 'input',
102 | message : 'What website would you like us to link to? *',
103 | name : 'website',
104 | validate: validUrl
105 | },
106 | // SOCIAL MEDIA ACCOUNTS
107 | {
108 | type : 'input',
109 | message : 'What is your *twitter* username? *',
110 | name : 'twitter',
111 | validate: required
112 | },
113 | {
114 | type : 'input',
115 | message: 'What is your *codepen* username?',
116 | name : 'codepen'
117 | },
118 | ];
119 |
120 | inquirer.prompt(questions, function( answers ) {
121 | var yamlString = yaml.safeDump(answers);
122 | var user = answers.github;
123 | var authorYamlPath = path.resolve(root + '/data/authors/' + user + '.yaml');
124 |
125 | // create a folder for the new author in the posts directory
126 | shell.exec('mkdir posts/' + user);
127 | shell.exec('mkdir posts/' + user + '/library');
128 |
129 | //write to yaml file
130 | fs.writeFile(authorYamlPath, yamlString, function(err) {
131 | if (err) throw err;
132 | console.log('wrote ' + authorYamlPath);
133 | shell.exec('git add ' + authorYamlPath);
134 | console.log('This will populate the authors page as well as pull your information into your posts.');
135 | });
136 |
137 | console.log();
138 | console.log('Next steps:');
139 | console.log('1. run: "npm run post" to create a new post');
140 | console.log();
141 | console.log('Thanks for contributing!');
142 | });
143 |
--------------------------------------------------------------------------------
/scripts/new-post.js:
--------------------------------------------------------------------------------
1 | // # Personal Info
2 | // displayname:
3 | // nickname :
4 | // website : 'http://aegaas.com'
5 | // title : 'Web Services Engineer'
6 | // company : 'Deloitte Digital'
7 | //
8 | // # Social Networks
9 | // twitter : 'aegaas'
10 | // github : 'aegaas'
11 | // codepen : 'aegaas'
12 |
13 | var inquirer = require("inquirer"),
14 | fs = require("fs"),
15 | path = require("path"),
16 | request = require('request'),
17 | yaml = require("js-yaml"),
18 | shell = require("shelljs");
19 |
20 | var root = path.resolve(__dirname + '/../');
21 |
22 | console.log('NEW POST SETUP\n');
23 | console.log('questions marked with * are required');
24 |
25 | var required = function(input) {
26 | return input.length > 0;
27 | };
28 |
29 | var checkIfAuthor = function(input) {
30 | var done = this.async();
31 |
32 | fs.exists(root + '/data/authors/' + input + '.yaml', function (exists) {
33 | if (!exists) {
34 | done('author .yaml file missing for ' + input + '. Please run "npm run new" to create.');
35 | process.exit();
36 | return;
37 | }
38 |
39 | done(true);
40 | });
41 | };
42 |
43 | var questions = [
44 | {
45 | type : 'input',
46 | message : 'Github username? *',
47 | name : 'user',
48 | validate: required && checkIfAuthor
49 | },
50 | {
51 | type : 'input',
52 | message : 'Post Title? *',
53 | name : 'title',
54 | validate: required
55 | }
56 | ];
57 |
58 | inquirer.prompt(questions, function( answers ) {
59 | var yamlString = yaml.safeDump(answers);
60 | var user = answers.user;
61 |
62 | //create posts directory
63 | var postsDir = path.resolve(root + '/posts/' + user);
64 | if (!fs.existsSync(postsDir)) {
65 | console.log('creating ' + postsDir);
66 | fs.mkdirSync(postsDir, 0755);
67 | }
68 |
69 | if (!fs.existsSync(postsDir + '/library')) {
70 | console.log('creating ' + postsDir + '/library');
71 | fs.mkdirSync(postsDir + '/library', 0755);
72 | }
73 |
74 | //copy in the template.jade into the directory
75 | var template = fs.readFileSync(path.resolve(root + '/posts/template.jade'), 'utf8');
76 | var templatePath = path.resolve(root + '/posts/' + user);
77 | template = template.replace("\n_ignore: true", '');
78 | template = template.replace("{{title}}", answers.title);
79 | template = template.replace("../views/layouts/_single", "../../views/layouts/_single");
80 | var filename = answers.title.split(" ").slice(0, 4).join("_") + '.jade';
81 | var filenameAndPath = templatePath + '/' + filename;
82 | fs.writeFile(filenameAndPath, template, function (err) {
83 | if (err) throw err;
84 | shell.exec('git add ' + filenameAndPath);
85 | shell.exec('git commit '+ filenameAndPath +' -m "new post from "' + user);
86 | console.log(filename + ' was created and placed in ' + templatePath);
87 | console.log();
88 | console.log('Next steps:');
89 | console.log('1. write your awesome content');
90 | console.log('2. modify the jade "frontmatter" of your post\'s metadata');
91 | console.log('3. test your post for validity with "npm test"');
92 | console.log('4. submit a pull request to http://github.com/intelandroid/androidhub');
93 | console.log();
94 | console.log('Thanks for contributing!');
95 | });
96 | });
97 |
--------------------------------------------------------------------------------
/scripts/prep_l18n.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # cleanup
4 | rm -rf public/en/posts
5 | rm -rf public/en/*.html
6 |
7 | # Create an /en/ folder in the root
8 | mkdir -p public/en/posts
9 | mkdir -p public/en/android-field-guide
10 |
11 | # clean out all images in posts
12 | rm -rf public/posts/**/library
13 |
14 | # and move the following items into the /en/ folder:
15 | # android-field-guide
16 | # posts (folder)
17 | # index.html
18 | # 404.html
19 | # about.html
20 | # authors.html
21 | # commit.html
22 | # feed.html
23 |
24 | if [[ -f public/old-index.html ]]; then
25 | cp public/old-index.html public/index.html
26 | fi
27 |
28 | cp -R public/*.html public/en
29 | cp -R public/posts/* public/en/posts
30 |
31 | if [[ -d public/android-field-guide ]]; then
32 | cp -R public/android-field-guide/*.html public/en/android-field-guide
33 | fi
34 |
35 | # Something may have gone wrong, as the “public” folder contains another “public” folder, therefore the entire site is included twice.
36 | rm -rf public/public
37 | rm -rf public/en/public
38 |
39 | # Can we move file reviewer_readme.html out of the /en/ folder since it will not be localized? If not, we will ignore it.
40 | rm -f public/en/reviewer_readme.html
41 |
42 | # File redirector.html should not be in the /en/ folder.
43 | rm -f public/en/redirector.html
44 |
45 |
46 | # For links in the HTML files to work for all languages without any changes after translation:
47 | # use root-relative paths for links to assets.
48 | # use relative (not root-relative) paths to link to other HTML files.
49 |
50 | if [ "$(uname)" == "Darwin" ]; then
51 | find -X public/en -name '*.html' | xargs sed -i -e 's/a href=\"\//a href=\"\/en\//g'
52 | find -X public/en -name '*.html-e' | xargs rm -f
53 |
54 | # handle references to full urls
55 | find -X public/en -name '*.html' | xargs sed -i -e 's/https:\/\/androidhub.intel.com\//https:\/\/androidhub.intel.com\/en\//g'
56 | find -X public/en -name '*.html-e' | xargs rm -f
57 | elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
58 | find public/en -name '*.html' | xargs sed -i -e 's/a href=\"\//a href=\"\/en\//g'
59 | find public/en -name '*.html-e' | xargs rm -f
60 |
61 | # handle references to full urls
62 | find public/en -name '*.html' | xargs sed -i -e 's/https:\/\/androidhub.intel.com\//https:\/\/androidhub.intel.com\/en\//g'
63 | find public/en -name '*.html-e' | xargs rm -f
64 | fi
65 |
66 | # replace index with one that redirects to the local version
67 | cp public/index.html public/old-index.html
68 | cp public/redirector.html public/index.html
69 |
70 | echo "waiting for xargs..."
71 | sleep 10
72 | echo "done"
73 |
74 |
75 | # delete original .html files
76 | rm -rf public/posts/**/*.html
77 | rm -f public/authors.html
78 | rm -f public/about.html
79 | rm -f public/commit.html
80 | rm -f public/feed.html
81 | rm -f public/reviewer_readme.html
82 |
--------------------------------------------------------------------------------
/scripts/social-link.js:
--------------------------------------------------------------------------------
1 | module.exports = function(social_target, handle) {
2 | var url;
3 |
4 | switch(social_target) {
5 | case 'twitter':
6 | url = 'https://twitter.com/' + handle
7 | break;
8 | case 'github':
9 | url = 'https://github.com/' + handle
10 | break;
11 | case 'codepen':
12 | url = 'https://codepen.io/' + handle
13 | break;
14 | default:
15 | url = '#'
16 | break;
17 | }
18 |
19 | return url;
20 | }
--------------------------------------------------------------------------------
/scripts/sort-by-last-name.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash')
2 |
3 | module.exports = function(authors) {
4 | return _.sortBy(authors, function(author){
5 | var nameArray = author.displayname.split(' ') // split name into pieces
6 | return nameArray[nameArray.length - 1] // get last name
7 | })
8 | }
--------------------------------------------------------------------------------
/spec/androidHub/AuthorSpec.js:
--------------------------------------------------------------------------------
1 | var _ = require("lodash");
2 | var fs = require("fs");
3 | var yaml = require("js-yaml");
4 | var request = require("request");
5 |
6 | describe("Authors", function() {
7 | var glob = require("glob");
8 | var authors = glob.sync("data/authors/*.yaml");
9 |
10 | if (authors.length < 1) {
11 | throw "no authors found.";
12 | }
13 |
14 | if (_.contains('*', authors[0])) {
15 | throw "no files found in " + authors[0];
16 | }
17 |
18 | for (var i = 0; i < authors.length; i++) {
19 | test_author(authors[i]);
20 | }
21 | });
22 |
23 | function test_author(filename) {
24 | it("filename is a string", function () {
25 | expect(filename).toEqual(jasmine.any(String));
26 | });
27 |
28 | var fileInput = fs.readFileSync(filename, "utf8");
29 |
30 | describe(filename, function () {
31 | var data;
32 |
33 | beforeEach(function () {
34 | data = yaml.safeLoad(fileInput);
35 | });
36 |
37 | describe('yaml data', function () {
38 | it('yaml parses into an object', function() {
39 | // TODO parse into yaml and inspect object for required vars
40 | expect(data).toEqual(jasmine.any(Object));
41 | });
42 |
43 | describe("twitter key", function () {
44 | it('is required', function () {
45 | expect(data.twitter).toEqual(jasmine.any(String));
46 | expect(data.twitter).not.toBeEmptyString();
47 | });
48 |
49 | // according to https://support.twitter.com/articles/14609
50 | it('is not too long (15 characters)', function () {
51 | expect(data.twitter.length).toBeLessThan(16);
52 | });
53 | });
54 | });
55 |
56 | });
57 | }
58 |
--------------------------------------------------------------------------------
/spec/helpers/jasmine_examples/SpecHelper.js:
--------------------------------------------------------------------------------
1 | var moment = require('moment');
2 |
3 | beforeEach(function () {
4 | jasmine.addMatchers({
5 | // TODO add custom matchers here
6 | toBeValidDate: function() {
7 | return {
8 | compare: function(date) {
9 | var result = { pass: moment(new Date(date)).isValid() };
10 | if (!result.pass) {
11 | result.message = "Expected date "+date+" to be valid";
12 | } else {
13 | result.message = "Expected date "+date+" to NOT be valid";
14 | }
15 |
16 | return result;
17 | }
18 | };
19 | }
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/spec/support/jasmine.json:
--------------------------------------------------------------------------------
1 | {
2 | "spec_dir": "spec",
3 | "spec_files": [
4 | "**/*[sS]pec.js"
5 | ],
6 | "helpers": [
7 | "helpers/**/*.js"
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/views/404.jade:
--------------------------------------------------------------------------------
1 | doctype html
2 | html.no-js(lang='en')
3 | head
4 | meta(charset='utf-8')
5 | title Page Not Found :(
6 | meta(name='viewport', content='width=device-width, initial-scale=1.0')
7 | style.
8 | html {
9 | font-size: 1.25rem;
10 | line-height: 1.4;
11 | color: #737373;
12 | background: #f0f0f0;
13 | text-align: ;
14 | -webkit-text-size-adjust: 100%;
15 | -ms-text-size-adjust: 100%;
16 | }
17 |
18 | html, body {
19 | height:100%;
20 | margin:0;
21 | }
22 |
23 | html,
24 | input {
25 | font-family: sans-serif;
26 | }
27 |
28 | body {
29 | display:flex;
30 | align-items:center;
31 | }
32 |
33 | h1 {
34 | margin: 0 10px;
35 | font-size: 50px;
36 | text-align: center;
37 | }
38 |
39 | h1 span {
40 | color: #bbb;
41 | }
42 |
43 | h3 {
44 | margin: 1.5em 0 0.5em;
45 | }
46 |
47 | p {
48 | margin: 1em 0;
49 | }
50 |
51 | ul {
52 | padding: 0 0 0 40px;
53 | margin: 1em 0;
54 | }
55 |
56 | .container {
57 | max-width: 380px;
58 | width: 380px;
59 | margin: auto;
60 | background:white;
61 | padding:2rem;
62 | box-shadow: 0 0 1rem 0 rgba(0,0,0,0.15);
63 | border-radius:1rem;
64 | }
65 |
66 | /* google search */
67 |
68 | #goog-fixurl ul {
69 | list-style: none;
70 | padding: 0;
71 | margin: 0;
72 | }
73 |
74 | #goog-fixurl form {
75 | margin: 0;
76 | }
77 |
78 | #goog-wm-qt,
79 | #goog-wm-sb {
80 | border: 1px solid #bbb;
81 | font-size: 16px;
82 | line-height: normal;
83 | vertical-align: top;
84 | color: #444;
85 | border-radius: 2px;
86 | }
87 |
88 | #goog-wm-qt {
89 | width: 220px;
90 | height: 20px;
91 | padding: 5px;
92 | margin: 5px 10px 0 0;
93 | box-shadow: inset 0 1px 1px #ccc;
94 | }
95 |
96 | #goog-wm-sb {
97 | display: inline-block;
98 | height: 32px;
99 | padding: 0 10px;
100 | margin: 5px 0 0;
101 | white-space: nowrap;
102 | cursor: pointer;
103 | background-color: #f5f5f5;
104 | background-image: -webkit-linear-gradient(rgba(255,255,255,0), #f1f1f1);
105 | background-image: -moz-linear-gradient(rgba(255,255,255,0), #f1f1f1);
106 | background-image: -ms-linear-gradient(rgba(255,255,255,0), #f1f1f1);
107 | background-image: -o-linear-gradient(rgba(255,255,255,0), #f1f1f1);
108 | -webkit-appearance: none;
109 | -moz-appearance: none;
110 | appearance: none;
111 | *overflow: visible;
112 | *display: inline;
113 | *zoom: 1;
114 | }
115 |
116 | #goog-wm-sb:hover,
117 | #goog-wm-sb:focus {
118 | border-color: #aaa;
119 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
120 | background-color: #f8f8f8;
121 | }
122 |
123 | #goog-wm-qt:hover,
124 | #goog-wm-qt:focus {
125 | border-color: #105cb6;
126 | outline: 0;
127 | color: #222;
128 | }
129 |
130 | input::-moz-focus-inner {
131 | padding: 0;
132 | border: 0;
133 | }
134 | body
135 | .container
136 | h1 Not found
137 | span :(
138 | p Sorry, but the page you were trying to view does not exist.
139 | p: b It looks like this was the result of either:
140 | ul
141 | li a mistyped address
142 | li an out-of-date link
143 | //- script.
144 | //- var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;
145 | //- script(src='//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js')
146 |
--------------------------------------------------------------------------------
/views/about.jade:
--------------------------------------------------------------------------------
1 | extends layouts/_general
2 | include mixins/_author
3 | include mixins/_nav
4 |
5 | block nav
6 | +nav('about')
7 |
8 | block content
9 | .section-title: section
10 | h3.marginless.animate-prep About
11 |
12 | main: section: .card
13 | .grid.grid--bleed.grid--justify-left: .grid__col-sm-10
14 | h3.marginless For Developers, By Developers
15 | p At Intel, we believe in inspiring innovation, whether in hardware, in tools, or in software.
16 | p That’s why we’ve created this site: to bring together the developers who are redefining what’s possible with Android and—in the process—helping shape the future of this amazing technology; to create a community where developers can talk to, share with, and learn from other like-minded developers, whether you’re getting ready to develop your first app or are an experienced dev with specific questions about the Android development process.
17 | p With content created and curated by Android developers, for Android developers, we hope this site will inspire you to help create the next big Android innovation—with a little help from your friends.
18 |
19 | .spacer.xs
20 |
21 | h3 Founding Contributors
22 | ul.grid.reverse-margin-md
23 | for author in data.authors
24 | if author.founder
25 | +author(author)
26 |
27 | .text-right: a.btn.blue.clear(href=data.paths.authors)
28 | | See all our authors
29 | include includes/svg/_arrow
30 |
31 | .spacer.lg.hidden-xs
32 |
33 | block trackers
34 | include includes/_intel_tracking
35 | include includes/_facebook_tracking
36 |
--------------------------------------------------------------------------------
/views/authors.jade:
--------------------------------------------------------------------------------
1 | extends layouts/_general
2 | include mixins/_author
3 | include mixins/_nav
4 |
5 | block nav
6 | +nav('authors')
7 |
8 | block content
9 | .section-title: section
10 | h3.marginless.animate-prep Authors
11 |
12 | main: section: .card
13 | ul.grid.reverse-margin-md
14 | for author in helpers.sortByLastName(data.authors)
15 | if author.nickname != 'admin'
16 | +author(author)
17 |
18 | .spacer.lg.hidden-xs
19 |
20 | block trackers
21 | include includes/_intel_tracking
22 | include includes/_facebook_tracking
23 |
--------------------------------------------------------------------------------
/views/commit.jade:
--------------------------------------------------------------------------------
1 | extends layouts/_general
2 | include mixins/_nav
3 |
4 | block nav
5 | +nav('commit')
6 |
7 | block content
8 | .section-title: section
9 | h3.marginless.animate-prep Commit
10 | main: section
11 | .card
12 | .grid.grid--bleed.grid--justify-left: .grid__col-sm-10
13 | h3.marginless Join the Android Hub
14 | p We believe our Android developers will shape the future of this technology. Get involved by filling out the form below to connect with the developer community and share your ideas.
15 |
16 | .spacer.xs
17 |
18 | form#nl-form.nl-form(data-error-title="Doh!", data-error-text="You missed a spot.", data-success-title="Nice!", data-success-text="Successfully sent email. We look forward to working with you!")
19 | | My name is
20 | input#author-name(required, type='text', value='', maxlength='75', placeholder='${name}', data-subline='Tell us your name')
21 | | and I have lots of great information I would like to contribute to The Android Hub. You can see my work at
22 | input#author-site(required, type='url', value='', maxlength='100', placeholder='${site}', data-subline='Example: https://github.com/your_handle').
23 | | . My expertise is in
24 | select#author-expertise(required)
25 | option(value, default, selected) ${expertise}
26 | option(value='native app development') native app development
27 | option(value='hybrid app development') hybrid app development
28 | option(value='web apps') web apps
29 | option(value='app design') app design
30 | | . I can be reached at
31 | input#author-email(required, type='email', value='', maxlength='75', placeholder='${email}', data-subline='For example: foo@bar.com')
32 | | . I also wanted to mention this:
33 | br
34 | textarea#author-message
35 |
36 | .nl-submit-wrap.text-right
37 | button.nl-submit.btn.blue.bordered(type='submit') Submit
38 | .nl-overlay
39 |
40 | .grid.grid--bleed
41 | .grid__col-2: div
42 | img.grid__cell-img.lazyload.lazyanimate.animate-prep(data-src='/img/megacat.jpg')
43 | .grid__col-6.grid--align-start
44 | h3 GitHub* fan?
45 | p This entire site, each article, and more are all open sourced and available to read/write on GitHub*.
46 | a.btn.blue.small.bordered(href=data.paths.github, target='_blank') Fork us on GitHub*
47 |
48 | .spacer.md.hidden-xs
49 |
50 | block trackers
51 | if env == 'prod'
52 | +tracking-pixel('ntjol')
53 | include includes/_facebook_tracking
54 |
55 | include includes/_intel_tracking
56 |
--------------------------------------------------------------------------------
/views/feed.jade:
--------------------------------------------------------------------------------
1 | extends layouts/_general
2 | include mixins/_feed-item
3 | include mixins/_author
4 | include mixins/_nav
5 |
6 | block nav
7 | +nav('feed')
8 |
9 | block content
10 | .section-title.feed-manipulators: section
11 | .grid.grid--align-center.grid--bleed
12 | .grid__col-xs-6.grid__col-sm-8.grid--direction-row
13 | h3.marginless.animate-prep Feed /
14 | select#feed-filter
15 | option(selected, value='all') All
16 | for cat in helpers.getCategories(site)
17 | option(value=cat)= _.capitalize(cat)
18 |
19 | .grid__col-xs-6.grid__col-sm-4.hidden-xs.grid--justify-end: .search
20 | include includes/svg/_search
21 | input#search(type='search', placeholder='Search')
22 |
23 | //- Articles
24 | main: section: .card: ul#feed-grid.grid.reverse-margin-md
25 | - var mergedPosts = helpers.getMergedPosts(site, records)
26 | - var postsSortedByDate = _.sortBy(mergedPosts, function(post){ return new Date(post.git.date) }).reverse()
27 |
28 | for post in postsSortedByDate
29 | +feed-item(post)
30 |
31 | block trackers
32 | if env == 'prod'
33 | +tracking-pixel('nth42')
34 | include includes/_facebook_tracking
35 |
36 | include includes/_intel_tracking
37 |
--------------------------------------------------------------------------------
/views/includes/_facebook_tracking.jade:
--------------------------------------------------------------------------------
1 | script.
2 | !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
3 | n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
4 | n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
5 | t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
6 | document,'script','//connect.facebook.net/en_US/fbevents.js');
7 | fbq('init', '1450826268539115');
8 | fbq('track', "PageView");
9 | noscript
10 | img(height='1', width='1', style='display:none', src='https://www.facebook.com/tr?id=1450826268539115&ev=PageView&noscript=1')
11 |
--------------------------------------------------------------------------------
/views/includes/_font-strategy.jade:
--------------------------------------------------------------------------------
1 | //- font loading strategy here, block page rendering and check if the font is in cache
2 | //- if it is, then add the class to the head. this will prevent FOUC, except on the first page load
3 | script
4 | :coffee-script
5 | if !!localStorage['fonts-loaded'] then document.documentElement.className += ' fonts-loaded'
6 | ua = navigator.userAgent
7 | if ua.indexOf('Windows') > -1
8 | if ua.indexOf('Chrome') > -1 then document.documentElement.className += ' chrome-on-windows'
9 | if ua.indexOf('MSIE 10') > -1 then document.documentElement.className += ' windows-ie-10'
10 | if ua.indexOf('rv:11') > -1 then document.documentElement.className += ' windows-ie-11'
--------------------------------------------------------------------------------
/views/includes/_footer-sitemap.jade:
--------------------------------------------------------------------------------
1 | section.site-map: .grid.grid--bleed.grid--justify-space-between
2 | .grid__col-xs-6.grid--direction-column
3 | p.marginless.push-bottom-sm
4 | a.btn.blue.small.bordered(href=data.paths.commit) Commit something to the Hub
5 | .grid.grid--bleed
6 | .link-nav-set.grid__col-xs-12.grid__col-sm-10.grid--align-center.grid--justify-space-between.grid--direction-row
7 | a(href=data.paths.feed) Feed
8 | a(href=data.paths.field_guide) Field Guide
9 | a(href=data.paths.authors) Authors
10 | a(href=data.paths.about) About
11 | a(href=data.paths.commit) Commit
12 |
13 | .grid__col-xs-4.grid--justify-end: .grid.grid--bleed.grid--justify-end.grid--align-center
14 | .grid__col-4
15 | img.grid--align-self-end.contain.intel-logo.lazyload(data-src='/img/intel_logo.png', height='50px')
16 | .link-nav-set.grid__col-6.grid--direction-column.push-left
17 | a(href=data.paths.terms) Terms of use
18 | a(href=data.paths.privacy) Privacy
19 | a(href=data.paths.cookies) Cookies
20 | a(href=data.paths.trademarks) *Trademarks
21 |
--------------------------------------------------------------------------------
/views/includes/_footer-strip.jade:
--------------------------------------------------------------------------------
1 | .dark-grey-bg: section
2 | h2.marginless.text-center Share the Hub with your friends and followers!
3 |
4 | .grid.grid--justify-space-around
5 | .grid__col-4.grid__col-md-3
6 | a.share.tweet.inline-social(share-target='twitter')
7 | span.social-icon-wrap
8 | include svg/_twitter
9 | span.social-text Post to Twitter
10 |
11 | .grid__col-4.grid__col-md-3
12 | a.share.post.inline-social(share-target='facebook')
13 | span.social-icon-wrap
14 | include svg/_facebook
15 | span.social-text Post to Facebook
16 |
17 | .grid__col-4.grid__col-md-3
18 | a.share.plus.inline-social(share-target='google')
19 | span.social-icon-wrap
20 | include svg/_googleplus
21 | span.social-text Post to Google+
22 |
--------------------------------------------------------------------------------
/views/includes/_footer.jade:
--------------------------------------------------------------------------------
1 | footer
2 | include _footer-strip
3 | include _footer-sitemap
--------------------------------------------------------------------------------
/views/includes/_intel_tracking.jade:
--------------------------------------------------------------------------------
1 | script.
2 | var wapLocalCode = 'us-en'; //dynamically set per localized site
3 |
4 | //load analytics
5 | (function() {
6 | var host = (window.document.location.protocol == 'http:') ? "http://www.intel.com" : "https://www-ssl.intel.com";
7 | var url = host+"/content/dam/www/global/wap/wap-android-hub.js"; //wap file url
8 | var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = url;
9 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
10 | })();
11 |
--------------------------------------------------------------------------------
/views/includes/_site-meta.jade:
--------------------------------------------------------------------------------
1 | meta(charset='utf8')
2 | meta(http-equiv='X-UA-Compatible', content='IE=edge, chrome=1')
3 | meta(name='description', content=data.meta.opengraph.description)
4 | //- meta(name='author', content=data.meta.opengraph.author)
5 | meta(name="viewport" content="width=device-width, initial-scale=1")
6 | link(rel='icon', type='image/png', href='/img/favicon.ico')
7 | link(rel='icon', type='image/svg+xml', href='/img/droid.svg')
8 | link(rel='mask-icon', sizes='any', href='/img/droid.svg', color='white')
--------------------------------------------------------------------------------
/views/includes/_social-icons.jade:
--------------------------------------------------------------------------------
1 | a.social-icon.animate-prep(href=data.social.twitter, target='_blank'): include svg/_twitter
2 | a.social-icon.animate-prep(href=data.social.facebook, target='_blank'): include svg/_facebook
3 | a.social-icon.animate-prep(href=data.social.google_plus, target='_blank'): include svg/_googleplus
4 | a.social-icon.animate-prep(href=data.social.instagram, target='_blank'): include svg/_instagram
5 | a.social-icon.animate-prep(href=data.social.youtube, target='_blank'): include svg/_youtube
--------------------------------------------------------------------------------
/views/includes/svg/_arrow.jade:
--------------------------------------------------------------------------------
1 | svg.icon-arrow(width='33', height='25', viewbox='0 0 33 25', xmlns='http://www.w3.org/2000/svg')
2 | g(stroke-linecap='square', stroke='#FFF', stroke-width='4', fill='none', fill-rule='evenodd')
3 | path(d='M2.937 12.534h26.15M21.165 3.534l8.94 8.984-9.18 9.225')
4 |
--------------------------------------------------------------------------------
/views/includes/svg/_codepen.jade:
--------------------------------------------------------------------------------
1 | svg.icon-codepen(width='21', height='21', viewbox='0 -2 25 27', xmlns='http://www.w3.org/2000/svg')
2 | path(d='M24.17 7.845L12.795.262c-.273-.182-.628-.182-.9 0L.518 7.845c-.227.15-.363.404-.363.676v7.584c0 .272.136.526.362.676l11.374 7.583c.136.09.293.137.45.137.158 0 .315-.046.45-.137L24.17 16.78c.226-.15.362-.404.362-.676V8.52c0-.27-.136-.525-.362-.675zm-11.825 7.283l-4.223-2.816 4.223-2.815 4.222 2.816-4.222 2.815zm.812-7.042v-5.63l9.098 6.065-4.223 2.816-4.875-3.25zm-1.625 0l-4.875 3.25L2.434 8.52l9.098-6.064v5.63zm-6.34 4.226l-3.41 2.274V10.04l3.41 2.273zm1.465.977l4.875 3.25v5.63l-9.098-6.066 4.223-2.815zm6.5 3.25l4.875-3.25 4.223 2.814-9.098 6.065v-5.63zm6.34-4.227l3.41-2.274v4.546l-3.41-2.274z', fill='#FFF')
3 |
--------------------------------------------------------------------------------
/views/includes/svg/_commit.jade:
--------------------------------------------------------------------------------
1 | svg.icon-commit(width='18', height='18', viewbox='0 0 18 18', xmlns='http://www.w3.org/2000/svg')
2 | g(fill='none', fill-rule='evenodd')
3 | path(d='M3.803 4.12H0v2.855h3.803c.604 2.372 2.676 4.12 5.14 4.12 2.463 0 4.536-1.748 5.14-4.12H18V4.12h-3.917C13.48 1.747 11.406 0 8.943 0 6.48 0 4.407 1.748 3.803 4.12zm5.14 4.503c1.63 0 2.95-1.377 2.95-3.076 0-1.7-1.32-3.076-2.95-3.076-1.63 0-2.95 1.38-2.95 3.078 0 1.7 1.32 3.076 2.95 3.076z', fill='hsl(214, 4%, 34%)')
4 |
--------------------------------------------------------------------------------
/views/includes/svg/_droid.jade:
--------------------------------------------------------------------------------
1 | svg.droid-hero(width='350', height='150', viewbox='0 75 350 200', xmlns='http://www.w3.org/2000/svg')
2 | path(d='M339.43 207.45l-39.63 5.284c-2.51 8.3-5.815 16.25-9.844 23.76l24.288 31.764c3.31 4.33 2.904 10.44-.95 14.29l-30.745 30.746c-2.11 2.11-4.893 3.186-7.69 3.186-2.317 0-4.643-.736-6.602-2.236l-31.763-24.288c-7.51 4.026-15.46 7.335-23.76 9.843l-5.284 39.63c-.722 5.402-5.326 9.436-10.776 9.436h-43.482c-5.45 0-10.057-4.034-10.775-9.435l-5.284-39.63c-8.3-2.51-16.252-5.815-23.762-9.844L81.61 314.244c-1.96 1.5-4.283 2.236-6.603 2.236-2.797 0-5.58-1.075-7.687-3.186L36.572 282.55c-3.854-3.852-4.26-9.963-.95-14.292l24.29-31.763c-4.027-7.51-7.336-15.46-9.844-23.76l-39.633-5.286C5.035 206.73 1 202.122 1 196.673v-43.482c0-5.45 4.035-10.057 9.435-10.776l39.633-5.285c2.508-8.297 5.817-16.25 9.843-23.76L35.623 81.61c-3.31-4.327-2.904-10.436.947-14.29l30.748-30.75c2.107-2.11 4.89-3.184 7.687-3.184 2.32 0 4.644.74 6.603 2.235l31.765 24.29c7.508-4.028 15.46-7.334 23.76-9.842l5.284-39.633c.718-5.4 5.325-9.435 10.775-9.435h43.482c5.45 0 10.054 4.035 10.777 9.435l5.284 39.633c8.3 2.508 16.252 5.817 23.76 9.843l31.764-24.288c1.96-1.5 4.285-2.235 6.6-2.235 2.8 0 5.583 1.074 7.69 3.182l30.75 30.748c3.853 3.85 4.258 9.962.95 14.29l-24.29 31.765c4.027 7.508 7.333 15.46 9.84 23.758l39.633 5.286c5.402.72 9.436 5.326 9.436 10.776 0 0-4.034 53.54-9.435 54.257z', stroke='#E3E3E3', stroke-width='2', fill='#FFF')
3 | path(d='M174.46 262.96c-48.878 0-88.5-39.623-88.5-88.5 0-48.878 39.622-88.5 88.5-88.5 48.877 0 88.5 39.622 88.5 88.5 0 48.877-39.623 88.5-88.5 88.5z', stroke='#F2F2F2', stroke-width='2', stroke-linecap='round', stroke-linejoin='round', fill='#F2F2F2')
4 | g(fill='#A3C629')
5 | path(d='M192.76 109.573l7.308-10.61c.434-.63.325-1.46-.24-1.85-.57-.39-1.38-.198-1.812.434l-7.594 11.022c-5.004-1.972-10.563-3.07-16.42-3.07-5.857 0-11.417 1.097-16.42 3.07l-7.595-11.024c-.435-.63-1.246-.824-1.813-.434-.567.39-.674 1.218-.24 1.85l7.31 10.61c-11.624 5.408-19.773 15.68-20.812 27.673h79.136c-1.034-11.992-9.185-22.265-20.808-27.672zm-35.29 16.725c-2.418 0-4.38-1.96-4.38-4.378 0-2.42 1.96-4.38 4.38-4.38 2.417 0 4.376 1.96 4.376 4.38 0 2.418-1.96 4.378-4.377 4.378zm33.06 0c-2.417 0-4.376-1.96-4.376-4.378 0-2.42 1.96-4.38 4.377-4.38 2.42 0 4.38 1.96 4.38 4.38 0 2.418-1.96 4.378-4.38 4.378zM129.35 187.253c0 4.875-3.95 8.828-8.827 8.828-4.875 0-8.83-3.952-8.83-8.827v-35.708c0-4.874 3.955-8.828 8.83-8.828 4.876 0 8.828 3.954 8.828 8.828v35.708M134.43 207.48c0 3.83 3.105 6.937 6.937 6.937h8.203v19.844c0 4.878 3.954 8.83 8.828 8.83 4.877 0 8.83-3.952 8.83-8.83v-19.843h13.545v19.844c0 4.878 3.952 8.83 8.83 8.83 4.875 0 8.827-3.952 8.827-8.83v-19.843h8.203c3.832 0 6.938-3.103 6.938-6.936v-64.49h-79.14v64.49zM218.65 187.253c0 4.875 3.95 8.828 8.827 8.828 4.875 0 8.83-3.952 8.83-8.827v-35.708c0-4.874-3.955-8.828-8.83-8.828-4.876 0-8.828 3.954-8.828 8.828v35.708')
6 |
--------------------------------------------------------------------------------
/views/includes/svg/_facebook.jade:
--------------------------------------------------------------------------------
1 | svg.icon-facebook(width='25', height='25', viewbox='0 0 25 25', xmlns='http://www.w3.org/2000/svg')
2 | ellipse.animate-fill(fill='#222', cx='12.002', cy='12.054', rx='12.002', ry='12.054')
3 | path.animate-fill(d='M10.067 18.374h2.472v-6.26h1.723l.184-2.094H12.54V8.826c0-.494.097-.69.57-.69h1.337V5.962h-1.712c-1.84 0-2.668.82-2.668 2.387v1.67H8.782v2.12h1.285v6.234', fill='#FFF')
4 |
--------------------------------------------------------------------------------
/views/includes/svg/_github.jade:
--------------------------------------------------------------------------------
1 | svg.icon-github(width='20', height='20', viewbox='0 0 22 22', xmlns='http://www.w3.org/2000/svg')
2 | path(d='M11 .272c-6.074 0-11 4.924-11 11 0 4.86 3.152 8.983 7.522 10.437.55.1.752-.24.752-.53 0-.262-.01-1.13-.015-2.048-3.06.666-3.707-1.298-3.707-1.298-.5-1.27-1.22-1.61-1.22-1.61-1-.682.074-.668.074-.668 1.105.078 1.686 1.134 1.686 1.134.98 1.68 2.574 1.195 3.2.914.1-.71.385-1.196.7-1.47-2.444-.28-5.012-1.222-5.012-5.437 0-1.2.43-2.182 1.135-2.953-.115-.277-.49-1.395.106-2.91 0 0 .925-.296 3.027 1.127.877-.243 1.818-.365 2.753-.37.935.005 1.876.127 2.756.37 2.1-1.422 3.022-1.127 3.022-1.127.598 1.516.222 2.634.108 2.91.705.772 1.132 1.753 1.132 2.954 0 4.225-2.574 5.155-5.023 5.427.395.342.746 1.01.746 2.037 0 1.473-.012 2.658-.012 3.02 0 .293.198.636.756.528C18.852 20.252 22 16.13 22 11.272c0-6.076-4.925-11-11-11z', fill='#FFF', fill-rule='evenodd')
3 |
--------------------------------------------------------------------------------
/views/includes/svg/_googleplus.jade:
--------------------------------------------------------------------------------
1 | svg.icon-googleplus(width='25', height='25', viewbox='0 0 25 25', xmlns='http://www.w3.org/2000/svg')
2 | ellipse.animate-fill(fill='#222', cx='12.002', cy='12.054', rx='12.002', ry='12.054')
3 | path.animate-fill(d='M10.396 11.35v1.56h2.584c-.104.672-.78 1.967-2.584 1.967-1.555 0-2.825-1.29-2.825-2.877 0-1.588 1.27-2.877 2.826-2.877.886 0 1.478.377 1.816.703l1.237-1.19c-.795-.743-1.823-1.192-3.054-1.192C7.876 7.444 5.84 9.48 5.84 12c0 2.52 2.037 4.556 4.556 4.556 2.63 0 4.374-1.848 4.374-4.452 0-.3-.032-.527-.07-.755h-4.304zM20.16 11.35h-1.302v-1.303h-1.302v1.302h-1.3v1.3h1.3v1.303h1.302V12.65h1.302', fill='#fff')
4 |
5 |
--------------------------------------------------------------------------------
/views/includes/svg/_instagram.jade:
--------------------------------------------------------------------------------
1 | svg.icon-instagram(width='25', height='25', viewbox='0 0 25 25', xmlns='http://www.w3.org/2000/svg')
2 | ellipse.animate-fill(fill='#222', cx='12.002', cy='12.054', rx='12.002', ry='12.054')
3 | path.animate-fill(d='M12.266 8.77c.827 0 1.575.34 2.114.887h3.692V8.15c0-1.266-1.027-2.293-2.294-2.293H9.51v2.89h-.47v-2.89h-.325v2.89h-.47v-2.83c-.114.027-.225.062-.33.105v2.726h-.472v-2.47c-.586.416-.968 1.1-.968 1.872v1.507h3.677c.538-.547 1.286-.886 2.114-.886zm2.782-1.586c0-.204.164-.368.368-.368h1.24c.203 0 .368.164.368.368V8.45c0 .204-.165.37-.368.37h-1.24c-.204 0-.368-.166-.368-.37V7.185z', fill='#FFF')
4 | path.animate-fill(d='M13.77 10.02c-.167-.147-.356-.27-.562-.363-.287-.13-.606-.204-.942-.204-.336 0-.655.073-.944.204-.205.093-.394.216-.562.363-.478.42-.78 1.034-.78 1.72 0 1.26 1.025 2.285 2.286 2.285 1.26 0 2.286-1.026 2.286-2.286 0-.686-.303-1.3-.78-1.72zm-1.497 3.408c-.933 0-1.69-.757-1.69-1.69 0-.933.757-1.69 1.69-1.69.933 0 1.69.757 1.69 1.69 0 .933-.757 1.69-1.69 1.69z', fill='#FFF')
5 | path.animate-fill(d='M15.778 17.514c1.267 0 2.294-1.027 2.294-2.293v-5.2h-3.388c.346.485.55 1.078.55 1.72 0 1.638-1.33 2.966-2.968 2.966-1.64 0-2.968-1.328-2.968-2.967 0-.642.204-1.235.55-1.72H6.474v5.2c0 1.267 1.027 2.294 2.293 2.294h7.01z', fill='#FFF')
6 |
--------------------------------------------------------------------------------
/views/includes/svg/_link.jade:
--------------------------------------------------------------------------------
1 | svg.icon-link(width='23', height='21', viewbox='0 0 23 21', xmlns='http://www.w3.org/2000/svg')
2 | g(fill='#FFF', fill-rule='evenodd')
3 | path(d='M9.692 12.965c-.3 0-.597-.105-.825-.314-2.137-1.96-2.137-5.148 0-7.108l4.31-3.955C14.214.637 15.59.115 17.053.115c1.464 0 2.84.523 3.874 1.472 2.137 1.96 2.137 5.15 0 7.11l-1.97 1.807c-.456.418-1.196.418-1.652 0-.456-.42-.456-1.097 0-1.515l1.97-1.81c1.227-1.124 1.227-2.953 0-4.078-.593-.545-1.382-.845-2.222-.845-.84 0-1.63.3-2.223.845l-4.312 3.955c-1.226 1.125-1.226 2.954 0 4.08.456.417.456 1.096 0 1.514-.228.21-.527.315-.826.315z')
4 | path(d='M5.555 20.715c-1.463 0-2.84-.523-3.874-1.472-2.135-1.96-2.135-5.15 0-7.11l1.972-1.806c.456-.42 1.195-.42 1.65 0 .457.418.457 1.096 0 1.514l-1.97 1.81c-1.226 1.124-1.226 2.954 0 4.078.594.545 1.383.845 2.223.845.84 0 1.63-.3 2.223-.845l4.312-3.955c1.225-1.125 1.225-2.954 0-4.08-.456-.417-.456-1.095 0-1.514.456-.42 1.195-.42 1.65 0 2.137 1.96 2.137 5.148 0 7.108l-4.31 3.955c-1.035.95-2.41 1.472-3.875 1.472z')
5 |
--------------------------------------------------------------------------------
/views/includes/svg/_search.jade:
--------------------------------------------------------------------------------
1 | svg.icon-search(viewbox='0 0 512 512', xmlns='http://www.w3.org/2000/svg')
2 | path(d='M496.131 435.698l-121.276-103.147c-12.537-11.283-25.945-16.463-36.776-15.963 28.628-33.534 45.921-77.039 45.921-124.588 0-106.039-85.961-192-192-192s-192 85.961-192 192c0 106.039 85.961 192 192 192 47.549 0 91.054-17.293 124.588-45.922-0.5 10.831 4.68 24.239 15.963 36.776l103.147 121.276c17.661 19.623 46.511 21.277 64.11 3.678s15.946-46.449-3.677-64.11zM192 320c-70.692 0-128-57.308-128-128s57.308-128 128-128 128 57.308 128 128-57.307 128-128 128z')
3 |
--------------------------------------------------------------------------------
/views/includes/svg/_twitter-bird.jade:
--------------------------------------------------------------------------------
1 | svg.icon-twitter-bird(width='23', height='19', viewbox='0 0 23 19', xmlns='http://www.w3.org/2000/svg')
2 | path(d='M.157 16.612c2.022 1.302 4.423 2.062 7.003 2.062 8.48 0 13.273-7.194 12.985-13.648.892-.646 1.666-1.454 2.278-2.375-.82.366-1.7.613-2.623.723.943-.567 1.667-1.466 2.008-2.538-.882.526-1.86.91-2.9 1.114-.833-.893-2.02-1.45-3.335-1.45-2.948 0-5.116 2.763-4.45 5.633-3.796-.19-7.163-2.018-9.415-4.793C.51 3.402 1.086 6.1 3.12 7.465c-.748-.024-1.452-.23-2.068-.574-.05 2.127 1.466 4.114 3.663 4.558-.642.176-1.346.216-2.062.078.582 1.823 2.27 3.15 4.267 3.187C5 16.223 2.58 16.9.157 16.613', fill='#FFF')
3 |
--------------------------------------------------------------------------------
/views/includes/svg/_twitter.jade:
--------------------------------------------------------------------------------
1 | svg.icon-twitter(width='25', height='25', viewbox='0 0 25 25', xmlns='http://www.w3.org/2000/svg')
2 | ellipse.animate-fill(fill='#222', cx='12.002', cy='12.054', rx='12.002', ry='12.054')
3 | path.animate-fill(d='M6.356 15.614c1.01.65 2.21 1.03 3.5 1.03 4.238 0 6.633-3.595 6.49-6.82.445-.323.832-.727 1.138-1.187-.41.183-.85.306-1.312.36.472-.283.834-.732 1.004-1.267-.44.262-.93.453-1.45.556-.416-.446-1.01-.724-1.666-.724-1.473 0-2.557 1.38-2.224 2.815-1.897-.095-3.58-1.008-4.705-2.395-.598 1.03-.31 2.38.707 3.06-.374-.01-.726-.114-1.034-.286-.025 1.062.733 2.056 1.83 2.277-.32.088-.672.108-1.03.04.29.91 1.134 1.573 2.133 1.592-.96.756-2.17 1.093-3.38.95', fill='#FFF')
4 |
--------------------------------------------------------------------------------
/views/includes/svg/_youtube.jade:
--------------------------------------------------------------------------------
1 | svg.icon-youtube(width='25', height='25', viewbox='0 0 25 25', xmlns='http://www.w3.org/2000/svg')
2 | ellipse.animate-fill(fill='#222', cx='12.002', cy='12.054', rx='12.002', ry='12.054')
3 | path.animate-fill(d='M15.734,7.35 L8.21,7.35 C6.97,7.35 5.953,8.366 5.953,9.607 L5.953,14.121 C5.953,15.364 6.969,16.381 8.21,16.381 L15.734,16.381 C16.976,16.381 17.991,15.364 17.991,14.121 L17.991,9.608 C17.991,8.368 16.977,7.351 15.735,7.351 L15.734,7.35 Z M10.467,14.874 L10.467,8.854 L14.229,11.864 L10.466,14.874 L10.467,14.874 Z', fill='#FFF')
4 |
--------------------------------------------------------------------------------
/views/index.jade:
--------------------------------------------------------------------------------
1 | extends layouts/_general
2 |
3 | block nav
4 | +nav()
5 |
6 | block content
7 | .intro: section: .grid.grid--justify-center
8 | include includes/svg/_droid
9 | .text-overlay
10 | include includes/svg/_droid-hub
11 | h5.fix-reflex-type.marginless
12 | each val in "Android tips, tuts and tricks from one developer to another".split('')
13 | if val == ' '
14 | span.nbr
15 | else
16 | span.nbr= Math.random() > 0.5 ? 0 : 1
17 |
18 | - var mergedPosts = helpers.getMergedPosts(site, records)
19 | - var postsSortedByDate = _.sortBy(mergedPosts, function(post){ return new Date(post.git.date) }).reverse()
20 | //- - var feature = _.filter(mergedPosts, 'featured')[0]
21 | - var feature = postsSortedByDate[0]
22 | - var author = helpers.getAuthor(feature, data)
23 | .hero
24 | img.heroimage.cover.animate-prep(src=helpers.getHeroImage(feature))
25 | section
26 | .commit.hidden-sm: include includes/svg/_commit
27 | h4.marginless
28 | a.light(href='https://github.com/intel-android/androidhub/commit/#{feature.git.commit}', target='_blank', title=feature.git.commit)
29 | | Latest Commit
30 | //- small= feature.git.commit.substr(0,7)
31 | a.light(href=feature._url)
32 | h1.hero-title.animate-prep= feature.title
33 | .author-nameplate.animate-prep
34 | img.avatar.circle.cover.lazyload(src=helpers.getAuthorImage(author))
35 | h4.marginless.animate-prep by #{author.displayname}
36 | a.light.animate-prep(href=helpers.socialLink('twitter', author.twitter), target='_blank')
37 | small @#{author.twitter}
38 |
39 | .recent: section
40 | .recent-commit.hidden-sm: include includes/svg/_commit
41 | h4.recent-title
42 | a.dark(href='https://github.com/intel-android/androidhub/commits/master', target='_blank', title='See commits to the master branch')
43 | | Recent Commits
44 | ul.grid.reverse-margin-md
45 | - var count = 0
46 | for post in postsSortedByDate
47 | if count < 4 && !post.featured && post.git.commit != feature.git.commit
48 | +feed-home-item(post)
49 | - count++
50 |
51 | .testimonial.lazyload(data-bg='/img/fractal-blue.png')
52 | section: .grid.grid--justify-center: .grid__col-xs-12.grid__col-sm-7.grid--direction-column.text-left
53 | h2 Art is subjective. You like it or you don't like it. But design is the science of art. It's art with purpose. Design is about intent.
54 | a.btn.clear(href=data.paths.field_guide)
55 | | Learn more in our Developer Field Guide
56 | include includes/svg/_arrow
57 |
58 | block trackers
59 | if env == 'prod'
60 | +tracking-pixel('ntg3e')
61 | include includes/_facebook_tracking
62 | script.
63 | var OB_ADV_ID=27123;
64 | var scheme = (("https:" == document.location.protocol) ? "https://" : "http://");
65 | var str = '