Implement a command handler for constraints changed.
This change makes SystemAlarmManager constraints aware.

- When scheduling workspecs without constraints, alarms are set or
  delay_met commands are issued (depending on next run time).
- For workspecs with constraints, we update constraint proxies and let
  them wake us up for changes in constraints & issue delay_mets.
- During delay_met if the constraints are unmet, then the command
  is cancelled and rescheduled.

Test: Added unit tests

Change-Id: I7533dd7d831d8df3f7c0c9349d52332c9691b3b9
diff --git a/background/workmanager/src/main/java/android/arch/background/workmanager/impl/model/WorkSpec.java b/background/workmanager/src/main/java/android/arch/background/workmanager/impl/model/WorkSpec.java
index 07ef97a..fc708ae 100644
--- a/background/workmanager/src/main/java/android/arch/background/workmanager/impl/model/WorkSpec.java
+++ b/background/workmanager/src/main/java/android/arch/background/workmanager/impl/model/WorkSpec.java
@@ -303,6 +303,13 @@
         }
     }
 
+    /**
+     * @return <code>true</code> if the {@link WorkSpec} has constraints.
+     */
+    public boolean hasConstraints() {
+        return !Constraints.NONE.equals(getConstraints());
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {