master c677deb09817 cached
616 files
512.3 KB
155.3k tokens
364 symbols
1 requests
Download .txt
Showing preview only (672K chars total). Download the full file or copy to clipboard to get everything.
Repository: dogriffiths/HeadFirstAndroid2ndEdition
Branch: master
Commit: c677deb09817
Files: 616
Total size: 512.3 KB

Directory structure:
gitextract_7f53uovh/

├── README.org
├── chapter01/
│   └── MyFirstApp/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── myfirstapp/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── myfirstapp/
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── myfirstapp/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter02/
│   └── BeerAdviser/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── beeradviser/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── beeradviser/
│       │       │   │               ├── BeerExpert.java
│       │       │   │               └── FindBeerActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_find_beer.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── beeradviser/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter03/
│   └── MyMessenger/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── mymessenger/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── mymessenger/
│       │       │   │               ├── CreateMessageActivity.java
│       │       │   │               └── ReceiveMessageActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_create_message.xml
│       │       │       │   └── activity_receive_message.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── mymessenger/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter04/
│   └── Stopwatch/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── stopwatch/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── stopwatch/
│       │       │   │               └── StopwatchActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_stopwatch.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── stopwatch/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter05/
│   ├── Duck/
│   │   ├── .gitignore
│   │   ├── .idea/
│   │   │   ├── compiler.xml
│   │   │   ├── copyright/
│   │   │   │   └── profiles_settings.xml
│   │   │   ├── encodings.xml
│   │   │   ├── gradle.xml
│   │   │   ├── misc.xml
│   │   │   ├── modules.xml
│   │   │   └── runConfigurations.xml
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── androidTest/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── hfad/
│   │   │       │               └── duck/
│   │   │       │                   └── ExampleInstrumentedTest.java
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── java/
│   │   │       │   │   └── com/
│   │   │       │   │       └── hfad/
│   │   │       │   │           └── duck/
│   │   │       │   │               └── MainActivity.java
│   │   │       │   └── res/
│   │   │       │       ├── layout/
│   │   │       │       │   └── activity_main.xml
│   │   │       │       └── values/
│   │   │       │           ├── colors.xml
│   │   │       │           ├── strings.xml
│   │   │       │           └── styles.xml
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── hfad/
│   │   │                       └── duck/
│   │   │                           └── ExampleUnitTest.java
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   └── LinearLayoutExample/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── linearlayoutexample/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── linearlayoutexample/
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── linearlayoutexample/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter06/
│   └── MyConstraintLayout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── myconstraintlayout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── myconstraintlayout/
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── myconstraintlayout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter07/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter08/
│   └── BitsandPizzas/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── bitsandpizzas/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── bitsandpizzas/
│       │       │   │               ├── MainActivity.java
│       │       │   │               └── OrderActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_order.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── bitsandpizzas/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter09/
│   └── Workout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── workout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── workout/
│       │       │   │               ├── DetailActivity.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── Workout.java
│       │       │   │               ├── WorkoutDetailFragment.java
│       │       │   │               └── WorkoutListFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_detail.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   └── fragment_workout_detail.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── workout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter10/
│   └── Workout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── workout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── workout/
│       │       │   │               ├── DetailActivity.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── Workout.java
│       │       │   │               ├── WorkoutDetailFragment.java
│       │       │   │               └── WorkoutListFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_detail.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   └── fragment_workout_detail.xml
│       │       │       ├── layout-large/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── workout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter11/
│   └── Workout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── workout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── workout/
│       │       │   │               ├── DetailActivity.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── StopwatchFragment.java
│       │       │   │               ├── TempActivity.java
│       │       │   │               ├── Workout.java
│       │       │   │               ├── WorkoutDetailFragment.java
│       │       │   │               └── WorkoutListFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_detail.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_temp.xml
│       │       │       │   ├── fragment_stopwatch.xml
│       │       │       │   └── fragment_workout_detail.xml
│       │       │       ├── layout-large/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── workout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter12/
│   └── BitsandPizzas/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── bitsandpizzas/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── bitsandpizzas/
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── OrderActivity.java
│       │       │   │               ├── PastaFragment.java
│       │       │   │               ├── PizzaFragment.java
│       │       │   │               ├── StoresFragment.java
│       │       │   │               └── TopFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_order.xml
│       │       │       │   ├── fragment_top.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── bitsandpizzas/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter13/
│   └── BitsandPizzas/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── bitsandpizzas/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── bitsandpizzas/
│       │       │   │               ├── CaptionedImagesAdapter.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── OrderActivity.java
│       │       │   │               ├── PastaFragment.java
│       │       │   │               ├── Pizza.java
│       │       │   │               ├── PizzaDetailActivity.java
│       │       │   │               ├── PizzaFragment.java
│       │       │   │               ├── StoresFragment.java
│       │       │   │               └── TopFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_order.xml
│       │       │       │   ├── activity_pizza_detail.xml
│       │       │       │   ├── card_captioned_image.xml
│       │       │       │   ├── fragment_pizza.xml
│       │       │       │   ├── fragment_top.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── bitsandpizzas/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter14/
│   └── CatChat/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── catchat/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── catchat/
│       │       │   │               ├── DraftsFragment.java
│       │       │   │               ├── FeedbackActivity.java
│       │       │   │               ├── HelpActivity.java
│       │       │   │               ├── InboxFragment.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── SentItemsFragment.java
│       │       │   │               └── TrashFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_feedback.xml
│       │       │       │   ├── activity_help.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── fragment_drafts.xml
│       │       │       │   ├── fragment_inbox.xml
│       │       │       │   ├── fragment_sent_items.xml
│       │       │       │   ├── fragment_trash.xml
│       │       │       │   ├── nav_header.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_nav.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── catchat/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter15/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               ├── StarbuzzDatabaseHelper.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter16/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               ├── StarbuzzDatabaseHelper.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter17/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               ├── StarbuzzDatabaseHelper.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter18/
│   └── Joke/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── joke/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── joke/
│       │       │   │               ├── DelayedMessageService.java
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── joke/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
└── chapter19/
    └── Odometer/
        ├── .gitignore
        ├── .idea/
        │   ├── compiler.xml
        │   ├── copyright/
        │   │   └── profiles_settings.xml
        │   ├── encodings.xml
        │   ├── gradle.xml
        │   ├── misc.xml
        │   ├── modules.xml
        │   └── runConfigurations.xml
        ├── app/
        │   ├── .gitignore
        │   ├── build.gradle
        │   ├── proguard-rules.pro
        │   └── src/
        │       ├── androidTest/
        │       │   └── java/
        │       │       └── com/
        │       │           └── hfad/
        │       │               └── odometer/
        │       │                   └── ExampleInstrumentedTest.java
        │       ├── main/
        │       │   ├── AndroidManifest.xml
        │       │   ├── java/
        │       │   │   └── com/
        │       │   │       └── hfad/
        │       │   │           └── odometer/
        │       │   │               ├── MainActivity.java
        │       │   │               └── OdometerService.java
        │       │   └── res/
        │       │       ├── layout/
        │       │       │   └── activity_main.xml
        │       │       └── values/
        │       │           ├── colors.xml
        │       │           ├── strings.xml
        │       │           └── styles.xml
        │       └── test/
        │           └── java/
        │               └── com/
        │                   └── hfad/
        │                       └── odometer/
        │                           └── ExampleUnitTest.java
        ├── build.gradle
        ├── gradle/
        │   └── wrapper/
        │       ├── gradle-wrapper.jar
        │       └── gradle-wrapper.properties
        ├── gradle.properties
        ├── gradlew
        ├── gradlew.bat
        └── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: README.org
================================================
Source code for the second edition


================================================
FILE: chapter01/MyFirstApp/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter01/MyFirstApp/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter01/MyFirstApp/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter01/MyFirstApp/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter01/MyFirstApp/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter01/MyFirstApp/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter01/MyFirstApp/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/MyFirstApp.iml" filepath="$PROJECT_DIR$/MyFirstApp.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter01/MyFirstApp/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter01/MyFirstApp/app/.gitignore
================================================
/build


================================================
FILE: chapter01/MyFirstApp/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.myfirstapp"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter01/MyFirstApp/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter01/MyFirstApp/app/src/androidTest/java/com/hfad/myfirstapp/ExampleInstrumentedTest.java
================================================
package com.hfad.myfirstapp;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.myfirstapp", appContext.getPackageName());
    }
}


================================================
FILE: chapter01/MyFirstApp/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.myfirstapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: chapter01/MyFirstApp/app/src/main/java/com/hfad/myfirstapp/MainActivity.java
================================================
package com.hfad.myfirstapp;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


================================================
FILE: chapter01/MyFirstApp/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hfad.myfirstapp.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sup doge"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>


================================================
FILE: chapter01/MyFirstApp/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter01/MyFirstApp/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">My First App</string>
</resources>


================================================
FILE: chapter01/MyFirstApp/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter01/MyFirstApp/app/src/test/java/com/hfad/myfirstapp/ExampleUnitTest.java
================================================
package com.hfad.myfirstapp;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter01/MyFirstApp/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter01/MyFirstApp/gradle/wrapper/gradle-wrapper.properties
================================================
#Thu Apr 27 13:36:28 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter01/MyFirstApp/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter01/MyFirstApp/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter01/MyFirstApp/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter01/MyFirstApp/settings.gradle
================================================
include ':app'


================================================
FILE: chapter02/BeerAdviser/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter02/BeerAdviser/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter02/BeerAdviser/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter02/BeerAdviser/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter02/BeerAdviser/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter02/BeerAdviser/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter02/BeerAdviser/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/BeerAdviser.iml" filepath="$PROJECT_DIR$/BeerAdviser.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter02/BeerAdviser/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter02/BeerAdviser/app/.gitignore
================================================
/build


================================================
FILE: chapter02/BeerAdviser/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.beeradviser"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter02/BeerAdviser/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter02/BeerAdviser/app/src/androidTest/java/com/hfad/beeradviser/ExampleInstrumentedTest.java
================================================
package com.hfad.beeradviser;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.beeradviser", appContext.getPackageName());
    }
}


