├── .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 | 64x64 -------------------------------------------------------------------------------- /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 | Artboard 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 | ![cd2platform-tools](https://lh3.googleusercontent.com/-1r3DTn90RLE/Vt3JLcD9UcI/AAAAAAAACsQ/D1l_m9nIv6k/w807-h482-no/cd2platform-tools.png) 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 | ![usrBin](https://lh5.googleusercontent.com/-UcaFzxijNcw/Vt3JHlFx40I/AAAAAAAACsI/zHQoEqc1MJ8/w808-h498-no/usrBin.png) 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 | ![copyNpaste](https://lh6.googleusercontent.com/-xN9cKsTKqos/Vt3JJbYBQeI/AAAAAAAACsM/a2SnBYOIfZY/w697-h569-no/copyNpaste.png) 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 | ![Successful _ADB_ Connection](http://i.kinja-img.com/gawker-media/image/upload/delsoa5w5hhpzgru7vrc.png) 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 | ![ADBinstall](https://lh4.googleusercontent.com/-bFeWpu-wpJI/Vp6-N25uXdI/AAAAAAAAAFQ/5IU2Q1q7fX0/w803-h502-no/DroppingAPK.png) 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 | ![ADBpush&pull](https://lh6.googleusercontent.com/-XuODZ0wElv8/Vp6-b9cOEyI/AAAAAAAAAFg/4t5CVBI-FJw/w803-h502-no/ADBpush%2526pull.png) 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 | ![adbAction1](https://lh5.googleusercontent.com/-ZmYQa_0CwOg/VqraCB6uEVI/AAAAAAAACnA/ZO7Lu-Lq49Q/w550-h344-no/adbAction1.png) 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 | ![adbAction3](https://lh6.googleusercontent.com/-wcFkR1mHq_8/VqraAOQNoWI/AAAAAAAACnA/JY_tD18ZOG0/w254-h423-no/adbAction3.png) 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 | ![adbAction2](https://lh5.googleusercontent.com/-gzbgSBfsD74/VqraBz4I31I/AAAAAAAACnA/lw6Bn6z0jb8/w550-h344-no/adbAction2.png) 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 | ![Android Infographic 2015 Statistics](/library/peachpellen/android_infographic.jpg) 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 | [![Travis CI Status](https://travis-ci.org/intel-android/androidhub.svg?branch=master)](https://travis-ci.org/intel-android/androidhub) 2 | [![Join the chat at https://gitter.im/intel-android/androidhub](https://badges.gitter.im/Join%20Chat.svg)](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 = '