GithubHelp home page GithubHelp logo

mozilla / webmaker-android Goto Github PK

View Code? Open in Web Editor NEW
166.0 62.0 113.0 20.63 MB

Webmaker for Android

Home Page: https://play.google.com/store/apps/details?id=org.mozilla.webmaker

License: Mozilla Public License 2.0

JavaScript 2.26% Java 97.74%

webmaker-android's Introduction

Webmaker for Android

Please file all issues related to Webmaker Android at https://github.com/mozilla/webmaker-core/issues. You can use the android tag if your issue applies specifically to this repo or the Android platform.

Build Status

Mozilla Webmaker's mission is to help enable a new generation of digital creators and webmakers, giving people the tools and skills they need to move from using the Web to actively making the Web. To this end, the Webmaker App is an entry point to the Webmaker community that provides a radically simple interface for creating mobile applications directly on device.

Webmaker for Android

Getting Started

Prerequisites

Before you jump into the code you'll want to download, install, and configure the following:

Clone & Install Dependencies

git clone https://github.com/mozilla/webmaker-android
cd webmaker-android
npm install

Specifying a dev environment

In order to override default webmaker-core settings such as id and api endpoints, create an .env file in the webmaker-android root directory, and declare any environment overrides you need in that file, then (re)build the webmaker-android project using npm run build.

For example, to run webmaker-android with a different API endpoint, you would make sure the .env file contains:

API_URI=http://alternative.api.endpoint

For more details on which environment variables are used by webmaker-core, please see the webmaker-core default environment.

Android

This repository is home to the native Android wrapper for the Webmaker app. webmaker-android is a hybrid mobile application that is primarily web-based (HTML/CSS/JS) but uses this wrapper to communicate with the native Android SDK. To make changes or to test the app, we recommend you use Android Studio.

  • Compile the webview code with npm run build.
  • Install and configure Android Studio
  • Open Android Studio and select "Import Project"
  • If Android Studio asks, choose "Create project from existing sources"
  • Select the "webmaker-android" directory

Once you have the project open, you can run it within an emulator or on any Android device with USB debugging enabled by selecting "Run 'app'" from the "Run" dropdown menu. For more information, please check out the Android SDK documentation.

If you can't compile the project, check the messages at the bottom of the Android Studio IDE. If this is the first time you've run an Android project, you may need to install an Android target OS. If so, there should be a link in the messages that will walk you through that. Afterwards, you'll probably need to install a virtual device for emulation. If you're using an x86 based development machine and virtual device, you'll probably have to install Intel HAXM as well.

Because much of the application logic takes place in WebViews, you'll likely want to set up Remote debugging on Android with Chrome.

Web

Each fragment within webmaker-android is actually just a web page! You can find all of the js, css, and static assets in the webmaker-core module. Static files in ./node_modules/webmaker-core/src/dest/ will be copied up to this Android wrapper as part of npm run build.

NOTE:

For local development, it's recommended to use npm link (read more) with a local copy of webmaker-core, in which you'll do any webview related work separately.

Gradle will automatically run npm run copy:core before building in Android Studio. This makes it convenient to watch your local copy of webmaker-core while you are testing on device or with an emulator.

Contact Us

IRC: #webmaker on irc.mozilla.org

Forum: https://groups.google.com/forum/#!forum/mozilla.webmaker


Configuration

Changing configuration

You can see all the default configuration in config/defaults.env (within webmaker-core). In order to change something, create a file called .env in your root directory and format configuration as follows:

CONFIG_VALUE='blah'

Turning on production configuration

You will need a production CLIENT_ID for the id.webmaker.org OAuth server to run the app in production mode. Ask @cade or @k88hudson on irc.

If you are deploying/creating a build that should use production configuration, add the following to your .env before running npm run build.

NODE_ENV='PRODUCTION'
CLIENT_ID='xxxxxx'

Network Assets

Webmaker for Android attempts to use network resources as sparingly as possible. In addition, it is important to cover failure and loading states gracefully at all times. To this end, we have a few React components and libraries included in the project to help make this easier:

Interacting with Android APIs

While very few native Android APIs are used throughout the app, there are a few instances where native APIs are exposed to JS and react using the WebAppInterace.java class:

Router

The application uses an Android class called Router to move between activities. Similar to how you can pass parameters in a URL router like Express, the Android Router class can provide route parameters via the router.js mixin. When using the mixin, route parameters will be bound to route within the react class's state.

var router = require('./lib/router.js');