================================================
FILE: chapter02/BeerAdviser/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.beeradviser">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".FindBeerActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: chapter02/BeerAdviser/app/src/main/java/com/hfad/beeradviser/BeerExpert.java
================================================
package com.hfad.beeradviser;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by davidg on 28/04/2017.
 */

public class BeerExpert {
    List<String> getBrands(String color) {
        List<String> brands = new ArrayList<>();
        if (color.equals("amber")) {
            brands.add("Jack Amber");
            brands.add("Red Moose");
        } else {
            brands.add("Jail Pale Ale");
            brands.add("Gout Stout");
        }
        return brands;
    }
}


================================================
FILE: chapter02/BeerAdviser/app/src/main/java/com/hfad/beeradviser/FindBeerActivity.java
================================================
package com.hfad.beeradviser;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Spinner;
import android.widget.TextView;

import java.util.List;

public class FindBeerActivity extends Activity {
    private BeerExpert expert = new BeerExpert();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_find_beer);
    }

    //Call when the button gets clicked
    public void onClickFindBeer(View view) {
        //Get a reference to the TextView
        TextView brands = (TextView) findViewById(R.id.brands);

        //Get a reference to the Spinner
        Spinner color = (Spinner) findViewById(R.id.color);

        //Get the selected item in the Spinner
        String beerType = String.valueOf(color.getSelectedItem());

        //Get recommendations from the BeerExpert class
        List<String> brandsList = expert.getBrands(beerType);
        StringBuilder brandsFormatted = new StringBuilder();
        for (String brand : brandsList) {
            brandsFormatted.append(brand).append('\n');
        }

        //Display the beers
        brands.setText(brandsFormatted);
    }
}


================================================
FILE: chapter02/BeerAdviser/app/src/main/res/layout/activity_find_beer.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.hfad.beeradviser.FindBeerActivity"
    >

    <Spinner
        android:id="@+id/color"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:layout_gravity="center"
        android:layout_margin="16dp"
        android:entries="@array/beer_colors"
        />

    <Button
        android:id="@+id/find_beer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="16dp"
        android:text="@string/find_beer"
        android:onClick="onClickFindBeer"
        />

    <TextView
        android:id="@+id/brands"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="16dp"
        android:text="@string/brands"
        />
</LinearLayout>


================================================
FILE: chapter02/BeerAdviser/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter02/BeerAdviser/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">Beer Adviser</string>
    <string name="find_beer">Find Beer!</string>
    <string name="brands">No beers selected</string>
    <string-array name="beer_colors">
        <item>light</item>
        <item>amber</item>
        <item>brown</item>
        <item>dark</item>
    </string-array>
</resources>


================================================
FILE: chapter02/BeerAdviser/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter02/BeerAdviser/app/src/test/java/com/hfad/beeradviser/ExampleUnitTest.java
================================================
package com.hfad.beeradviser;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter02/BeerAdviser/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter02/BeerAdviser/gradle/wrapper/gradle-wrapper.properties
================================================
#Fri Apr 28 12:49:04 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter02/BeerAdviser/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter02/BeerAdviser/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter02/BeerAdviser/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter02/BeerAdviser/settings.gradle
================================================
include ':app'


================================================
FILE: chapter03/MyMessenger/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter03/MyMessenger/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter03/MyMessenger/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter03/MyMessenger/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter03/MyMessenger/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter03/MyMessenger/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter03/MyMessenger/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/MyMessenger.iml" filepath="$PROJECT_DIR$/MyMessenger.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter03/MyMessenger/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter03/MyMessenger/app/.gitignore
================================================
/build


================================================
FILE: chapter03/MyMessenger/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.mymessenger"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter03/MyMessenger/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter03/MyMessenger/app/src/androidTest/java/com/hfad/mymessenger/ExampleInstrumentedTest.java
================================================
package com.hfad.mymessenger;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.mymessenger", appContext.getPackageName());
    }
}


================================================
FILE: chapter03/MyMessenger/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.mymessenger">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".CreateMessageActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ReceiveMessageActivity"></activity>
    </application>

</manifest>

================================================
FILE: chapter03/MyMessenger/app/src/main/java/com/hfad/mymessenger/CreateMessageActivity.java
================================================
package com.hfad.mymessenger;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class CreateMessageActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_message);
    }

    //Call onSendMessage() when the button is clicked
    public void onSendMessage(View view) {
        EditText messageView = (EditText)findViewById(R.id.message);
        String messageText = messageView.getText().toString();
        Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_TEXT, messageText);
        String chooserTitle = getString(R.string.chooser);
        Intent chosenIntent = Intent.createChooser(intent, chooserTitle);
        startActivity(chosenIntent);
    }
}


================================================
FILE: chapter03/MyMessenger/app/src/main/java/com/hfad/mymessenger/ReceiveMessageActivity.java
================================================
package com.hfad.mymessenger;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class ReceiveMessageActivity extends Activity {
    public static final String EXTRA_MESSAGE = "message";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receive_message);
        Intent intent = getIntent();
        String messageText = intent.getStringExtra(EXTRA_MESSAGE);
        TextView messageView = (TextView)findViewById(R.id.message);
        messageView.setText(messageText);
    }
}


================================================
FILE: chapter03/MyMessenger/app/src/main/res/layout/activity_create_message.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.hfad.mymessenger.CreateMessageActivity"
    >
    <EditText
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="@string/hint"
        android:ems="10"
        />
    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="onSendMessage"
        android:text="@string/send"
        />
</LinearLayout>

================================================
FILE: chapter03/MyMessenger/app/src/main/res/layout/activity_receive_message.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.hfad.mymessenger.ReceiveMessageActivity"
    >
    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

================================================
FILE: chapter03/MyMessenger/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter03/MyMessenger/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">My Messenger</string>
    <string name="send">Send Message</string>
    <string name="hint">Enter a message</string>
    <string name="chooser">Send message via...</string>
</resources>


================================================
FILE: chapter03/MyMessenger/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter03/MyMessenger/app/src/test/java/com/hfad/mymessenger/ExampleUnitTest.java
================================================
package com.hfad.mymessenger;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter03/MyMessenger/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter03/MyMessenger/gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Apr 30 09:14:51 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter03/MyMessenger/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter03/MyMessenger/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter03/MyMessenger/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter03/MyMessenger/settings.gradle
================================================
include ':app'


================================================
FILE: chapter04/Stopwatch/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter04/Stopwatch/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter04/Stopwatch/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter04/Stopwatch/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter04/Stopwatch/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter04/Stopwatch/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter04/Stopwatch/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/Stopwatch.iml" filepath="$PROJECT_DIR$/Stopwatch.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter04/Stopwatch/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter04/Stopwatch/app/.gitignore
================================================
/build


================================================
FILE: chapter04/Stopwatch/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.stopwatch"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter04/Stopwatch/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter04/Stopwatch/app/src/androidTest/java/com/hfad/stopwatch/ExampleInstrumentedTest.java
================================================
package com.hfad.stopwatch;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.stopwatch", appContext.getPackageName());
    }
}


================================================
FILE: chapter04/Stopwatch/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.stopwatch">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".StopwatchActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: chapter04/Stopwatch/app/src/main/java/com/hfad/stopwatch/StopwatchActivity.java
================================================
package com.hfad.stopwatch;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;

import java.util.Locale;

public class StopwatchActivity extends Activity {
    private int seconds = 0;
    private boolean running;
    private boolean wasRunning;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stopwatch);
        if (savedInstanceState != null) {
            seconds = savedInstanceState.getInt("seconds");
            running = savedInstanceState.getBoolean("running");
            wasRunning = savedInstanceState.getBoolean("wasRunning");
        }
        runTimer();
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putInt("seconds", seconds);
        savedInstanceState.putBoolean("running", running);
        savedInstanceState.putBoolean("wasRunning", wasRunning);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (wasRunning) {
            running = true;
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        wasRunning = running;
        running = false;
    }

    //Start the stopwatch running when the Start button is clicked.
    public void onClickStart(View view) {
        running = true;
    }

    //Stop the stopwatch running when the Stop button is clicked.
    public void onClickStop(View view) {
        running = false;
    }

    //Reset the stopwatch when the Reset button is clicked.
    public void onClickReset(View view) {
        running = false;
        seconds = 0;
    }

    //Sets the number of seconds on the timer.
    private void runTimer() {
        final TextView timeView = (TextView)findViewById(R.id.time_view);
        final Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
                int hours = seconds/3600;
                int minutes = (seconds%3600)/60;
                int secs = seconds%60;
                String time = String.format(Locale.getDefault(),
                        "%d:%02d:%02d", hours, minutes, secs);
                timeView.setText(time);
                if (running) {
                    seconds++;
                }
                handler.postDelayed(this, 1000);
            }
        });
    }
}


================================================
FILE: chapter04/Stopwatch/app/src/main/res/layout/activity_stopwatch.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".StopwatchActivity"
    >
    <TextView
        android:id="@+id/time_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textAppearance="@android:style/TextAppearance.Large"
        android:textSize="56sp"
        />
    <Button
        android:id="@+id/start_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:onClick="onClickStart"
        android:text="@string/start"
        />
    <Button
        android:id="@+id/stop_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="8dp"
        android:onClick="onClickStop"
        android:text="@string/stop"
        />
    <Button
        android:id="@+id/reset_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="8dp"
        android:onClick="onClickReset"
        android:text="@string/reset"
        />
</LinearLayout>

================================================
FILE: chapter04/Stopwatch/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter04/Stopwatch/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">Stopwatch</string>
    <string name="start">Start</string>
    <string name="stop">Stop</string>
    <string name="reset">Reset</string>
</resources>


================================================
FILE: chapter04/Stopwatch/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter04/Stopwatch/app/src/test/java/com/hfad/stopwatch/ExampleUnitTest.java
================================================
package com.hfad.stopwatch;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter04/Stopwatch/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter04/Stopwatch/gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Apr 30 09:54:53 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter04/Stopwatch/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter04/Stopwatch/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter04/Stopwatch/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter04/Stopwatch/settings.gradle
================================================
include ':app'


