The goal of this project is to convert a simple Java stopwatch to an
Android application. The original java code can be found
here.
- Modeling state-dependent behavior with state machine diagrams
(see also here)
- Distinguishing between view states and (behavioral) model states
- Event-driven/asynchronous program execution
- User-triggered input events
- Internal events from background timers
- Concurrency issues: single-thread rule of accessing/updating the view in the GUI thread
- Key architectural issues and patterns
- Simple dependency injection (DI)
- Model-view-adapter (MVA) architectural pattern
- Mapping MVA to Android
- Difference between MVA and model-view-controller (MVC)
- Distinguishing among dumb, reactive, and autonomous model components
- Key design patterns
- Implementing event-driven behavior using the Observer pattern
- Implementing state-dependent behavior using the State pattern
- Command pattern for representing tasks as objects
- Façade pattern for hiding complexity in the model from the adapter
- Relevant class-level design principles
- Dependency Inversion Principle (DIP)
- Single Responsibility Principle (SRP)
- Interface Segregation Principle (ISP)
- Package-level architecture and relevant principles
- Dependency graph
(see also here)
- Stable Dependencies Principle (SDP)
- Acyclic Dependencies Principle (ADP)
- Architectural journey
- Different types of testing
- Component-level unit testing
- System testing
- Instrumentation testing
- Mock-based testing
- Testcase Superclass pattern (uses Template Method pattern)
- Test coverage
Setting up the Environment
Check out the project using Android Studio. This creates the local.properties file
with the required line
sdk.dir=<root folder of Android Studio's Android SDK installation>
In Android Studio: Run > Run app
Unit tests including out-of-emulator system tests using Robolectric
In Android Studio:
- Before running tests, in the Android view right-click on edu.luc.etl.cs313...test (test) - if Select ... is one
- of the visible menu items about 2/3 of the way down, click on that; if Select ... is not there, go to the next step
- Now click Run > Edit Configurations... and under Android JUnit click on cs313 in app
- On the Configuration tab, click the far-right icon in the Working Directory row and select MODULE_DIR, then click OK
- If you do not do this, running the unit tests from the Android view will not work!
- Finally, right-click on edu.luc.etl.cs313...test (test), then choose Run 'Tests in 'test''
You can also use Gradle:
$ ./gradlew testDebug # leave out the "./" on the Windows command line
You can view the resulting test reports in HTML by opening this file in your browser:
app/build/reports/tests/testDebugUnitTest/index.html
In Gradle:
$ ./gradlew jacocoTestDebugUnitTestReport # leave out "./" on the Windows command line
You can view the resulting test reports in HTML by opening this file in your browser:
app/build/reports/jacoco/jacocoTestDebugUnitTestReport/html/index.html
Android instrumentation tests (in-emulator/device system tests)
In Android Studio:
- In the Android view, right-click on edu.luc.etl.cs313...android (androidTest), then choose Run 'Tests in 'edu.luc.et...'
You can also use Gradle:
$ ./gradlew connectedDebugAndroidTest # leave out "./" on the Windows command line