Implemented CompositePhoneLookup#isDirty.

IsDirty is implemented by (possibly in parallel) executing all child lookups, and completing as soon as the first lookup reports itself as dirty, cancelling other lookups upon completion.

If a lookup fails for some reason, it is treated as not being dirty.

This required adding a new method DialerFutures#firstMatching.

Bug: 34672501
Test: yes
PiperOrigin-RevId: 174261470
Change-Id: Icb4f7b5d9926094fc446542411d15d02a4b873a3
2 files changed