================================================
FILE: chapter05/Duck/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter05/Duck/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter05/Duck/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter05/Duck/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter05/Duck/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter05/Duck/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter05/Duck/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/Duck.iml" filepath="$PROJECT_DIR$/Duck.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter05/Duck/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter05/Duck/app/.gitignore
================================================
/build


================================================
FILE: chapter05/Duck/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.duck"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter05/Duck/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter05/Duck/app/src/androidTest/java/com/hfad/duck/ExampleInstrumentedTest.java
================================================
package com.hfad.duck;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.duck", appContext.getPackageName());
    }
}


================================================
FILE: chapter05/Duck/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.duck">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: chapter05/Duck/app/src/main/java/com/hfad/duck/MainActivity.java
================================================
package com.hfad.duck;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


================================================
FILE: chapter05/Duck/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.hfad.duck.MainActivity"
    >
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        android:src="@drawable/duck"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="bottom|end"
        android:gravity="end"
        android:padding="16dp"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="It's a duck!"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="(not a real one)"
            />
    </LinearLayout>
</FrameLayout>

================================================
FILE: chapter05/Duck/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter05/Duck/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">Duck</string>
</resources>


================================================
FILE: chapter05/Duck/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter05/Duck/app/src/test/java/com/hfad/duck/ExampleUnitTest.java
================================================
package com.hfad.duck;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter05/Duck/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter05/Duck/gradle/wrapper/gradle-wrapper.properties
================================================
#Tue May 09 20:08:29 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter05/Duck/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter05/Duck/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter05/Duck/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter05/Duck/settings.gradle
================================================
include ':app'


================================================
FILE: chapter05/LinearLayoutExample/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter05/LinearLayoutExample/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter05/LinearLayoutExample/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter05/LinearLayoutExample/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter05/LinearLayoutExample/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter05/LinearLayoutExample/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter05/LinearLayoutExample/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/LinearLayoutExample.iml" filepath="$PROJECT_DIR$/LinearLayoutExample.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter05/LinearLayoutExample/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter05/LinearLayoutExample/app/.gitignore
================================================
/build


================================================
FILE: chapter05/LinearLayoutExample/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.linearlayoutexample"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter05/LinearLayoutExample/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter05/LinearLayoutExample/app/src/androidTest/java/com/hfad/linearlayoutexample/ExampleInstrumentedTest.java
================================================
package com.hfad.linearlayoutexample;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.linearlayoutexample", appContext.getPackageName());
    }
}


================================================
FILE: chapter05/LinearLayoutExample/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.linearlayoutexample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: chapter05/LinearLayoutExample/app/src/main/java/com/hfad/linearlayoutexample/MainActivity.java
================================================
package com.hfad.linearlayoutexample;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


================================================
FILE: chapter05/LinearLayoutExample/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.hfad.linearlayoutexample.MainActivity"
    >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/to"
        />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="top"
        android:hint="@string/message"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:text="@string/send"
        />
</LinearLayout>

================================================
FILE: chapter05/LinearLayoutExample/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter05/LinearLayoutExample/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">LinearLayout Example</string>
    <string name="to">To</string>
    <string name="message">Message</string>
    <string name="send">Send</string>
</resources>


================================================
FILE: chapter05/LinearLayoutExample/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter05/LinearLayoutExample/app/src/test/java/com/hfad/linearlayoutexample/ExampleUnitTest.java
================================================
package com.hfad.linearlayoutexample;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter05/LinearLayoutExample/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter05/LinearLayoutExample/gradle/wrapper/gradle-wrapper.properties
================================================
#Tue May 09 20:24:47 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter05/LinearLayoutExample/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter05/LinearLayoutExample/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter05/LinearLayoutExample/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter05/LinearLayoutExample/settings.gradle
================================================
include ':app'


================================================
FILE: chapter06/MyConstraintLayout/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter06/MyConstraintLayout/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter06/MyConstraintLayout/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter06/MyConstraintLayout/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter06/MyConstraintLayout/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter06/MyConstraintLayout/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter06/MyConstraintLayout/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/MyConstraintLayout.iml" filepath="$PROJECT_DIR$/MyConstraintLayout.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter06/MyConstraintLayout/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter06/MyConstraintLayout/app/.gitignore
================================================
/build


================================================
FILE: chapter06/MyConstraintLayout/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.myconstraintlayout"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter06/MyConstraintLayout/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter06/MyConstraintLayout/app/src/androidTest/java/com/hfad/myconstraintlayout/ExampleInstrumentedTest.java
================================================
package com.hfad.myconstraintlayout;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.myconstraintlayout", appContext.getPackageName());
    }
}


================================================
FILE: chapter06/MyConstraintLayout/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.myconstraintlayout">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: chapter06/MyConstraintLayout/app/src/main/java/com/hfad/myconstraintlayout/MainActivity.java
================================================
package com.hfad.myconstraintlayout;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


================================================
FILE: chapter06/MyConstraintLayout/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hfad.myconstraintlayout.MainActivity"
    >

    <TextView
        android:id="@+id/to_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="25dp"
        android:text="@string/to_label"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintTop_creator="1" />

    <EditText
        android:id="@+id/email_address"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginStart="17dp"
        android:layout_marginTop="16dp"
        android:ems="10"
        android:hint="@string/email_hint"
        android:inputType="textEmailAddress"
        app:layout_constraintLeft_toRightOf="@+id/to_label"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintTop_creator="1" />

    <EditText
        android:id="@+id/subject"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="11dp"
        android:layout_marginStart="11dp"
        android:layout_marginTop="16dp"
        android:ems="10"
        android:hint="@string/subject_hint"
        android:inputType="textPersonName"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/email_address"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintTop_creator="1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintBottom_creator="1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_constraintLeft_creator="1"
        android:layout_marginBottom="19dp"
        app:layout_constraintLeft_toLeftOf="parent" />

    <EditText
        android:id="@+id/message"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="60dp"
        android:layout_marginEnd="11dp"
        android:layout_marginStart="11dp"
        android:layout_marginTop="55dp"
        android:ems="10"
        android:gravity="top"
        android:hint="@string/message_hint"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="@+id/button2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@+id/subject"
        tools:layout_constraintBottom_creator="1"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintTop_creator="1" />
</android.support.constraint.ConstraintLayout>

================================================
FILE: chapter06/MyConstraintLayout/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter06/MyConstraintLayout/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">My Constraint Layout</string>
    <string name="to_label">To:</string>
    <string name="email_hint">Enter email address</string>
    <string name="subject_hint">Subject</string>
    <string name="message_hint">Message</string>
    <string name="send_button">Send</string>
</resources>


================================================
FILE: chapter06/MyConstraintLayout/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter06/MyConstraintLayout/app/src/test/java/com/hfad/myconstraintlayout/ExampleUnitTest.java
================================================
package com.hfad.myconstraintlayout;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter06/MyConstraintLayout/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter06/MyConstraintLayout/gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Apr 30 10:26:15 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter06/MyConstraintLayout/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter06/MyConstraintLayout/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter06/MyConstraintLayout/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: chapter06/MyConstraintLayout/settings.gradle
================================================
include ':app'


================================================
FILE: chapter07/Starbuzz/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: chapter07/Starbuzz/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: chapter07/Starbuzz/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: chapter07/Starbuzz/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: chapter07/Starbuzz/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: chapter07/Starbuzz/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: chapter07/Starbuzz/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/Starbuzz.iml" filepath="$PROJECT_DIR$/Starbuzz.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: chapter07/Starbuzz/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: chapter07/Starbuzz/app/.gitignore
================================================
/build


================================================
FILE: chapter07/Starbuzz/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.hfad.starbuzz"
        minSdkVersion 19
        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 fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}


================================================
FILE: chapter07/Starbuzz/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/davidg/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: chapter07/Starbuzz/app/src/androidTest/java/com/hfad/starbuzz/ExampleInstrumentedTest.java
================================================
package com.hfad.starbuzz;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.hfad.starbuzz", appContext.getPackageName());
    }
}


================================================
FILE: chapter07/Starbuzz/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hfad.starbuzz">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".TopLevelActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DrinkCategoryActivity" />
        <activity android:name=".DrinkActivity"></activity>
    </application>

</manifest>

================================================
FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/Drink.java
================================================
package com.hfad.starbuzz;

/**
 * Created by davidg on 30/04/2017.
 */

public class Drink {
    private String name; private String description; private int imageResourceId;
    //drinks is an array of Drinks
    public static final Drink[] drinks = {
            new Drink("Latte", "A couple of espresso shots with steamed milk", R.drawable.latte),
            new Drink("Cappuccino", "Espresso, hot milk, and a steamed milk foam", R.drawable.cappuccino),
            new Drink("Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter)
    };

    //Each Drink has a name, description, and an image resource
    private Drink(String name, String description, int imageResourceId) {
        this.name = name;
        this.description = description;
        this.imageResourceId = imageResourceId;
    }

    public String getDescription() {
        return description;
    }

    public String getName() {
        return name;
    }

    public int getImageResourceId() {
        return imageResourceId;
    }

    public String toString() {
        return this.name;
    }
}


================================================
FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkActivity.java
================================================
package com.hfad.starbuzz;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class DrinkActivity extends Activity {
    public static final String EXTRA_DRINKID = "drinkId";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink);

        //Get the drink from the intent
        int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
        Drink drink = Drink.drinks[drinkId];

        //Populate the drink name
        TextView name = (TextView)findViewById(R.id.name);
        name.setText(drink.getName());

        //Populate the drink description
        TextView description = (TextView)findViewById(R.id.description);
        description.setText(drink.getDescription());

        //Populate the drink image
        ImageView photo = (ImageView)findViewById(R.id.photo);
        photo.setImageResource(drink.getImageResourceId());
        photo.setContentDescription(drink.getName());
    }
}


