Coder Social home page Coder Social logo

advancedandroid_teatime's Introduction

TeaTime

This is the toy app for the Espresso lesson of the Advanced Android App Development course on Udacity.

TeaTime is a mock tea ordering app that demonstrates various uses of the Espresso Testing framework (i.e. Views, AdapterViews, Intents, IdlingResources).

How to use this repo while taking the course

Each code repository in this class has a chain of commits that looks like this:

listofcommits

These commits show every step you'll take to create the app. They include Exercise commits and Solution commits.

Exercise commits contain instructions for completing the exercise, while solution commits show the completed exercise. You can tell what a commit is by looking at its commit message.

For example, TFCM.01-Exercise-AddGradleDependencies is the first code step in the Firebase Cloud Messaging (FCM) lesson. This is the exercise commit, and the exercise is called Add Gradle Dependencies.

Each commit also has a branch associated with it of the same name as the commit message, seen below:

branches Access all branches from this tab

listofbranches

branchesdropdown

The branches are also accessible from the drop-down in the "Code" tab

Working with the Course Code

Here are the basic steps for working with and completing exercises in the repo. This information is linked whenever you start a new exercise project, so don't feel you need to memorize all of this! In fact, skim it now, make sure that you know generally how to do the different tasks, and then come back when you start your first exercise.

The basic steps are:

  1. Clone the repo
  2. Checkout the exercise branch
  3. Find and complete the TODOs
  4. Optionally commit your code changes
  5. Compare with the solution

Step 1: Clone the repo

As you go through the course, you'll be instructed to clone the different exercise repositories, so you don't need to set these up now. You can clone a repository from github in a folder of your choice with the command:

git clone https://github.com/udacity/REPOSITORY_NAME.git

Step 2: Checkout the exercise branch

As you do different exercises in the code, you'll be told which exercise you're on, as seen below: exerciseexample

To complete an exercise, you'll want to check out the branch associated with that exercise. For the exercise above, the command to check out that branch would be:

git checkout TFCM.01-Exercise-AddGradleDependencies

Step 3: Find and complete the TODOs

This branch should always have Exercise in the title. Once you've checked out the branch, you'll have the code in the exact state you need. You'll even have TODOs, which are special comments that tell you all the steps you need to complete the exercise. You can easily navigate to all the TODOs using Android Studio's TODO tool. To open the TODO tool, click the button at the bottom of the screen that says TODO. This will display a list of all comments with TODO in the project.

We've numbered the TODO steps so you can do them in order: todos

Step 4: Optionally commit your code changes

After You've completed the TODOs, you can optionally commit your changes. This will allow you to see the code you wrote whenever you return to the branch. The following git code will add and save all your changes.

git add .
git commit -m "Your commit message"

Step 5: Compare with the solution

Most exercises will have a list of steps for you to check off in the classroom. Once you've checked these off, you'll see a pop up window with a link to the solution code. Note the Diff link:

solutionwindow

The Diff link will take you to a Github diff as seen below: diff

All of the code that was added in the solution is in green, and the removed code (which will usually be the TODO comments) is in red.

Report Issues

Notice any issues with a repository? Please file a github issue in the repository.

advancedandroid_teatime's People

Contributors

sudkul 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

advancedandroid_teatime's Issues

TESP.02-Solution-AddMenuActivityScreenTest FAILS to pass tests

What's wrong? This is what I get when I run the solution code:

07/25 15:47:36: Launching MenuActivityScreenTest
$ adb push /Users/MHye/AndroidStudioProjects/AdvancedAndroid_TeaTime/app/build/outputs/apk/app-debug.apk /data/local/tmp/com.example.android.teatime
$ adb shell pm install -r "/data/local/tmp/com.example.android.teatime"
Success


No apk changes detected since last installation, skipping installation of /Users/MHye/AndroidStudioProjects/AdvancedAndroid_TeaTime/app/build/outputs/apk/app-debug-androidTest.apk
$ adb shell am force-stop com.example.android.teatime.test
Running tests

$ adb shell am instrument -w -r   -e debug false -e class com.example.android.teatime.MenuActivityScreenTest com.example.android.teatime.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1566)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:92)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
at android.support.test.espresso.DataInteraction.load(DataInteraction.java:151)
at android.support.test.espresso.DataInteraction.perform(DataInteraction.java:128)
at com.example.android.teatime.MenuActivityScreenTest.clickGridViewItem_OpensOrderActivity(MenuActivityScreenTest.java:69)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1932)

Tests ran to completion.

AndroidJUnit4 and ActivityTestRule are not recognized

I'm trying to do the first exercise. I added maven repository in the build.gradle of the project, without this I can't compile the project:

allprojects {
    repositories {
        maven {
            url 'https://maven.google.com'
        }
        jcenter()
    }
}

Then I added the dependecies in the build.gradle of the app:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.android.teatime"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.android.support:design:25.1.0'
    compile 'com.android.support:support-annotations:25.1.0'
    compile 'com.google.android.gms:play-services-appindexing:9.8.0'

    // DONE (4) Add the required Espresso UI Testing dependencies
    // Testing-only dependencies
    androidTestCompile 'com.android.support:support-annotations:25.1.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}

But AndroidJUnit4 and ActivityTestRule are not recognized and I can't import them.

My Android Studio:
Android Studio 4.0
Build #AI-193.6911.18.40.6514223, built on May 20, 2020
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 1237M
Cores: 8
Registry: ide.new.welcome.screen.force=true
Non-Bundled Plugins: com.microsoft.vso.idea, org.intellij.plugins.markdown

android.support.test.espresso.IdlingResourceTimeoutException:

android.support.test.espresso.IdlingResourceTimeoutException: Wait for [SimpleIdlingResource] to become idle timed out
at dalvik.system.VMStack.getThreadStackTrace(Native Method)

After following all the instructions, I am getting above exception while Running the test

IdlingResourceMenuActivityTest
at com.example.android.teatime.IdlingResourceMenuActivityTest.idlingResourceTest(IdlingResourceMenuActivityTest.java:40)

And Line 40 of the code wrote exactly as you've guided or written in your sample

onData(anything()).inAdapterView(withId(R.id.tea_grid_view)).atPosition(0).perform(click());

can you guide me solve this issue?

Thanks

com.example.android.teatime E/art: Throwing OutOfMemoryError

Testing the first exercice on my Samsung S4, I have an out of memory error.
Is exist a way to increase the memory limit ?

The stack:
06-03 01:47:04.002 27206-27206/com.example.android.teatime E/art: Throwing OutOfMemoryError "Failed to allocate a 23040012 byte allocation with 1913468 free bytes and 1868KB until OOM" 06-03 01:47:04.002 27206-27206/com.example.android.teatime E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.teatime, PID: 27206 java.lang.OutOfMemoryError: Failed to allocate a 23040012 byte allocation with 1913468 free bytes and 1868KB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:726) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:547) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1014) at android.content.res.Resources.loadDrawableForCookie(Resources.java:3730) at android.content.res.Resources.loadDrawable(Resources.java:3603) at android.content.res.Resources.getDrawable(Resources.java:1852) at android.content.Context.getDrawable(Context.java:408) at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:30) at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:372) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:202) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:190) at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100) at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:73) at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:81) at com.example.android.teatime.TeaMenuAdapter.getView(TeaMenuAdapter.java:75) at android.widget.AbsListView.obtainView(AbsListView.java:2823) at android.widget.GridView.makeAndAddView(GridView.java:1437) at android.widget.GridView.makeRow(GridView.java:361) at android.widget.GridView.fillDown(GridView.java:302) at android.widget.GridView.fillFromTop(GridView.java:437) at android.widget.GridView.layoutChildren(GridView.java:1302) at android.widget.AbsListView.onLayout(AbsListView.java:2627) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) at android.widget.FrameLayout.onLayout(FrameLayout.java:508) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1702) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1556) at android.widget.LinearLayout.onLayout(LinearLayout.java:1465) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) at android.widget.FrameLayout.onLayout(FrameLayout.java:508) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1702) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1556) at android.widget.LinearLayout.onLayout(LinearLayout.java:1465) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) at android.widget.FrameLayout.onLayout(FrameLayout.java:508) at android.view.View.layout(View.java:16711) at android.view.ViewGroup.layout(ViewGroup.java:5328) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2319) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2032) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777) at android.view.Choreographer.doCallbacks(Choreographer.java:590) at android.view.Choreographer.doFrame(Choreographer.java:560)