var MyThing = React.createClass({
  mixins: [router],
  // ...
  componentWillMount: function () {
    console.log(this.state.route);
  }
});

SharedPreferences

SharedPreferences is a simple key/value store API native to Android that can be used to persist values to disk that are only available to the Webmaker application. You can both set and get values to SharedPreferences using Java <-> JS bindings that are provided within WebAppInterface.java:

if (window.Android) {
  window.Android.setSharedPreferences('my::cache::key', 'foobar');
  var hit = window.Android.getSharedPreferences('my::cache::key');
  console.log(hit); // prints "foobar"
}

SharedPreferences is automatically namespaced to the current activity. You can override this behavior by passing true to the optional "global" parameter:

window.Android.getSharedPreferences('state', true);

LRU Cache

MemStorage is a single LRUCache instance that is provided as a singleton. This can be used to persist values to memory that are not needed in-between app sessions. You can both set and get values to MemStorage using Java <-> JS bindings that are provided within WebAppInterface.java:

if (window.Android) {
  window.Android.setMemStorage('my::cache::key', 'foobar', false);
  var hit = window.Android.getMemStorage('my::cache::key', false);
  console.log(hit); // prints "foobar"
}

MemStorage is automatically namespaced to the current activity. You can override this behavior by passing true to the optional "global" parameter:

window.Android.getMemStorage('state', true);

Google Analytics Event Firing

This function allows you to send event data to Google Analytics by calling the trackEvent() method. Optionally you can specify a numeric value (int) to pass along in your event, however this isn't required. Please see the below code for example implementation.

You can read more about the parameters and what they do here: https://developers.google.com/analytics/devguides/collection/android/v4/events

if (window.Android) {
    window.Android.trackEvent('category', 'action', 'label');
    window.Android.trackEvent('category', 'action', 'label', 'value'); // optional value
}

webmaker-android's People

Contributors

adamlofting avatar alanmoo avatar alicoding avatar byebyebyezzz avatar cadecairos avatar droxxr avatar errietta avatar flukeout avatar gesa avatar gvn avatar humphd avatar hzahoori avatar jbuck avatar jd-wasem avatar jlaverty avatar jordantheriault avatar k88hudson avatar louisstow avatar okevin0 avatar pippinlee avatar pomax avatar rdaoud1 avatar ryandang avatar ryanwarsaw avatar secretrobotron avatar thisandagain avatar timmh avatar toolness avatar whyqqqqq avatar xmatthewx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

webmaker-android's Issues

Notifications - Document PN Touch Points

Document the places in which push notifications will be used throughout the app and how they relate to the core user experience as both an author (productive) and user (consumptive).

View - Templates

Implementation of initial discover view as per mockups:
https://redpen.io/p/fg6854135873dfca94

This first "hello world" implementation of the discover view will be based on static placeholder personas that are embedded into the application itself (as to work offline).

Ecosystem - Move "Makes" Into App

Makes created within the application should be installed local to the app and only optionly added to the home-screen. This requires quite a few design changes, but ultimately simplifies quite a bit of the technical implementation as well as makes the process of porting to Android / iOS much more straightforward.

Example - Blog

Design example application to be used for the sharing of content (Blog). Possible personas: citizen journalist, community organizer.

Build - Autogenerate appcache manifest

Proposal (Please Comment)

Background

We need a basic CLI tool that will create an appcache manifest for a given directory. The tool should walk the directory tree to form a complete manifest and then generate a checksum comment to force expire existing caches.

Basic Use

[sudo] npm install -g appcachify
appcachify ./my/build/dir
CACHE MANIFEST
# Checksum 68e2b731ac1486dff1a2c583eb7c4780

index.html
index.js

./icons/activity.svg
./icons/apps.svg
./icons/discover.svg
./icons/me.svg

./styles/common.css
./styles/normalize.css

NETWORK:
*
http://*
https://*

Options

--fallback [string] Specify fallback asset(s)
--network [string] Specify network location(s)
--hidden Includes hidden files (like .DS_Store, .gitignore, etc.)

Need a small server to help with routing

We're using js routing, push state, etc., which means we can't refresh a page, or go directly to urls like http://localhost:8080/apps. Let's build a tiny node app to point (properly MIME'd) requests at index.html.

Example - Data Collection

Design example application to be used for Data Collection. Possible personas: teacher, aid worker.

Make - Redesign Navigation for "Play / Edit / Data" Paradigm