================================================
FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkCategoryActivity.java
================================================
package com.hfad.starbuzz;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class DrinkCategoryActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink_category);
        ArrayAdapter<Drink> listAdapter = new ArrayAdapter<>(
                this, android.R.layout.simple_list_item_1, Drink.drinks);
        ListView listDrinks = (ListView) findViewById(R.id.list_drinks);
        listDrinks.setAdapter(listAdapter);

        //Create the listener
        AdapterView.OnItemClickListener itemClickListener =
                new AdapterView.OnItemClickListener(){
                    @Override
                    public void onItemClick(AdapterView<?> listDrinks,
                                            View itemView,
                                            int position,
                                            long id) {
                        //Pass the drink the user clicks on to DrinkActivity
                        Intent intent = new Intent(DrinkCategoryActivity.this,
                                DrinkActivity.class);
                        intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int) id);
                        startActivity(intent);
                    }
                };

        //Assign the listener to the list view
        listDrinks.setOnItemClickListener(itemClickListener);
    }
}


================================================
FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/TopLevelActivity.java
================================================
package com.hfad.starbuzz;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class TopLevelActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top_level);
        //Create an OnItemClickListener
        AdapterView.OnItemClickListener itemClickListener =
                new AdapterView.OnItemClickListener(){
                    @Override
                    public void onItemClick(AdapterView<?> listView,
                                            View itemView,
                                            int position,
                                            long id) {
                        if (position == 0) {
                            Intent intent = new Intent(TopLevelActivity.this,
                                    DrinkCategoryActivity.class);
                            startActivity(intent);
                        }
                    }
                };
        //Add the listener to the list view
        ListView listView = (ListView) findViewById(R.id.list_options);
        listView.setOnItemClickListener(itemClickListener);
    }
}


================================================
FILE: chapter07/Starbuzz/app/src/main/res/layout/activity_drink.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hfad.starbuzz.DrinkActivity"
    >
    <ImageView
        android:id="@+id/photo"
        android:layout_width="190dp"
        android:layout_height="190dp"
        />
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

================================================
FILE: chapter07/Starbuzz/app/src/main/res/layout/activity_drink_category.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hfad.starbuzz.DrinkCategoryActivity"
    >
    <ListView
        android:id="@+id/list_drinks"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

================================================
FILE: chapter07/Starbuzz/app/src/main/res/layout/activity_top_level.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hfad.starbuzz.TopLevelActivity"
    >

    <ImageView
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:src="@drawable/starbuzz_logo"
        android:contentDescription="@string/starbuzz_logo"
        />

    <ListView
        android:id="@+id/list_options"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/options"
        />
</LinearLayout>

================================================
FILE: chapter07/Starbuzz/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: chapter07/Starbuzz/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">Starbuzz</string>
    <string name="starbuzz_logo">Starbuzz logo</string>
    <string-array name="options">
        <item>Drinks</item>
        <item>Food</item>
        <item>Stores</item>
    </string-array>
</resources>


================================================
FILE: chapter07/Starbuzz/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: chapter07/Starbuzz/app/src/test/java/com/hfad/starbuzz/ExampleUnitTest.java
================================================
package com.hfad.starbuzz;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: chapter07/Starbuzz/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: chapter07/Starbuzz/gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Apr 30 11:03:08 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip


================================================
FILE: chapter07/Starbuzz/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: chapter07/Starbuzz/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: chapter07/Starbuzz/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIR
Download .txt
gitextract_7f53uovh/

├── README.org
├── chapter01/
│   └── MyFirstApp/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── myfirstapp/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── myfirstapp/
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── myfirstapp/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter02/
│   └── BeerAdviser/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── beeradviser/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── beeradviser/
│       │       │   │               ├── BeerExpert.java
│       │       │   │               └── FindBeerActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_find_beer.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── beeradviser/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter03/
│   └── MyMessenger/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── mymessenger/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── mymessenger/
│       │       │   │               ├── CreateMessageActivity.java
│       │       │   │               └── ReceiveMessageActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_create_message.xml
│       │       │       │   └── activity_receive_message.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── mymessenger/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter04/
│   └── Stopwatch/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── stopwatch/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── stopwatch/
│       │       │   │               └── StopwatchActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_stopwatch.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── stopwatch/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter05/
│   ├── Duck/
│   │   ├── .gitignore
│   │   ├── .idea/
│   │   │   ├── compiler.xml
│   │   │   ├── copyright/
│   │   │   │   └── profiles_settings.xml
│   │   │   ├── encodings.xml
│   │   │   ├── gradle.xml
│   │   │   ├── misc.xml
│   │   │   ├── modules.xml
│   │   │   └── runConfigurations.xml
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── androidTest/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── hfad/
│   │   │       │               └── duck/
│   │   │       │                   └── ExampleInstrumentedTest.java
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── java/
│   │   │       │   │   └── com/
│   │   │       │   │       └── hfad/
│   │   │       │   │           └── duck/
│   │   │       │   │               └── MainActivity.java
│   │   │       │   └── res/
│   │   │       │       ├── layout/
│   │   │       │       │   └── activity_main.xml
│   │   │       │       └── values/
│   │   │       │           ├── colors.xml
│   │   │       │           ├── strings.xml
│   │   │       │           └── styles.xml
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── hfad/
│   │   │                       └── duck/
│   │   │                           └── ExampleUnitTest.java
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   └── LinearLayoutExample/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── linearlayoutexample/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── linearlayoutexample/
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── linearlayoutexample/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter06/
│   └── MyConstraintLayout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── myconstraintlayout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── myconstraintlayout/
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── myconstraintlayout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter07/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter08/
│   └── BitsandPizzas/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── bitsandpizzas/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── bitsandpizzas/
│       │       │   │               ├── MainActivity.java
│       │       │   │               └── OrderActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_order.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── bitsandpizzas/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter09/
│   └── Workout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── workout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── workout/
│       │       │   │               ├── DetailActivity.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── Workout.java
│       │       │   │               ├── WorkoutDetailFragment.java
│       │       │   │               └── WorkoutListFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_detail.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   └── fragment_workout_detail.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── workout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter10/
│   └── Workout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── workout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── workout/
│       │       │   │               ├── DetailActivity.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── Workout.java
│       │       │   │               ├── WorkoutDetailFragment.java
│       │       │   │               └── WorkoutListFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_detail.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   └── fragment_workout_detail.xml
│       │       │       ├── layout-large/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── workout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter11/
│   └── Workout/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── workout/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── workout/
│       │       │   │               ├── DetailActivity.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── StopwatchFragment.java
│       │       │   │               ├── TempActivity.java
│       │       │   │               ├── Workout.java
│       │       │   │               ├── WorkoutDetailFragment.java
│       │       │   │               └── WorkoutListFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_detail.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_temp.xml
│       │       │       │   ├── fragment_stopwatch.xml
│       │       │       │   └── fragment_workout_detail.xml
│       │       │       ├── layout-large/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── workout/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter12/
│   └── BitsandPizzas/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── bitsandpizzas/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── bitsandpizzas/
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── OrderActivity.java
│       │       │   │               ├── PastaFragment.java
│       │       │   │               ├── PizzaFragment.java
│       │       │   │               ├── StoresFragment.java
│       │       │   │               └── TopFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_order.xml
│       │       │       │   ├── fragment_top.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── bitsandpizzas/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter13/
│   └── BitsandPizzas/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── bitsandpizzas/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── bitsandpizzas/
│       │       │   │               ├── CaptionedImagesAdapter.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── OrderActivity.java
│       │       │   │               ├── PastaFragment.java
│       │       │   │               ├── Pizza.java
│       │       │   │               ├── PizzaDetailActivity.java
│       │       │   │               ├── PizzaFragment.java
│       │       │   │               ├── StoresFragment.java
│       │       │   │               └── TopFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── activity_order.xml
│       │       │       │   ├── activity_pizza_detail.xml
│       │       │       │   ├── card_captioned_image.xml
│       │       │       │   ├── fragment_pizza.xml
│       │       │       │   ├── fragment_top.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── bitsandpizzas/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter14/
│   └── CatChat/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── catchat/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── catchat/
│       │       │   │               ├── DraftsFragment.java
│       │       │   │               ├── FeedbackActivity.java
│       │       │   │               ├── HelpActivity.java
│       │       │   │               ├── InboxFragment.java
│       │       │   │               ├── MainActivity.java
│       │       │   │               ├── SentItemsFragment.java
│       │       │   │               └── TrashFragment.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_feedback.xml
│       │       │       │   ├── activity_help.xml
│       │       │       │   ├── activity_main.xml
│       │       │       │   ├── fragment_drafts.xml
│       │       │       │   ├── fragment_inbox.xml
│       │       │       │   ├── fragment_sent_items.xml
│       │       │       │   ├── fragment_trash.xml
│       │       │       │   ├── nav_header.xml
│       │       │       │   └── toolbar_main.xml
│       │       │       ├── menu/
│       │       │       │   └── menu_nav.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── catchat/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter15/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               ├── StarbuzzDatabaseHelper.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter16/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               ├── StarbuzzDatabaseHelper.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter17/
│   └── Starbuzz/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── starbuzz/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── starbuzz/
│       │       │   │               ├── Drink.java
│       │       │   │               ├── DrinkActivity.java
│       │       │   │               ├── DrinkCategoryActivity.java
│       │       │   │               ├── StarbuzzDatabaseHelper.java
│       │       │   │               └── TopLevelActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   ├── activity_drink.xml
│       │       │       │   ├── activity_drink_category.xml
│       │       │       │   └── activity_top_level.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── starbuzz/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
├── chapter18/
│   └── Joke/
│       ├── .gitignore
│       ├── .idea/
│       │   ├── compiler.xml
│       │   ├── copyright/
│       │   │   └── profiles_settings.xml
│       │   ├── encodings.xml
│       │   ├── gradle.xml
│       │   ├── misc.xml
│       │   ├── modules.xml
│       │   └── runConfigurations.xml
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── hfad/
│       │       │               └── joke/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── hfad/
│       │       │   │           └── joke/
│       │       │   │               ├── DelayedMessageService.java
│       │       │   │               └── MainActivity.java
│       │       │   └── res/
│       │       │       ├── layout/
│       │       │       │   └── activity_main.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── strings.xml
│       │       │           └── styles.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── hfad/
│       │                       └── joke/
│       │                           └── ExampleUnitTest.java
│       ├── build.gradle
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       └── settings.gradle
└── chapter19/
    └── Odometer/
        ├── .gitignore
        ├── .idea/
        │   ├── compiler.xml
        │   ├── copyright/
        │   │   └── profiles_settings.xml
        │   ├── encodings.xml
        │   ├── gradle.xml
        │   ├── misc.xml
        │   ├── modules.xml
        │   └── runConfigurations.xml
        ├── app/
        │   ├── .gitignore
        │   ├── build.gradle
        │   ├── proguard-rules.pro
        │   └── src/
        │       ├── androidTest/
        │       │   └── java/
        │       │       └── com/
        │       │           └── hfad/
        │       │               └── odometer/
        │       │                   └── ExampleInstrumentedTest.java
        │       ├── main/
        │       │   ├── AndroidManifest.xml
        │       │   ├── java/
        │       │   │   └── com/
        │       │   │       └── hfad/
        │       │   │           └── odometer/
        │       │   │               ├── MainActivity.java
        │       │   │               └── OdometerService.java
        │       │   └── res/
        │       │       ├── layout/
        │       │       │   └── activity_main.xml
        │       │       └── values/
        │       │           ├── colors.xml
        │       │           ├── strings.xml
        │       │           └── styles.xml
        │       └── test/
        │           └── java/
        │               └── com/
        │                   └── hfad/
        │                       └── odometer/
        │                           └── ExampleUnitTest.java
        ├── build.gradle
        ├── gradle/
        │   └── wrapper/
        │       ├── gradle-wrapper.jar
        │       └── gradle-wrapper.properties
        ├── gradle.properties
        ├── gradlew
        ├── gradlew.bat
        └── settings.gradle
