# lbry-android development environment inside docker

[scripts/lbry-android.sh](scripts/lbry-android.sh) is a bash script to create a
docker container for lbry-android development. 

This is a hybrid approach where the apk is built inside docker, but you run
Android Studio, `adb`, and the app hot-reload bundler, directly on your host.

## Features

 * Clones lbry-android source code to a directory on the host, and mounts it
   inside the container.
 * Installs all build dependencies inside the container, leaving your host
   computer clean.
 * Mounted `.buildozer` directory to save container space. (Docker containers
   should stay under 10GB, and `.buildozer` is too big, so it has to stay in a
   mounted host directory instead.)
 * The biggest downloads are cached in `.buildozer-downloads` directory so you
   can easily remove `.buildozer` and not have to re-download the large cryostax
   NDK more than once.
 * Instructions for installing on a real Android device, and for setting up
   hot-reload.
 * Only a handful of commands to go from zero->hero.

## Requirements

Install all of the following on your host computer:

 * Tested on Linux x86_64 with BASH.
 * [Install Android Studio](https://developer.android.com/studio/).
   * The normal install auto-creates a directory in `$HOME/Android/Sdk` to store
     SDK downloads in your home directory.
 * [Install nodejs](https://nodejs.org/en/download/package-manager/).
 * [Install yarn](https://yarnpkg.com/lang/en/docs/install).
 * [Install Docker](https://docs.docker.com/install/).
 * Install `sudo` and give your user account access to run `sudo docker`. 
 
## Install

Clone `lbry-android`:

```
LBRY_GIT=$HOME/git/vendor/lbryio/
mkdir -p $LBRY_GIT
git clone https://github.com/lbryio/lbry-android.git $LBRY_GIT/lbry-android
cd $LBRY_GIT/lbry-android
git submodule update --init --recursive
```

Install a bash alias to the [scripts/lbry-android.sh](scripts/lbry-android.sh)
script:

```
echo "alias lbry-android=$LBRY_GIT/lbry-android/scripts/lbry-android.sh" >> $HOME/.bashrc

source ~/.bashrc
```

## Usage

 * First create the base docker image:
 
 ```
 lbry-android docker-build
 ```
 
(If anytime you change the docker build scripts in the [scripts](scripts)
subdirectory, you should rebuild the image again.)

 * Setup buildozer and install dependencies:
 
 ```
 lbry-android setup
 ```

 * Build the apk:
 
 ```
 lbry-android build
 ```

The apk will be built and end up in the `lbry-android/bin/` subdirectory.

## Running on a real Android device

Once you have the apk built, you can install it on a real Android device to
start testing.

Follow the Android documentation for [enabling USB
debugging](https://developer.android.com/studio/command-line/adb#Enabling) on
your device.

Once you have enabled debugging, do the following:

 * Plug your device into a USB port on the host computer.
 * Run: 

 ```~/Android/Sdk/platform-tools/adb devices```

 * ADB should list your device like so:
 
 ```
 [ryan@t440s lbry-android]$ adb devices
 List of devices attached
 HT71R0000000	device
 ```

 * The first time you connect, you should see a modal dialog on the device
   asking to confirm the host id. You must approve it, or adb will fail to
   connect. 
   
 * If after trying several times, adb is still not connecting to your device,
   and adb lists your device as `unauthorized`, you may need to [follow this
   advice](https://stackoverflow.com/a/38380384/56560) and delete your
   `$HOME/.android` directory.

 * Install the apk (whatever the current version is called) to the device:
 
 ```
 ~/Android/Sdk/platform-tools/adb install ./bin/browser-0.7.5-debug.apk
 ```

 * Open the app on your device, and follow the initial steps to get to the main
   lbry-android browser page.
   
 * Create a tcp tunnel over the adb bridge, for the app to handle live-reload:
 
 ```
 ~/Android/Sdk/platform-tools/adb reverse tcp:8081 tcp:8081
 ```

 * Start the live-reload server on the host:
 
 ```
 cd app/
 yarn install
 yarn start
 ```

 * With your device currently running the lbry-android app, shake the device
   from side to side, and a menu will appear. Choose `Enable Hot Reloading`.
   
 * The app should reload itself.
 
 * Now make a change to the source code to test hot reload. From the host, open
   up the main page view source code: `app/src/component/uriBar/view.js`. Find
   the line that reads `Search movies, music, and more` (This is the main search
   bar at the top of the app.) - Change some of the text and save the file.
   
 * If hot-reload is working, within a few seconds the phone should reload the
   page automatically and show the change that you made.
   
 * If the hot-reload does not work, try closing the app (dismiss the window from
   the tab overview, via android square button) and reload the app.