Github Browser Sample with Android Architecture Components

This is a sample app that uses Android Architecture Components with Dagger 2.

NOTE It is a relatively more complex and complete example so if you are not familiar
with Architecture Components, you are highly recommended to check other examples
in this repository first.



The app is composed of 3 main screens.


Allows you to search repositories on Github.
Each search result is kept in the database in RepoSearchResult table where
the list of repository IDs are denormalized into a single column.
The actual Repo instances live in the Repo table.

Each time a new page is fetched, the same RepoSearchResult record in the
Database is updated with the new list of repository ids.

NOTE The UI currently loads all Repo items at once, which would not
perform well on lower end devices. Instead of manually writing lazy
adapters, we’ve decided to wait until the built in support in Room is released.


This fragment displays the details of a repository and its contributors.


This fragment displays a user and their repositories.


You can open the project in Android studio and press run.


The project uses both instrumentation tests that run on the device
and local unit tests that run on your computer.
To run both of them and generate a coverage report, you can run:

./gradlew fullCoverageReport (requires a connected device or an emulator)

Device Tests

UI Tests

The projects uses Espresso for UI testing. Since each fragment
is limited to a ViewModel, each test mocks related ViewModel to
run the tests.

Database Tests

The project creates an in memory database for each database test but still
runs them on the device.

Local Unit Tests

ViewModel Tests

Each ViewModel is tested using local unit tests with mock Repository

Repository Tests

Each Repository is tested using local unit tests with mock web service and
mock database.

Webservice Tests

The project uses MockWebServer project to test REST api interactions.



Copyright 2017 The Android Open Source Project, Inc.

Licensed to the Apache Software Foundation (ASF) under one or more contributor
license agreements. See the NOTICE file distributed with this work for
additional information regarding copyright ownership. The ASF licenses this
file to you under the Apache License, Version 2.0 (the “License”); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.


View Github