Download .txt
SYMBOL INDEX (364 symbols across 113 files)

FILE: chapter01/MyFirstApp/app/src/androidTest/java/com/hfad/myfirstapp/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter01/MyFirstApp/app/src/main/java/com/hfad/myfirstapp/MainActivity.java
  class MainActivity (line 6) | public class MainActivity extends Activity {
    method onCreate (line 8) | @Override

FILE: chapter01/MyFirstApp/app/src/test/java/com/hfad/myfirstapp/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter02/BeerAdviser/app/src/androidTest/java/com/hfad/beeradviser/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter02/BeerAdviser/app/src/main/java/com/hfad/beeradviser/BeerExpert.java
  class BeerExpert (line 10) | public class BeerExpert {
    method getBrands (line 11) | List<String> getBrands(String color) {

FILE: chapter02/BeerAdviser/app/src/main/java/com/hfad/beeradviser/FindBeerActivity.java
  class FindBeerActivity (line 11) | public class FindBeerActivity extends Activity {
    method onCreate (line 14) | @Override
    method onClickFindBeer (line 21) | public void onClickFindBeer(View view) {

FILE: chapter02/BeerAdviser/app/src/test/java/com/hfad/beeradviser/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter03/MyMessenger/app/src/androidTest/java/com/hfad/mymessenger/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter03/MyMessenger/app/src/main/java/com/hfad/mymessenger/CreateMessageActivity.java
  class CreateMessageActivity (line 9) | public class CreateMessageActivity extends Activity {
    method onCreate (line 11) | @Override
    method onSendMessage (line 18) | public void onSendMessage(View view) {

FILE: chapter03/MyMessenger/app/src/main/java/com/hfad/mymessenger/ReceiveMessageActivity.java
  class ReceiveMessageActivity (line 8) | public class ReceiveMessageActivity extends Activity {
    method onCreate (line 11) | @Override

FILE: chapter03/MyMessenger/app/src/test/java/com/hfad/mymessenger/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter04/Stopwatch/app/src/androidTest/java/com/hfad/stopwatch/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter04/Stopwatch/app/src/main/java/com/hfad/stopwatch/StopwatchActivity.java
  class StopwatchActivity (line 11) | public class StopwatchActivity extends Activity {
    method onCreate (line 16) | @Override
    method onSaveInstanceState (line 28) | @Override
    method onResume (line 35) | @Override
    method onPause (line 43) | @Override
    method onClickStart (line 51) | public void onClickStart(View view) {
    method onClickStop (line 56) | public void onClickStop(View view) {
    method onClickReset (line 61) | public void onClickReset(View view) {
    method runTimer (line 67) | private void runTimer() {

FILE: chapter04/Stopwatch/app/src/test/java/com/hfad/stopwatch/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter05/Duck/app/src/androidTest/java/com/hfad/duck/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter05/Duck/app/src/main/java/com/hfad/duck/MainActivity.java
  class MainActivity (line 6) | public class MainActivity extends Activity {
    method onCreate (line 8) | @Override

FILE: chapter05/Duck/app/src/test/java/com/hfad/duck/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter05/LinearLayoutExample/app/src/androidTest/java/com/hfad/linearlayoutexample/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter05/LinearLayoutExample/app/src/main/java/com/hfad/linearlayoutexample/MainActivity.java
  class MainActivity (line 6) | public class MainActivity extends Activity {
    method onCreate (line 8) | @Override

FILE: chapter05/LinearLayoutExample/app/src/test/java/com/hfad/linearlayoutexample/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter06/MyConstraintLayout/app/src/androidTest/java/com/hfad/myconstraintlayout/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter06/MyConstraintLayout/app/src/main/java/com/hfad/myconstraintlayout/MainActivity.java
  class MainActivity (line 6) | public class MainActivity extends Activity {
    method onCreate (line 8) | @Override

FILE: chapter06/MyConstraintLayout/app/src/test/java/com/hfad/myconstraintlayout/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter07/Starbuzz/app/src/androidTest/java/com/hfad/starbuzz/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/Drink.java
  class Drink (line 7) | public class Drink {
    method Drink (line 17) | private Drink(String name, String description, int imageResourceId) {
    method getDescription (line 23) | public String getDescription() {
    method getName (line 27) | public String getName() {
    method getImageResourceId (line 31) | public int getImageResourceId() {
    method toString (line 35) | public String toString() {

FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkActivity.java
  class DrinkActivity (line 8) | public class DrinkActivity extends Activity {
    method onCreate (line 11) | @Override

FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkCategoryActivity.java
  class DrinkCategoryActivity (line 11) | public class DrinkCategoryActivity extends Activity {
    method onCreate (line 13) | @Override

FILE: chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/TopLevelActivity.java
  class TopLevelActivity (line 10) | public class TopLevelActivity extends Activity {
    method onCreate (line 12) | @Override

FILE: chapter07/Starbuzz/app/src/test/java/com/hfad/starbuzz/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter08/BitsandPizzas/app/src/androidTest/java/com/hfad/bitsandpizzas/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter08/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/MainActivity.java
  class MainActivity (line 12) | public class MainActivity extends AppCompatActivity {
    method onCreate (line 15) | @Override
    method onCreateOptionsMenu (line 23) | @Override
    method setShareActionIntent (line 34) | private void setShareActionIntent(String text) {
    method onOptionsItemSelected (line 41) | @Override

FILE: chapter08/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/OrderActivity.java
  class OrderActivity (line 8) | public class OrderActivity extends AppCompatActivity {
    method onCreate (line 10) | @Override

FILE: chapter08/BitsandPizzas/app/src/test/java/com/hfad/bitsandpizzas/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter09/Workout/app/src/androidTest/java/com/hfad/workout/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter09/Workout/app/src/main/java/com/hfad/workout/DetailActivity.java
  class DetailActivity (line 6) | public class DetailActivity extends AppCompatActivity {
    method onCreate (line 9) | @Override

FILE: chapter09/Workout/app/src/main/java/com/hfad/workout/MainActivity.java
  class MainActivity (line 8) | public class MainActivity extends AppCompatActivity implements WorkoutLi...
    method onCreate (line 10) | @Override
    method itemClicked (line 16) | @Override

FILE: chapter09/Workout/app/src/main/java/com/hfad/workout/Workout.java
  class Workout (line 7) | public class Workout {
    method Workout (line 23) | private Workout(String name, String description) {
    method getDescription (line 28) | public String getDescription() {
    method getName (line 32) | public String getName() {
    method toString (line 36) | public String toString() {

FILE: chapter09/Workout/app/src/main/java/com/hfad/workout/WorkoutDetailFragment.java
  class WorkoutDetailFragment (line 15) | public class WorkoutDetailFragment extends Fragment {
    method onCreateView (line 18) | @Override
    method onStart (line 24) | @Override
    method setWorkout (line 37) | public void setWorkout(long id) {

FILE: chapter09/Workout/app/src/main/java/com/hfad/workout/WorkoutListFragment.java
  class WorkoutListFragment (line 17) | public class WorkoutListFragment extends ListFragment {
    type Listener (line 18) | static interface Listener {
      method itemClicked (line 19) | void itemClicked(long id);
    method onCreateView (line 24) | @Override
    method onAttach (line 39) | @Override
    method onListItemClick (line 45) | @Override

FILE: chapter09/Workout/app/src/test/java/com/hfad/workout/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter10/Workout/app/src/androidTest/java/com/hfad/workout/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter10/Workout/app/src/main/java/com/hfad/workout/DetailActivity.java
  class DetailActivity (line 6) | public class DetailActivity extends AppCompatActivity {
    method onCreate (line 9) | @Override

FILE: chapter10/Workout/app/src/main/java/com/hfad/workout/MainActivity.java
  class MainActivity (line 9) | public class MainActivity extends AppCompatActivity implements WorkoutLi...
    method onCreate (line 11) | @Override
    method itemClicked (line 17) | @Override

FILE: chapter10/Workout/app/src/main/java/com/hfad/workout/Workout.java
  class Workout (line 7) | public class Workout {
    method Workout (line 23) | private Workout(String name, String description) {
    method getDescription (line 28) | public String getDescription() {
    method getName (line 32) | public String getName() {
    method toString (line 36) | public String toString() {

FILE: chapter10/Workout/app/src/main/java/com/hfad/workout/WorkoutDetailFragment.java
  class WorkoutDetailFragment (line 15) | public class WorkoutDetailFragment extends Fragment {
    method onCreate (line 18) | @Override
    method onCreateView (line 26) | @Override
    method onStart (line 32) | @Override
    method onSaveInstanceState (line 45) | @Override
    method setWorkout (line 50) | public void setWorkout(long id) {

FILE: chapter10/Workout/app/src/main/java/com/hfad/workout/WorkoutListFragment.java
  class WorkoutListFragment (line 17) | public class WorkoutListFragment extends ListFragment {
    type Listener (line 18) | static interface Listener {
      method itemClicked (line 19) | void itemClicked(long id);
    method onCreateView (line 24) | @Override
    method onAttach (line 39) | @Override
    method onListItemClick (line 45) | @Override

FILE: chapter10/Workout/app/src/test/java/com/hfad/workout/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter11/Workout/app/src/androidTest/java/com/hfad/workout/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/DetailActivity.java
  class DetailActivity (line 6) | public class DetailActivity extends AppCompatActivity {
    method onCreate (line 9) | @Override

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/MainActivity.java
  class MainActivity (line 9) | public class MainActivity extends AppCompatActivity implements WorkoutLi...
    method onCreate (line 11) | @Override
    method itemClicked (line 17) | @Override

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/StopwatchFragment.java
  class StopwatchFragment (line 19) | public class StopwatchFragment extends Fragment implements View.OnClickL...
    method onCreate (line 26) | @Override
    method onCreateView (line 36) | @Override
    method onClick (line 50) | @Override
    method onPause (line 65) | @Override
    method onResume (line 72) | @Override
    method onSaveInstanceState (line 80) | @Override
    method onClickStart (line 87) | private void onClickStart() {
    method onClickStop (line 91) | private void onClickStop() {
    method onClickReset (line 95) | private void onClickReset() {
    method runTimer (line 100) | private void runTimer(View view) {

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/TempActivity.java
  class TempActivity (line 7) | public class TempActivity extends AppCompatActivity {
    method onCreate (line 9) | @Override

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/Workout.java
  class Workout (line 7) | public class Workout {
    method Workout (line 23) | private Workout(String name, String description) {
    method getDescription (line 28) | public String getDescription() {
    method getName (line 32) | public String getName() {
    method toString (line 36) | public String toString() {

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/WorkoutDetailFragment.java
  class WorkoutDetailFragment (line 16) | public class WorkoutDetailFragment extends Fragment {
    method onCreate (line 19) | @Override
    method onCreateView (line 34) | @Override
    method onStart (line 40) | @Override
    method onSaveInstanceState (line 53) | @Override
    method setWorkout (line 58) | public void setWorkout(long id) {

FILE: chapter11/Workout/app/src/main/java/com/hfad/workout/WorkoutListFragment.java
  class WorkoutListFragment (line 17) | public class WorkoutListFragment extends ListFragment {
    type Listener (line 18) | static interface Listener {
      method itemClicked (line 19) | void itemClicked(long id);
    method onCreateView (line 24) | @Override
    method onAttach (line 39) | @Override
    method onListItemClick (line 45) | @Override

FILE: chapter11/Workout/app/src/test/java/com/hfad/workout/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter12/BitsandPizzas/app/src/androidTest/java/com/hfad/bitsandpizzas/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter12/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/MainActivity.java
  class MainActivity (line 17) | public class MainActivity extends AppCompatActivity {
    method onCreate (line 20) | @Override
    method onCreateOptionsMenu (line 38) | @Override
    method setShareActionIntent (line 49) | private void setShareActionIntent(String text) {
    method onOptionsItemSelected (line 56) | @Override
    class SectionsPagerAdapter (line 68) | private class SectionsPagerAdapter extends FragmentPagerAdapter {
      method SectionsPagerAdapter (line 69) | public SectionsPagerAdapter(FragmentManager fm) {
      method getCount (line 73) | @Override
      method getItem (line 78) | @Override
      method getPageTitle (line 93) | @Override

FILE: chapter12/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/OrderActivity.java
  class OrderActivity (line 11) | public class OrderActivity extends AppCompatActivity {
    method onCreate (line 13) | @Override
    method onClickDone (line 23) | public void onClickDone(View view) {

FILE: chapter12/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/PastaFragment.java
  class PastaFragment (line 16) | public class PastaFragment extends ListFragment {
    method onCreateView (line 17) | @Override

FILE: chapter12/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/PizzaFragment.java
  class PizzaFragment (line 16) | public class PizzaFragment extends ListFragment {
    method onCreateView (line 17) | @Override

FILE: chapter12/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/StoresFragment.java
  class StoresFragment (line 16) | public class StoresFragment extends ListFragment {
    method onCreateView (line 17) | @Override

FILE: chapter12/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/TopFragment.java
  class TopFragment (line 18) | public class TopFragment extends Fragment {
    method onCreateView (line 19) | @Override

FILE: chapter12/BitsandPizzas/app/src/test/java/com/hfad/bitsandpizzas/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter13/BitsandPizzas/app/src/androidTest/java/com/hfad/bitsandpizzas/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/CaptionedImagesAdapter.java
  class CaptionedImagesAdapter (line 17) | class CaptionedImagesAdapter extends RecyclerView.Adapter<CaptionedImage...
    type Listener (line 23) | interface Listener {
      method onClick (line 24) | void onClick(int position);
    class ViewHolder (line 27) | public static class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 30) | public ViewHolder(CardView v) {
    method CaptionedImagesAdapter (line 36) | public CaptionedImagesAdapter(String[] captions, int[] imageIds) {
    method getItemCount (line 41) | @Override
    method setListener (line 46) | public void setListener(Listener listener){
    method onCreateViewHolder (line 50) | @Override
    method onBindViewHolder (line 58) | @Override

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/MainActivity.java
  class MainActivity (line 17) | public class MainActivity extends AppCompatActivity {
    method onCreate (line 20) | @Override
    method onCreateOptionsMenu (line 38) | @Override
    method setShareActionIntent (line 49) | private void setShareActionIntent(String text) {
    method onOptionsItemSelected (line 56) | @Override
    class SectionsPagerAdapter (line 68) | private class SectionsPagerAdapter extends FragmentPagerAdapter {
      method SectionsPagerAdapter (line 69) | public SectionsPagerAdapter(FragmentManager fm) {
      method getCount (line 73) | @Override
      method getItem (line 78) | @Override
      method getPageTitle (line 93) | @Override

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/OrderActivity.java
  class OrderActivity (line 11) | public class OrderActivity extends AppCompatActivity {
    method onCreate (line 13) | @Override
    method onClickDone (line 23) | public void onClickDone(View view) {

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/PastaFragment.java
  class PastaFragment (line 16) | public class PastaFragment extends ListFragment {
    method onCreateView (line 17) | @Override

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/Pizza.java
  class Pizza (line 7) | public class Pizza {
    method Pizza (line 16) | private Pizza(String name, int imageResourceId) {
    method getName (line 20) | public String getName() {
    method getImageResourceId (line 24) | public int getImageResourceId() {

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/PizzaDetailActivity.java
  class PizzaDetailActivity (line 11) | public class PizzaDetailActivity extends AppCompatActivity {
    method onCreate (line 14) | @Override

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/PizzaFragment.java
  class PizzaFragment (line 16) | public class PizzaFragment extends Fragment {
    method onCreateView (line 17) | @Override

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/StoresFragment.java
  class StoresFragment (line 16) | public class StoresFragment extends ListFragment {
    method onCreateView (line 17) | @Override

FILE: chapter13/BitsandPizzas/app/src/main/java/com/hfad/bitsandpizzas/TopFragment.java
  class TopFragment (line 18) | public class TopFragment extends Fragment {
    method onCreateView (line 19) | @Override

FILE: chapter13/BitsandPizzas/app/src/test/java/com/hfad/bitsandpizzas/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter14/CatChat/app/src/androidTest/java/com/hfad/catchat/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/DraftsFragment.java
  class DraftsFragment (line 10) | public class DraftsFragment extends Fragment {
    method onCreateView (line 12) | @Override

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/FeedbackActivity.java
  class FeedbackActivity (line 7) | public class FeedbackActivity extends AppCompatActivity {
    method onCreate (line 9) | @Override

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/HelpActivity.java
  class HelpActivity (line 7) | public class HelpActivity extends AppCompatActivity {
    method onCreate (line 9) | @Override

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/InboxFragment.java
  class InboxFragment (line 9) | public class InboxFragment extends Fragment {
    method onCreateView (line 11) | @Override

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/MainActivity.java
  class MainActivity (line 15) | public class MainActivity extends AppCompatActivity
    method onCreate (line 18) | @Override
    method onNavigationItemSelected (line 44) | @Override
    method onBackPressed (line 83) | @Override

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/SentItemsFragment.java
  class SentItemsFragment (line 10) | public class SentItemsFragment extends Fragment {
    method onCreateView (line 12) | @Override

FILE: chapter14/CatChat/app/src/main/java/com/hfad/catchat/TrashFragment.java
  class TrashFragment (line 10) | public class TrashFragment extends Fragment {
    method onCreateView (line 12) | @Override

FILE: chapter14/CatChat/app/src/test/java/com/hfad/catchat/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter15/Starbuzz/app/src/androidTest/java/com/hfad/starbuzz/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter15/Starbuzz/app/src/main/java/com/hfad/starbuzz/Drink.java
  class Drink (line 7) | public class Drink {
    method Drink (line 17) | private Drink(String name, String description, int imageResourceId) {
    method getDescription (line 23) | public String getDescription() {
    method getName (line 27) | public String getName() {
    method getImageResourceId (line 31) | public int getImageResourceId() {
    method toString (line 35) | public String toString() {

FILE: chapter15/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkActivity.java
  class DrinkActivity (line 8) | public class DrinkActivity extends Activity {
    method onCreate (line 11) | @Override

FILE: chapter15/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkCategoryActivity.java
  class DrinkCategoryActivity (line 11) | public class DrinkCategoryActivity extends Activity {
    method onCreate (line 13) | @Override

FILE: chapter15/Starbuzz/app/src/main/java/com/hfad/starbuzz/StarbuzzDatabaseHelper.java
  class StarbuzzDatabaseHelper (line 8) | public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
    method StarbuzzDatabaseHelper (line 13) | StarbuzzDatabaseHelper(Context context) {
    method onCreate (line 17) | @Override
    method onUpgrade (line 22) | @Override
    method insertDrink (line 27) | private static void insertDrink(SQLiteDatabase db, String name, String...
    method updateMyDatabase (line 36) | private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int n...

FILE: chapter15/Starbuzz/app/src/main/java/com/hfad/starbuzz/TopLevelActivity.java
  class TopLevelActivity (line 10) | public class TopLevelActivity extends Activity {
    method onCreate (line 12) | @Override

FILE: chapter15/Starbuzz/app/src/test/java/com/hfad/starbuzz/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter16/Starbuzz/app/src/androidTest/java/com/hfad/starbuzz/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter16/Starbuzz/app/src/main/java/com/hfad/starbuzz/Drink.java
  class Drink (line 7) | public class Drink {
    method Drink (line 17) | private Drink(String name, String description, int imageResourceId) {
    method getDescription (line 23) | public String getDescription() {
    method getName (line 27) | public String getName() {
    method getImageResourceId (line 31) | public int getImageResourceId() {
    method toString (line 35) | public String toString() {

FILE: chapter16/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkActivity.java
  class DrinkActivity (line 13) | public class DrinkActivity extends Activity {
    method onCreate (line 16) | @Override

FILE: chapter16/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkCategoryActivity.java
  class DrinkCategoryActivity (line 17) | public class DrinkCategoryActivity extends Activity {
    method onCreate (line 22) | @Override
    method onDestroy (line 65) | @Override

FILE: chapter16/Starbuzz/app/src/main/java/com/hfad/starbuzz/StarbuzzDatabaseHelper.java
  class StarbuzzDatabaseHelper (line 8) | public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
    method StarbuzzDatabaseHelper (line 13) | StarbuzzDatabaseHelper(Context context) {
    method onCreate (line 17) | @Override
    method onUpgrade (line 22) | @Override
    method insertDrink (line 27) | private static void insertDrink(SQLiteDatabase db, String name, String...
    method updateMyDatabase (line 36) | private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int n...

FILE: chapter16/Starbuzz/app/src/main/java/com/hfad/starbuzz/TopLevelActivity.java
  class TopLevelActivity (line 10) | public class TopLevelActivity extends Activity {
    method onCreate (line 12) | @Override

FILE: chapter16/Starbuzz/app/src/test/java/com/hfad/starbuzz/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter17/Starbuzz/app/src/androidTest/java/com/hfad/starbuzz/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter17/Starbuzz/app/src/main/java/com/hfad/starbuzz/Drink.java
  class Drink (line 7) | public class Drink {
    method Drink (line 17) | private Drink(String name, String description, int imageResourceId) {
    method getDescription (line 23) | public String getDescription() {
    method getName (line 27) | public String getName() {
    method getImageResourceId (line 31) | public int getImageResourceId() {
    method toString (line 35) | public String toString() {

FILE: chapter17/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkActivity.java
  class DrinkActivity (line 17) | public class DrinkActivity extends Activity {
    method onCreate (line 20) | @Override
    method onFavoriteClicked (line 69) | public void onFavoriteClicked(View view){
    class UpdateDrinkTask (line 76) | private class UpdateDrinkTask extends AsyncTask<Integer, Void, Boolean> {
      method onPreExecute (line 79) | protected void onPreExecute() {
      method doInBackground (line 85) | protected Boolean doInBackground(Integer... drinks) {
      method onPostExecute (line 100) | protected void onPostExecute(Boolean success) {

FILE: chapter17/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkCategoryActivity.java
  class DrinkCategoryActivity (line 17) | public class DrinkCategoryActivity extends Activity {
    method onCreate (line 22) | @Override
    method onDestroy (line 65) | @Override

FILE: chapter17/Starbuzz/app/src/main/java/com/hfad/starbuzz/StarbuzzDatabaseHelper.java
  class StarbuzzDatabaseHelper (line 8) | public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
    method StarbuzzDatabaseHelper (line 13) | StarbuzzDatabaseHelper(Context context) {
    method onCreate (line 17) | @Override
    method onUpgrade (line 22) | @Override
    method insertDrink (line 27) | private static void insertDrink(SQLiteDatabase db, String name, String...
    method updateMyDatabase (line 36) | private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int n...

FILE: chapter17/Starbuzz/app/src/main/java/com/hfad/starbuzz/TopLevelActivity.java
  class TopLevelActivity (line 17) | public class TopLevelActivity extends Activity {
    method onCreate (line 22) | @Override
    method setupOptionsListView (line 30) | private void setupOptionsListView() {
    method setupFavoritesListView (line 51) | private void setupFavoritesListView() {
    method onRestart (line 83) | @Override
    method onDestroy (line 96) | @Override

FILE: chapter17/Starbuzz/app/src/test/java/com/hfad/starbuzz/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter18/Joke/app/src/androidTest/java/com/hfad/joke/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter18/Joke/app/src/main/java/com/hfad/joke/DelayedMessageService.java
  class DelayedMessageService (line 9) | public class DelayedMessageService extends IntentService {
    method DelayedMessageService (line 14) | public DelayedMessageService() {
    method onHandleIntent (line 18) | @Override
    method showText (line 31) | private void showText(final String text) {

FILE: chapter18/Joke/app/src/main/java/com/hfad/joke/MainActivity.java
  class MainActivity (line 8) | public class MainActivity extends Activity {
    method onCreate (line 10) | @Override
    method onClick (line 16) | public void onClick(View view) {

FILE: chapter18/Joke/app/src/test/java/com/hfad/joke/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: chapter19/Odometer/app/src/androidTest/java/com/hfad/odometer/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: chapter19/Odometer/app/src/main/java/com/hfad/odometer/MainActivity.java
  class MainActivity (line 21) | public class MainActivity extends Activity {
    method onServiceConnected (line 29) | @Override
    method onServiceDisconnected (line 36) | @Override
    method onCreate (line 42) | @Override
    method onRequestPermissionsResult (line 49) | @Override
    method onStart (line 81) | @Override
    method onStop (line 96) | @Override
    method displayDistance (line 105) | private void displayDistance() {

FILE: chapter19/Odometer/app/src/main/java/com/hfad/odometer/OdometerService.java
  class OdometerService (line 16) | public class OdometerService extends Service {
    class OdometerBinder (line 26) | public class OdometerBinder extends Binder {
      method getOdometer (line 27) | OdometerService getOdometer() {
    method onCreate (line 32) | @Override
    method onBind (line 68) | @Override
    method onDestroy (line 73) | @Override
    method getDistance (line 86) | public double getDistance() {

FILE: chapter19/Odometer/app/src/test/java/com/hfad/odometer/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test
Condensed preview — 616 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (605K chars).
[
  {
    "path": "README.org",
    "chars": 35,
    "preview": "Source code for the second edition\n"
  },
  {
    "path": "chapter01/MyFirstApp/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter01/MyFirstApp/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter01/MyFirstApp/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter01/MyFirstApp/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter01/MyFirstApp/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter01/MyFirstApp/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter01/MyFirstApp/.idea/modules.xml",
    "chars": 357,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter01/MyFirstApp/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter01/MyFirstApp/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter01/MyFirstApp/app/build.gradle",
    "chars": 882,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter01/MyFirstApp/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter01/MyFirstApp/app/src/androidTest/java/com/hfad/myfirstapp/ExampleInstrumentedTest.java",
    "chars": 742,
    "preview": "package com.hfad.myfirstapp;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpor"
  },
  {
    "path": "chapter01/MyFirstApp/app/src/main/AndroidManifest.xml",
    "chars": 713,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter01/MyFirstApp/app/src/main/java/com/hfad/myfirstapp/MainActivity.java",
    "chars": 303,
    "preview": "package com.hfad.myfirstapp;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class MainActivity extends "
  },
  {
    "path": "chapter01/MyFirstApp/app/src/main/res/layout/activity_main.xml",
    "chars": 784,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout xmlns:android=\"http://schemas.androi"
  },
  {
    "path": "chapter01/MyFirstApp/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter01/MyFirstApp/app/src/main/res/values/strings.xml",
    "chars": 75,
    "preview": "<resources>\n    <string name=\"app_name\">My First App</string>\n</resources>\n"
  },
  {
    "path": "chapter01/MyFirstApp/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter01/MyFirstApp/app/src/test/java/com/hfad/myfirstapp/ExampleUnitTest.java",
    "chars": 397,
    "preview": "package com.hfad.myfirstapp;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test,"
  },
  {
    "path": "chapter01/MyFirstApp/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter01/MyFirstApp/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Thu Apr 27 13:36:28 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter01/MyFirstApp/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter01/MyFirstApp/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter01/MyFirstApp/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter01/MyFirstApp/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter02/BeerAdviser/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter02/BeerAdviser/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter02/BeerAdviser/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter02/BeerAdviser/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter02/BeerAdviser/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter02/BeerAdviser/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter02/BeerAdviser/.idea/modules.xml",
    "chars": 359,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter02/BeerAdviser/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter02/BeerAdviser/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter02/BeerAdviser/app/build.gradle",
    "chars": 883,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter02/BeerAdviser/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/androidTest/java/com/hfad/beeradviser/ExampleInstrumentedTest.java",
    "chars": 744,
    "preview": "package com.hfad.beeradviser;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpo"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/AndroidManifest.xml",
    "chars": 718,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/java/com/hfad/beeradviser/BeerExpert.java",
    "chars": 495,
    "preview": "package com.hfad.beeradviser;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by davidg on 28/04/201"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/java/com/hfad/beeradviser/FindBeerActivity.java",
    "chars": 1249,
    "preview": "package com.hfad.beeradviser;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport a"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/res/layout/activity_find_beer.xml",
    "chars": 1270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/res/values/strings.xml",
    "chars": 342,
    "preview": "<resources>\n    <string name=\"app_name\">Beer Adviser</string>\n    <string name=\"find_beer\">Find Beer!</string>\n    <stri"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter02/BeerAdviser/app/src/test/java/com/hfad/beeradviser/ExampleUnitTest.java",
    "chars": 398,
    "preview": "package com.hfad.beeradviser;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
  },
  {
    "path": "chapter02/BeerAdviser/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter02/BeerAdviser/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Fri Apr 28 12:49:04 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter02/BeerAdviser/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter02/BeerAdviser/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter02/BeerAdviser/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter02/BeerAdviser/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter03/MyMessenger/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter03/MyMessenger/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter03/MyMessenger/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter03/MyMessenger/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter03/MyMessenger/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter03/MyMessenger/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter03/MyMessenger/.idea/modules.xml",
    "chars": 359,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter03/MyMessenger/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter03/MyMessenger/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter03/MyMessenger/app/build.gradle",
    "chars": 883,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter03/MyMessenger/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter03/MyMessenger/app/src/androidTest/java/com/hfad/mymessenger/ExampleInstrumentedTest.java",
    "chars": 744,
    "preview": "package com.hfad.mymessenger;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpo"
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/AndroidManifest.xml",
    "chars": 792,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/java/com/hfad/mymessenger/CreateMessageActivity.java",
    "chars": 961,
    "preview": "package com.hfad.mymessenger;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimp"
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/java/com/hfad/mymessenger/ReceiveMessageActivity.java",
    "chars": 661,
    "preview": "package com.hfad.mymessenger;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimp"
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/res/layout/activity_create_message.xml",
    "chars": 902,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/res/layout/activity_receive_message.xml",
    "chars": 543,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/res/values/strings.xml",
    "chars": 226,
    "preview": "<resources>\n    <string name=\"app_name\">My Messenger</string>\n    <string name=\"send\">Send Message</string>\n    <string "
  },
  {
    "path": "chapter03/MyMessenger/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter03/MyMessenger/app/src/test/java/com/hfad/mymessenger/ExampleUnitTest.java",
    "chars": 398,
    "preview": "package com.hfad.mymessenger;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
  },
  {
    "path": "chapter03/MyMessenger/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter03/MyMessenger/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Sun Apr 30 09:14:51 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter03/MyMessenger/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter03/MyMessenger/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter03/MyMessenger/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter03/MyMessenger/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter04/Stopwatch/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter04/Stopwatch/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter04/Stopwatch/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter04/Stopwatch/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter04/Stopwatch/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter04/Stopwatch/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter04/Stopwatch/.idea/modules.xml",
    "chars": 355,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter04/Stopwatch/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter04/Stopwatch/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter04/Stopwatch/app/build.gradle",
    "chars": 881,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter04/Stopwatch/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter04/Stopwatch/app/src/androidTest/java/com/hfad/stopwatch/ExampleInstrumentedTest.java",
    "chars": 740,
    "preview": "package com.hfad.stopwatch;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport"
  },
  {
    "path": "chapter04/Stopwatch/app/src/main/AndroidManifest.xml",
    "chars": 717,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter04/Stopwatch/app/src/main/java/com/hfad/stopwatch/StopwatchActivity.java",
    "chars": 2504,
    "preview": "package com.hfad.stopwatch;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport an"
  },
  {
    "path": "chapter04/Stopwatch/app/src/main/res/layout/activity_stopwatch.xml",
    "chars": 1621,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter04/Stopwatch/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter04/Stopwatch/app/src/main/res/values/strings.xml",
    "chars": 190,
    "preview": "<resources>\n    <string name=\"app_name\">Stopwatch</string>\n    <string name=\"start\">Start</string>\n    <string name=\"sto"
  },
  {
    "path": "chapter04/Stopwatch/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter04/Stopwatch/app/src/test/java/com/hfad/stopwatch/ExampleUnitTest.java",
    "chars": 396,
    "preview": "package com.hfad.stopwatch;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, "
  },
  {
    "path": "chapter04/Stopwatch/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter04/Stopwatch/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Sun Apr 30 09:54:53 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter04/Stopwatch/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter04/Stopwatch/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter04/Stopwatch/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter04/Stopwatch/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter05/Duck/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter05/Duck/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter05/Duck/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter05/Duck/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter05/Duck/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter05/Duck/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter05/Duck/.idea/modules.xml",
    "chars": 345,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter05/Duck/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter05/Duck/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter05/Duck/app/build.gradle",
    "chars": 876,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter05/Duck/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter05/Duck/app/src/androidTest/java/com/hfad/duck/ExampleInstrumentedTest.java",
    "chars": 730,
    "preview": "package com.hfad.duck;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport andr"
  },
  {
    "path": "chapter05/Duck/app/src/main/AndroidManifest.xml",
    "chars": 707,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter05/Duck/app/src/main/java/com/hfad/duck/MainActivity.java",
    "chars": 297,
    "preview": "package com.hfad.duck;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class MainActivity extends Activi"
  },
  {
    "path": "chapter05/Duck/app/src/main/res/layout/activity_main.xml",
    "chars": 1202,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    x"
  },
  {
    "path": "chapter05/Duck/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter05/Duck/app/src/main/res/values/strings.xml",
    "chars": 67,
    "preview": "<resources>\n    <string name=\"app_name\">Duck</string>\n</resources>\n"
  },
  {
    "path": "chapter05/Duck/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter05/Duck/app/src/test/java/com/hfad/duck/ExampleUnitTest.java",
    "chars": 391,
    "preview": "package com.hfad.duck;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which"
  },
  {
    "path": "chapter05/Duck/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter05/Duck/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Tue May 09 20:08:29 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter05/Duck/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter05/Duck/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter05/Duck/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter05/Duck/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter05/LinearLayoutExample/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/modules.xml",
    "chars": 375,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter05/LinearLayoutExample/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/build.gradle",
    "chars": 891,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/androidTest/java/com/hfad/linearlayoutexample/ExampleInstrumentedTest.java",
    "chars": 760,
    "preview": "package com.hfad.linearlayoutexample;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegist"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/main/AndroidManifest.xml",
    "chars": 722,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/main/java/com/hfad/linearlayoutexample/MainActivity.java",
    "chars": 312,
    "preview": "package com.hfad.linearlayoutexample;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class MainActivity"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/main/res/layout/activity_main.xml",
    "chars": 934,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/main/res/values/strings.xml",
    "chars": 199,
    "preview": "<resources>\n    <string name=\"app_name\">LinearLayout Example</string>\n    <string name=\"to\">To</string>\n    <string name"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter05/LinearLayoutExample/app/src/test/java/com/hfad/linearlayoutexample/ExampleUnitTest.java",
    "chars": 406,
    "preview": "package com.hfad.linearlayoutexample;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local u"
  },
  {
    "path": "chapter05/LinearLayoutExample/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter05/LinearLayoutExample/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Tue May 09 20:24:47 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter05/LinearLayoutExample/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter05/LinearLayoutExample/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter05/LinearLayoutExample/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter05/LinearLayoutExample/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter06/MyConstraintLayout/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/modules.xml",
    "chars": 373,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter06/MyConstraintLayout/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/build.gradle",
    "chars": 890,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/androidTest/java/com/hfad/myconstraintlayout/ExampleInstrumentedTest.java",
    "chars": 758,
    "preview": "package com.hfad.myconstraintlayout;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistr"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/main/AndroidManifest.xml",
    "chars": 721,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/main/java/com/hfad/myconstraintlayout/MainActivity.java",
    "chars": 311,
    "preview": "package com.hfad.myconstraintlayout;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class MainActivity "
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/main/res/layout/activity_main.xml",
    "chars": 3639,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout\n    xmlns:android=\"http://schemas.an"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/main/res/values/strings.xml",
    "chars": 326,
    "preview": "<resources>\n    <string name=\"app_name\">My Constraint Layout</string>\n    <string name=\"to_label\">To:</string>\n    <stri"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/main/res/values/styles.xml",
    "chars": 197,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkAction"
  },
  {
    "path": "chapter06/MyConstraintLayout/app/src/test/java/com/hfad/myconstraintlayout/ExampleUnitTest.java",
    "chars": 405,
    "preview": "package com.hfad.myconstraintlayout;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local un"
  },
  {
    "path": "chapter06/MyConstraintLayout/build.gradle",
    "chars": 498,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "chapter06/MyConstraintLayout/gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Sun Apr 30 10:26:15 BST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "chapter06/MyConstraintLayout/gradle.properties",
    "chars": 730,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "chapter06/MyConstraintLayout/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "chapter06/MyConstraintLayout/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "chapter06/MyConstraintLayout/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "chapter07/Starbuzz/.gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "chapter07/Starbuzz/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "chapter07/Starbuzz/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "chapter07/Starbuzz/.idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": "chapter07/Starbuzz/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "chapter07/Starbuzz/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "chapter07/Starbuzz/.idea/modules.xml",
    "chars": 353,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "chapter07/Starbuzz/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "chapter07/Starbuzz/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "chapter07/Starbuzz/app/build.gradle",
    "chars": 880,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.1\"\n    defaultCo"
  },
  {
    "path": "chapter07/Starbuzz/app/proguard-rules.pro",
    "chars": 935,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "chapter07/Starbuzz/app/src/androidTest/java/com/hfad/starbuzz/ExampleInstrumentedTest.java",
    "chars": 738,
    "preview": "package com.hfad.starbuzz;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport "
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/AndroidManifest.xml",
    "chars": 834,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/Drink.java",
    "chars": 1099,
    "preview": "package com.hfad.starbuzz;\n\n/**\n * Created by davidg on 30/04/2017.\n */\n\npublic class Drink {\n    private String name; p"
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkActivity.java",
    "chars": 1101,
    "preview": "package com.hfad.starbuzz;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.ImageView;\nimpo"
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/DrinkCategoryActivity.java",
    "chars": 1640,
    "preview": "package com.hfad.starbuzz;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport"
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/java/com/hfad/starbuzz/TopLevelActivity.java",
    "chars": 1343,
    "preview": "package com.hfad.starbuzz;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport"
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/res/layout/activity_drink.xml",
    "chars": 786,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/res/layout/activity_drink_category.xml",
    "chars": 516,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/res/layout/activity_top_level.xml",
    "chars": 761,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    "
  },
  {
    "path": "chapter07/Starbuzz/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  }
]

// ... and 416 more files (download for full content)

About this extraction

This page contains the full source code of the dogriffiths/HeadFirstAndroid2ndEdition GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 616 files (512.3 KB), approximately 155.3k tokens, and a symbol index with 364 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!