Redesign of navigation to accommodate bricks that make use of persistent storage such as forms and messaging. This includes:

  • In-app navigation for non-owners (signed-in)
  • In-app navigation for non-owners (not signed-in)
  • In-app navigation for owners

Brick - Header Definition

Need to design the header brick and how it will be editable.

Minimum Requirements for "Hello World":
• Ability to edit name of app (Header name = app name)
• Ability to change color of the header

Other Requirements:
• Ability to change color of app name text in header
• Ability to change font of app name text in header
• Ability to change background color of entire app

FFOS - Hosted vs Packaged App

We are leaning towards hosted, but are there any "gotchas" that could necessitate a packaged / privileged application. Possibilities: push notifications, device access, etc.

View - Apps

Implementation of initial apps view as per mockups:
https://redpen.io/p/fg6854135873dfca94

Because the publishing flow will not be implemented until a future SOW, the only section that is relevant for this milestone is, "Apps I've Installed".

Profile - Hello World design of profile

Design a simple profile screen

MUP (Minimum Useful Product) Requirements for the Hello World prototype (Due: Friday, August 8th)
• Ability to view name
• Ability to view location
• Ability to add/edit name
• Ability to add/edit location

Requirements for profile page beyond Hello World:
• Ability to view profile image
• Ability to add/edit profile image (profile image could be auto-generated avatar)
• List of apps the user has created
• Option to add occupation/short bio

Publish - Redesign Flow

Explore a design for the publishing flow that is non-linear and centered around the customization of pre-populated (derived and randomized) choices. For example, generate an icon, name, and location (?) for the user and allow them to change it vs. forcing them to embark on a long linear flow. This should help reduce friction while also providing a meaningful context for the information that we are requesting.

(cc @mhanratty @xmatthewx @iamjessklein)

Type - Color Picker Definition

Need to define how user will choose colors.

Bricks applied to:
• Text (changing text color)
• Header (changing header color)

Minimum Requirement:
• Ability to select from pre-defined palette of colors

Example - Community of Interest

Design example application to be used for interest-driven communities (forums / BB). Possible personas: community organizer, youth.

View - Player

View that loads an application JSON blob and renders it using bricks that are local to the application

Bricks for this first SOW:
#22
#23

Apps - Empty State

Need to design a simple empty state for the "Apps" section that guides users towards "Discover" if they have not installed or made any apps yet.

Privileged loader architecture

The architecture suggested by @andreasgal (as transcribed by me) is to make a thin, hardened packaged app, with minimal UI apart from maybe a splash screen, whose job is to load the last-downloaded version of the app assets and start the app, and start async worker threads to fetch any newer version of the app. Minimally, the app will then update on next start-after-kill, assuming the new version of the app has been completely downloaded. In the future, the app could offer "A new version of the app is available, want to reload?" .

The advantages from this approach are:

a) we can update the content, UI, etc. just by pushing a new version of those assets to a (versioned) URL, out of sync with the update/release schedule of the packaged app.

b) the packaged app + initial version of the hosted-bits can be reviewed whenever the operator or whoever needs to decide whether to pre-install the app, and fixes etc. can happen after that.

c) this is a generic mechanism which many other apps could benefit from.

d) if we want to allow for a no-network-hit initial use, the build script can pre-load the indexeddb DB with the version of the hosted apps available at build time.

The primary reason for having the pre-installed app be privileged is so that if we need the app to be whitelisted or have elevated privileges (e.g. for FxA auth), that can happen at that layer of app origin.

@thisandagain and I were talking about a wrapper around XHR that was designed to deal with network challenges (connections dropping, low bandwidth, etc). This would be useful here.

Other notes:

  • Downloaded assets should be stored in IndexedDB, along w/ any state representing the state of the upgrade.
  • Once version N+1 has been downloaded, version N-1 should be removed from the local storage.

As agal pointed out, the code in this shim isn't huge, but it has to be solid. We should spec it out soon.

Clarify relationship of makes to browsing, URLs, etc.

When a link is shared w/ someone, it will be an https:// URL -- to what? What happens when the recipient clicks on that link in the following scenarios:

  • recipient has a FirefoxOS phone with the appmaker app installed
  • recipient has an Android phone w/ the appmaker app installed
  • recipient has a FFOS/android phone w/o the app installed
  • recipient is on iOS
  • recipient is on a desktop computer

This is particularly important to get right given that the sharing messages are the 'viral' vector for the app.

Example - Commerce

Design example application to be used for commerce. Possible personas: vendors, couriers, VARs.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.