TESP.02-Exercise-AddMenuActivityScreenTest TODO

The first TODO here is bad.
// TODO (1) Add annotation to specify AndroidJUnitRunner class as the default test runner

It should be
// COMPLETE (1) Add annotation to specify AndroidJUnit4 class as the default test runner

This is true for both the second and third exercises.

TESP.04-Solution-AddIdlingResourceMenuActivityTest

In TESP.04-Solution-AddIdlingResourceMenuActivityTest, MenuActivityScreenTest doesn't pass any more!!!
Also, in MenuActivity, there is a comment saying "We call ImageDownloader.downloadImage from onStart or onResume instead of in onCreate to ensure there is enougth time to register IdlingResource if the download is done too early (i.e. in onCreate)". This comment makes a feeling that mIdlingResource should be assigned and registered @before registerIdlingResource() before calling ImageDownloader.downloadImage() in onStart(). And in this case (similar to IdlingResourceSample), there would be no need to call getIdlingResource() in onCreate(). However, when using Logs, it is clear that all of onCreate(), onStart(), and onResume() in MenuActivity are actually called before @before registerIdlingResource() in IdlingResourceMenuActivityTest. That's why we must call getIdlingResource() in onCreate() to initialize mIdlingResource before using it in ImageDownloader.downloadImage().

exercise-1, solution-1 issue

Hi guys, while trying to follow up with espresso lesson repos, I found the following

1- Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (25.1.0) and test app (23.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
"I guess my build tools issue but wasn't solved after changing the build number "

and I can't really get what's the reason for the following issues;

2- Error:Failed to crunch file D:\NanoDegree\TeaTime\AdvancedAndroid_TeaTime-TESP.01-Exercise-FinishOrderActivityBasicTest\app\build\intermediates\exploded-aar\com.google.android.gms\play-services-base\9.8.0\res\drawable-xhdpi-v4\common_google_signin_btn_text_dark_pressed.9.png into D:\NanoDegree\TeaTime\AdvancedAndroid_TeaTime-TESP.01-Exercise-FinishOrderActivityBasicTest\app\build\intermediates\res\merged\debug\drawable-xhdpi-v4\common_google_signin_btn_text_dark_pressed.9.png

3- Error:Execution failed for task ':app:mergeDebugResources'.

Error: Failed to crunch file D:\NanoDegree\TeaTime\AdvancedAndroid_TeaTime-TESP.01-Exercise-FinishOrderActivityBasicTest\app\build\intermediates\exploded-aar\com.google.android.gms\play-services-base\9.8.0\res\drawable-xhdpi-v4\common_google_signin_btn_text_dark_pressed.9.png into
D:\NanoDegree\TeaTime\AdvancedAndroid_TeaTime-TESP.01-Exercise-FinishOrderActivityBasicTest\app\build\intermediates\res\merged\debug\drawable-xhdpi-v4\common_google_signin_btn_text_dark_pressed.9.png

Besides android studio can't recognize testing classes

Currency symbol system dependent

Initially the activity layout displays a currency symbol $ though once the button is pushed it displays the symbol of my region, the โ‚ฌ symbol.

It seems system dependent to me. The test case may need to be adapted to make it run successfully.

play-services-appindexing:9.8.0 is deprecated

In the Gradle build dependencies,
compile 'com.google.android.gms:play-services-appindexing:9.8.0' shows it is deprecated, please update the project to use the firebase 10.0.0 or above,

compile 'com.google.firebase:firebase-appindexing:11.2.2' solves it

Hard Coded Initial Currency Format

At the initial state hard coded $ currency (R.string.initial_cost) is used
After the increase/decrease btn pressed NumberFormat.getCurrencyInstance().format() is used which it can changes the currency not just the quantity.

TESP.02-Solution-AddMenuActivityScreenTest error

on running the test on an emulator, a error
android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id: com.example.android.teatime:id/tea_grid_view'.
occurs.

OutOfMemoryError because of loading large images OR too slow scrolling

Loading large images the resizing them by the system either throws OOM error or make the scrolling too slow.

To fix that move the images (tea images) to a new folder named drawable-nodpi instead of locating them inside drawable, in this case the images will be loaded with the same original size without resizing them to go along with device's density.

TESP.01-Exercise-FinishOrderActivityBasicTest - Bad logic in test

In the method clickDecrementButton_ChangesQuantityAndCost() we should increment first the quantity to "1" to test that the decrement button works!. Comments updated accordingly:

    @Test
    public void clickDecrementButton_ChangesQuantityAndCost() {

    // Check the initial quantity variable is zero
    onView((withId(R.id.quantity_text_view))).check(matches(withText("0")));

    // Click on increment button
    onView((withId(R.id.increment_button)))
        .perform(click());

    // Click on decrement button
    onView((withId(R.id.decrement_button)))
            .perform(click());

    // Verify that the decrement button decreases the quantity by 1
    onView(withId(R.id.quantity_text_view)).check(matches(withText("0")));

    // Verify that the decrement button also decreases the total cost from $5.00 to $0.00
    onView(withId(R.id.cost_text_view)).check(matches(withText("$0.00")));

}

Move gradle dependencies to one of the first steps

Hi guys, just a matter of suggestion I would recommend bring steps like add resource gradle dependency to one of the first TODO steps. The reason I am saying that is because for those not familiar with the IDE or even are not that good yet at predicting problems, walking along the steps with sintax problems popping up your code is not cool.

For instance exercise 4:

https://github.com/udacity/AdvancedAndroid_TeaTime/tree/TESP.04-Exercise-AddIdlingResourceMenuActivityTest

You can't get your code compiled at step 3 and 4 until your reach the step 9.

I know that is a very silly situation, but let's think as very beginner person.

Gradle Dependancies in Android 3.1.3

If you want to use the latest versions of the libraries, here what you must do.

compile is going to be replaced with implementation soon. Compiler gives warnings regarding that so you should change it.

Testing-only dependancies should be changed from androidTestCompile to androidTestImplementation

com.google.android.gms:play-services-appindexing:x.x.x is obsolete as it is replaced with com.google.firebase:firebase-appindexing:x.x.x where x.x.x is the version you need.

Here is a changed version that uses the latest libraries. Anything with the $ in it is a String value that you can change if a new version comes out for those.

`dependencies {

def espresso_version = "3.0.2"
def android_support_version = "27.1.1"
def android_support_test_version = "1.0.2"
def firebase_version = "16.0.1"

implementation "com.android.support:design:$android_support_version"
implementation "com.android.support:support-annotations:$android_support_version"
implementation "com.google.firebase:firebase-appindexing:$firebase_version"
implementation "com.android.support.test.espresso:espresso-idling-resource:$espresso_version"

// Testing-only dependencies
androidTestImplementation "com.android.support:support-annotations:$android_support_version"
androidTestImplementation "com.android.support.test.espresso:espresso-core:$espresso_version"
androidTestImplementation "com.android.support.test.espresso:espresso-intents:$espresso_version"
androidTestImplementation "com.android.support.test:rules:$android_support_test_version"
androidTestImplementation "com.android.support.test:runner:$android_support_test_version"

}`

Change compileSdkVersion 25 to compileSdkVersion 27

The static imports would be highlighted in red on the InstrumentedTest java files. Just delete the static imports and add each one. Can alt + enter on items you have your cursor on that are needing imports.

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.