Commit Graph

10179 Commits

Author SHA1 Message Date
TreeHugger Robot
2a7854addd Merge "Add collection start time to LooperStats dumpsys output" 2018-10-24 12:14:29 +00:00
Michael Dooley
0bf1666c51 Merge changes from topic "getmodelstate-redo"
* changes:
  Rolling forward with indentation fix.
  Revert "Revert "Adding getModelState API to sound trigger""
2018-10-24 06:04:42 +00:00
John Reck
8884cfc13e Merge "Rename & package shuffle" 2018-10-23 20:02:00 +00:00
Michael Dooley
291751e510 Revert "Revert "Adding getModelState API to sound trigger""
This reverts commit 81f71f1c27.

Reason for revert: rolling forward with fix

Change-Id: Ifc0c53581ac567cb968d91993f453220f8253aec
2018-10-23 07:44:51 +02:00
Yohei Yukawa
530dd76fde Remove IInputMethodSession#finishInput(), which is called nowhere
Currently IInputMethodSession#finishInput() is called nowhere.

Let's remove this IPC method exposed from InputMethodService to IME
client for now until we fully understand what is the right approach on
how and when InputMethodService#finishInput() should be called.

Note that we cannot simply remove InputMethodSession#finishInput()
because it is already published as a public API.  In Bug 9216494
hopefully we can also discuss whether InputMethodSession#finishInput()
should be deprecated or can be reused for some actual use cases.

Bug: 9216494
Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases
Change-Id: I9e378111c9df40cb6821583d1e6ae8f9fe38f2b1
2018-10-22 15:05:47 -07:00
Yohei Yukawa
b7526456ce Remove redundant prefix from UnbindReason
This is the last step to split InputMethodClient into multiple
classes.

Now that all the integer constants for UnbindReason are defined inside
UnbindReason, "UNBIND_REASON_" prefix is just redundant.

This is a mechanical refactoring. There should be no user-visible
behavior change.

Fix: 118040692
Test: prebuilts/checkstyle/checkstyle.py -f \
      frameworks/base/core/java/com/android/internal/inputmethod/UnbindReason.java
Change-Id: Iafce68b614dd85392d06af8726525a18b014dba0
2018-10-21 20:15:17 -07:00
Yohei Yukawa
499e3f764e Extract UnbindReason from InputMethodClient
This is another step to split InputMethodClient into multiple classes.

With this CL, InputMethodClient is completely removed.

This is a mechanical refactoring. There should be no user-visible
behavior change.

Bug: 118040692
Test: prebuilts/checkstyle/checkstyle.py -f \
      frameworks/base/core/java/com/android/internal/inputmethod/UnbindReason.java
Change-Id: I3b96a351413025338776f6c87cbaa8cf28c3a44f
2018-10-21 20:15:11 -07:00
Yohei Yukawa
4219422bb3 Remove redundant prefix from StartInputReason
This is another step to split InputMethodClient into multiple classes.

Now that all the integer constants for StartInputReason are defined
inside StartInputReason, "START_INPUT_REASON_" prefix is just
redundant.

This is a mechanical refactoring. There should be no user-visible
behavior change.

Bug: 118040692
Test: prebuilts/checkstyle/checkstyle.py -f \
      frameworks/base/core/java/com/android/internal/inputmethod/StartInputReason.java
Change-Id: Ic2476c3d588211e6c61180cde7df4c6b79039ede
2018-10-21 20:14:40 -07:00
Yohei Yukawa
c6632df9e7 Extract StartInputReason from InputMethodClient
This is another step to split InputMethodClient into multiple classes.

With this CL, StartInputReason will be extracted from
InputMethodClient.java into a dedicated file.

This is a mechanical refactoring. There should be no user-visible
behavior change.

Bug: 118040692
Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases
Test: atest FrameworksCoreTests:android.view.inputmethod.InputMethodManagerTest
Test: prebuilts/checkstyle/checkstyle.py -f \
      frameworks/base/core/java/com/android/internal/inputmethod/StartInputReason.java
Change-Id: I0cc2588c97239a004720f74cbf356bda4c735d53
2018-10-21 11:47:16 -07:00
Yohei Yukawa
a468d70e5f Move some methods from InputMethodClient to InputMethodDebug
This is the first step to split InputMethodClient into multiple
classes.

With this CL, utility methods to convert integer constants to String
messages will be moved from InputMethodClient to InputMethodDebug,
which I believe is a bit more descriptive class name than
InputMethodClient.

This is a mechanical refactoring. There should be no user-visible
behavior change.

Bug: 118040692
Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases
Test: atest FrameworksCoreTests:android.view.inputmethod.InputMethodManagerTest
Test: prebuilts/checkstyle/checkstyle.py -f \
      frameworks/base/core/java/com/android/internal/inputmethod/InputMethodDebug.java
Change-Id: I83f4795e95bc2e8ae325ad6e28d3a42317414e8d
2018-10-21 11:42:34 -07:00
zhouwenjie
89a47cf154 Trim whitespace in kernel wakelock name.
Bug: 117991062
Test: Manual tested with an emulator
Change-Id: Ic80a302afc2327ecad048537af8ca5b7d5329f72
2018-10-19 21:33:06 +00:00
Marcin Oczeretko
d464bcf582 Add collection start time to LooperStats dumpsys output
Test: called adb shell cmd looper_stats dump
Bug: 113651685
Change-Id: Iccd224b1b50a9ba31a9de254f251fac26fee2171
2018-10-19 10:46:21 +01:00
Yohei Yukawa
e48d0ae661 Remove IInputMethodManager#finishInput(), which is NOP
Currently InputMethodManagerService#finishInput() does nothing. Until
we fully understand what is the right approach on how and when
InputMethodService#finishInput() (Bug 9216494), let's remove this
unnecessary IPC from the IME client to InputMethodManagerService.

Bug: 9216494
Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases
Test: atest FrameworksCoreTests:android.view.inputmethod.InputMethodManagerTest
Change-Id: I614050d20f4a7d9611dc0502e55e6ca3458a836e
2018-10-17 16:14:34 +08:00
Steve Elliott
5269abcf95 Merge "Add configurable default setting for assistant componentname" 2018-10-16 21:05:23 +00:00
TreeHugger Robot
1728c04cae Merge "Instantiate InputMethodManager for each display (2nd try)" 2018-10-16 08:02:49 +00:00
TreeHugger Robot
02f2a315d7 Merge "Add Context.getDisplayId() to avoid possible IPC" 2018-10-16 00:20:52 +00:00
TreeHugger Robot
bc9ebba7e5 Merge "Suspending app can customize intercepting dialog" 2018-10-15 21:51:52 +00:00
Steve Elliott
433c83dc81 Add configurable default setting for assistant componentname
By requiring an explicit default setting, it eliminates all ambiguous
states where a disambiguation would normally be shown. With this
change in place, at no point should a disambiguation be shown.

Test: manual
Bug: 111603898
Change-Id: Ib32dafbd3c6fcbe11186dc8ecab6b09c9b734067
2018-10-15 15:30:58 -04:00
Yohei Yukawa
4052a10f29 Instantiate InputMethodManager for each display (2nd try)
InputMethodManager has been a per-process singleton object. In order
to support behavior changes for multi-display support in Android Q,
however, InputMethodManager now needs to be per-display objects.

With this CL, context.getSystemService(InputMethodManager.class) will
start returning per-display InputMethodManager (IMM) instance.

  Why?

There are two major reasons.
 1. To support per-display focused window.
 2. To support more simplified API for multi-session IME.

Currently per-process InputMethodManager instance directly receives
callback from ViewRootImpl upon windowFocusChanged, then it keeps
track of which Window is focused by storing its root view into
InputMethodManager#mCurRootView.

This design assumes that (within the same process) at most one Window
can have window focus, which is no longer true once we start
supporting per-display focused window (Bug 111361570).

  Why we need to do this to support per-display focused window:

For traditional non multi-session IME cases (e.g. apps that use
Virtual Display APIs on phones), internal state of IMM can be easily
messed up once the system starts sending per-display
windowFocusChanged events to the same process, because IMM still
doesn't know that now each display has focused window. It is hard to
precisely predict what kind of issues we would see simply because such
a use case is most likely not expected in the original design.

  Why we need to do this for multi-session IME:

For multi-session IME scenarios, in addition to the above concern in
InputMethodManager, the current design allows at most one IME session
per process. This means that if a process X is showing Activities to 3
different displays, only one Activity can interact with the
multi-session IME at the same time. If we do not change the current
design, the only way to work around is to ask app developers to
explicitly use different processes for each Activity, which may
require a lot of work (e.g. SharedPreference is not optimized for
multi-process use cases). This would also make multi-session IME
development complicated because the IME cannot know on which display
the IME is interacting until startInputOrWindowGainedFocus() is
actually called, and needs to do all the preparation and cleanup tasks
whenever startInputOrWindowGainedFocus() is called for a different
display than it's currently interacting with.

  Alternative solutions considered:

Another possible approach is to update InputMethodManager singleton to
be able to maintain multiple mCurRootView and mServedView for each
display. This approach was abandoned because those fields and methods
are already marked as @UnsupportedAppUsage.  I concluded that touching
@UnsupportedAppUsage things would have bigger compatibility risks than
per-display instance model.

  Implementation note:

* Public APIs in IMM that take View instance as the first parameter
  will verify whether the given View and IMM are associated with the
  same display ID or not.  If there is a display ID mismatch, such an
  API call will be automatically forwarded to the correct IMM instance
  IMM with a clear warning in logcat which tells that app developers
  should use the correct IMM instance to avoid unnecessary performance
  overhead.

* As a general rule, system server process cannot trust display ID
  reported from applications.  In order to enable IMMS to verify the
  reported display ID, this CL also exposes display ID verification
  logic from WMS to other system components via WindowManagerInternal.

* isInputMethodClientFocus() in WindowManagerService (WMS) is updated
  to use top-focused-display to determine whether a given IME client
  has IME focus or not.  This is now necessary because with a recent
  change [1] each display can have focused window.  The previous logic
  to check all the displays that belong to the given pid/uid [2] no
  longer makes sense.

* Currently per-display InputMethodManager instances will not be
  garbage collected because InputMethodManager#sInstanceMap keeps
  holding strong references to them.  Freeing those instances is
  technically possible, but we need to be careful because multiple
  processes (app, system, IME) are involved and at least system
  process has a strict verification logic that lets the calling
  process crash with SecurityException.  We need to carefully
  implement such a cleanup logic to avoid random process crash due to
  race condition.  Bug 116699479 will take care of this task.

Also to make sure that the performance regression (Bug 117434607) we
observed after my initial attempt [3] no longer exists, here are the
benchmark results with and without this CL.

  testExpandNotificationsLatency on taimen-userdebug
    without this CL:
      results=[55, 46, 61, 67, 50, 48, 57, 50, 55, 63]
      min:46.0, max:67.0, avg:55.2, median:55.0, std_dev:6.539
    with this CL:
      results=[45, 55, 58, 57, 47, 60, 59, 60, 56, 53]
      min:45.0, max:60.0, avg:55.0, median:56.5, std_dev:4.980

 [1]: I776cabaeaf41ff4240f504fb1430d3e40892023d
      1e5b10a217
 [2]: I8da315936caebdc8b2c16cff4e24192c06743251
      90120a8b5b
 [3]: I7242e765426353672823fcc8277f20ac361930d7
      c53d78e992

Bug: 111364446
Fix: 115893206
Test: atest ActivityManagerMultiDisplayTests
Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases
Test: atest FrameworksCoreTests:android.view.inputmethod.InputMethodManagerTest
Test: No perf regression in LatencyTests#testExpandNotificationsLatency()
Change-Id: I78ad7cccb9586474c83f7e2f90c0bcabb221c47b
2018-10-15 15:35:55 +08:00
Yohei Yukawa
5281b6b4c0 Add Context.getDisplayId() to avoid possible IPC
ContextImpl has an internal rule that when ContextImpl#mDisplay is
null the Context is associated with the default display.  The problem
is that, as discussed in Bug 117709581, when ContextImpl#mDisplay is
null ContextImpl#getDisplay() tries to get some non-null Display
object by making an IPC to the system server, which is redundant when
the display ID is the only thing that the caller wants to know.

By having an @hide method Context.getDisplayId(), we can ensure that
display ID can be obtained without any IPC.  This enables us to
re-submit my CL [1] that aimed to instantiate InputMethodManager (IMM)
for each display but then got reverted due to a performance regression
(Bug 117434607).

There should be no developer-observable behavior change.

 [1]: I7242e765426353672823fcc8277f20ac361930d7
      c53d78e992

Fix: 117712745
Test: atest FrameworksCoreTests:android.content.ContextTest
Test: prebuilts/checkstyle/checkstyle.py -f \
      frameworks/base/core/tests/coretests/src/android/content/ContextTest.java
Change-Id: I2534530a5ce90e2620c5039d793a6454a0a1e154
2018-10-15 07:38:25 +08:00
Tobias Thierer
0d0dd506ac Merge "Remove unused imports of libcore.io.Libcore." am: 2a520365da am: abe7a32c67
am: 320e38309b

Change-Id: I2f8069235c4e8c298b0e092928a23d15cbe30520
2018-10-12 19:24:25 -07:00
Tobias Thierer
320e38309b Merge "Remove unused imports of libcore.io.Libcore." am: 2a520365da
am: abe7a32c67

Change-Id: I57d7d317f5827a54346e287db3f6f2d625e0aebc
2018-10-12 19:13:38 -07:00
Tobias Thierer
abe7a32c67 Merge "Remove unused imports of libcore.io.Libcore."
am: 2a520365da

Change-Id: I79c4679d483e0e8ea2e434237bd61d75f129da0f
2018-10-12 18:59:21 -07:00
Treehugger Robot
2a520365da Merge "Remove unused imports of libcore.io.Libcore." 2018-10-13 00:47:45 +00:00
Suprabh Shukla
389cb6f54a Suspending app can customize intercepting dialog
The suspending app has more context about why a particular app was
suspended by the user, but we do not want to delegate the interception
of the suspended activity out of the system.
Hence allowing it further customizations to the dialog to make
it clearer.

Test: atest com.android.server.pm.SuspendDialogInfoTest \
com.android.server.pm.SuspendPackagesTest \
com.android.server.pm.PackageUserStateTest \
com.android.server.pm.PackageManagerSettingsTests \
com.android.server.am.ActivityStartInterceptorTest

atest GtsSuspendAppsPermissionTestCases GtsSuspendAppsTestCases

Bug: 112486945
Bug: 113150060
Change-Id: If9f4d14587a2b75bb572e7984a90e300a2c72d16
2018-10-12 16:02:53 -07:00
Marcin Oczeretko
4427272533 LooperStats - track time to message dispatch
Test: UT and manual
atest .../LooperStatsTest.java
Verified that adb shell cmd looper_stats dump produces data
with dispatch delay

Bug: 113651685

Change-Id: I44550f8c5d71848932733bd02016aa65ce7b75b3
2018-10-12 13:17:01 +01:00
TreeHugger Robot
3d7133ed71 Merge "Allow all system configs in /product" 2018-10-12 10:55:26 +00:00
David Brazdil
158703a0c5 Merge changes Icd51c4c7,I836ecb94 am: 3590eb09ef am: b03f3c8ba2
am: 12e585e745

Change-Id: I33a47fa7425807ab0edebcd9f4a83443cbbf0ac5
2018-10-11 09:44:21 -07:00
David Brazdil
12e585e745 Merge changes Icd51c4c7,I836ecb94 am: 3590eb09ef
am: b03f3c8ba2

Change-Id: I8cbd96fc305e8356addbe4211275296c3ce0be43
2018-10-11 09:24:53 -07:00
David Brazdil
b03f3c8ba2 Merge changes Icd51c4c7,I836ecb94
am: 3590eb09ef

Change-Id: I70530ca7b04026b4ec436cf235a2b35c63689189
2018-10-11 09:14:20 -07:00
David Brazdil
3590eb09ef Merge changes Icd51c4c7,I836ecb94
* changes:
  Add entries to hidden api greylist
  Add method to hidden api greylist
2018-10-11 15:35:58 +00:00
TreeHugger Robot
018f47a2b0 Merge "Revert "Instantiate InputMethodManager for each display"" 2018-10-11 15:23:34 +00:00
Yohei Yukawa
1df32c5e5c Revert "Instantiate InputMethodManager for each display"
This reverts commit c53d78e992.

Reason for revert:
Caused performance regression in
LatencyTests#testExpandNotificationsLatency.

Fix: 117434607
Bug: 111364446
Bug: 115893206
Test: atest google/perf/app-transition/sysui-latency-test-trace
Change-Id: If0d7a1b8f6d126d5a7c384ec4c2ff44260b8c35f
2018-10-11 11:52:02 +00:00
David Brazdil
a8d554380d Add entries to hidden api greylist
Bug: 115387204
Test: m appcompat
Change-Id: Icd51c4c7d446ea72211804fbb050f4fee742db17
2018-10-11 12:50:40 +01:00
Yangster
1db2e8e4b4 Merge "Phone service state change atom." am: 419fc89b52 am: 16e3399902
am: 8f842fae06

Change-Id: Ibc518a29d8a31b3001aa6569ee370c45ce302f7c
2018-10-10 22:06:25 -07:00
Yangster
8f842fae06 Merge "Phone service state change atom." am: 419fc89b52
am: 16e3399902

Change-Id: Ifbff53d3b113c527975b5509289600f734dcca7b
2018-10-10 15:53:35 -07:00
Yangster
16e3399902 Merge "Phone service state change atom."
am: 419fc89b52

Change-Id: Iae02f9eee2616affb810c54f1af62693d29b5822
2018-10-10 15:24:17 -07:00
Lucas Dupin
3d95175dd5 Hook up wake-lock-screen with plugin structure
Wake-lock-screen gesture now receives signals from
the pluggable sensor pipeline.

Bug: 111414690
Test: manual
Change-Id: I9433d7310fcb9dd9b08a4fedf7d2a8e8779fe386
2018-10-10 13:08:28 -07:00
Yangster
4ccebeadc7 Phone service state change atom.
Background: BatteryStatsService tracks the phone scanning time metric. In Q,
we are migrating the dumpsys-based collection to the new infra. This CL is to
instrument the new logging mechanism.

Test: statsd test
FIX: b/116748990

Change-Id: I3cf5e0026bfc6f594c5f7b524f14b3a43b702afb
2018-10-10 19:45:10 +00:00
Tobias Thierer
30ff7a093e Remove unused imports of libcore.io.Libcore.
Test: Treehugger
Bug: 115503977
Bug: 117548625
Change-Id: I122fa68ddc2bd531f627dcac00834b47249bd56e
2018-10-10 15:49:51 +00:00
TreeHugger Robot
bcca0c0770 Merge "Using application context in static instance of LatencyTracker to avoid context leak" 2018-10-10 00:01:24 +00:00
Sunny Goyal
86914c2a04 Using application context in static instance of LatencyTracker
to avoid context leak

Test: Verified on device
Bug: 117515648
Change-Id: If5ad93f9ab41c9bea32030fb46fc605f3a193cfd
2018-10-09 15:26:34 -07:00
Howard Ro
bb67362281 Merge "MetricsLogger writes to both event log and statsd" 2018-10-09 03:18:09 +00:00
Dimitry Ivanov
a60c94aab9 Merge "Respect extractNativeLibs in natively bridged environments" am: 61b9b6c9eb am: a00f278956
am: 7c154d103c

Change-Id: Ibe46c36aa545703781fbc5f56eb5e57f46ece543
2018-10-08 08:33:04 -07:00
Dimitry Ivanov
7c154d103c Merge "Respect extractNativeLibs in natively bridged environments" am: 61b9b6c9eb
am: a00f278956

Change-Id: Ia790b6fed75624cec36577cfc68d12e5a029d500
2018-10-08 08:19:24 -07:00
Dimitry Ivanov
a00f278956 Merge "Respect extractNativeLibs in natively bridged environments"
am: 61b9b6c9eb

Change-Id: I6072e16c1cdf9543d38ec8763931abf095bd2313
2018-10-08 08:05:41 -07:00
Dimitry Ivanov
61b9b6c9eb Merge "Respect extractNativeLibs in natively bridged environments" 2018-10-08 14:50:08 +00:00
TreeHugger Robot
ce10f9b15f Merge "Instantiate InputMethodManager for each display" 2018-10-06 17:19:58 +00:00
Yohei Yukawa
c53d78e992 Instantiate InputMethodManager for each display
InputMethodManager has been a per-process singleton object. In order
to support behavior changes for multi-display support in Android Q,
however, InputMethodManager now needs to be per-display objects.

With this CL, context.getSystemService(InputMethodManager.class) will
start returning per-display InputMethodManager (IMM) instance.

  Why?

There are two major reasons.
 1. To support per-display focused window.
 2. To support more simplified API for multi-session IME.

Currently per-process InputMethodManager instance directly receives
callback from ViewRootImpl upon windowFocusChanged, then it keeps
track of which Window is focused by storing its root view into
InputMethodManager#mCurRootView.

This design assumes that (within the same process) at most one Window
can have window focus, which is no longer true once we start
supporting per-display focused window (Bug 111361570).

  Why we need to do this to support per-display focused window:

For traditional non multi-session IME cases (e.g. apps that use
Virtual Display APIs on phones), internal state of IMM can be easily
messed up once the system starts sending per-display
windowFocusChanged events to the same process, because IMM still
doesn't know that now each display has focused window. It is hard to
precisely predict what kind of issues we would see simply because such
a use case is most likely not expected in the original design.

  Why we need to do this for multi-session IME:

For multi-session IME scenarios, in addition to the above concern in
InputMethodManager, the current design allows at most one IME session
per process. This means that if a process X is showing Activities to 3
different displays, only one Activity can interact with the
multi-session IME at the same time. If we do not change the current
design, the only way to work around is to ask app developers to
explicitly use different processes for each Activity, which may
require a lot of work (e.g. SharedPreference is not optimized for
multi-process use cases). This would also make multi-session IME
development complicated because the IME cannot know on which display
the IME is interacting until startInputOrWindowGainedFocus() is
actually called, and needs to do all the preparation and cleanup tasks
whenever startInputOrWindowGainedFocus() is called for a different
display than it's currently interacting with.

  Alternative solutions considered:

Another possible approach is to update InputMethodManager singleton to
be able to maintain multiple mCurRootView and mServedView for each
display. This approach was abandoned because those fields and methods
are already marked as @UnsupportedAppUsage.  I concluded that touching
@UnsupportedAppUsage things would have bigger compatibility risks than
per-display instance model.

  Implementation note:

* Public APIs in IMM that take View instance as the first parameter
  will verify whether the given View and IMM are associated with the
  same display ID or not.  If there is a display ID mismatch, such an
  API call will be automatically forwarded to the correct IMM instance
  IMM with a clear warning in logcat which tells that app developers
  should use the correct IMM instance to avoid unnecessary performance
  overhead.

* As a general rule, system server process cannot trust display ID
  reported from applications.  In order to enable IMMS to verify the
  reported display ID, this CL also exposes display ID verification
  logic from WMS to other system components via WindowManagerInternal.

* isInputMethodClientFocus() in WindowManagerService (WMS) is updated
  to use top-focused-display to determine whether a given IME client
  has IME focus or not.  This is now necessary because with a recent
  change [1] each display can have focused window.  The previous logic
  to check all the displays that belong to the given pid/uid [2] no
  longer makes sense.

* Currently per-display InputMethodManager instances will not be
  garbage collected because InputMethodManager#sInstanceMap keeps
  holding strong references to them.  Freeing those instances is
  technically possible, but we need to be careful because multiple
  processes (app, system, IME) are involved and at least system
  process has a strict verification logic that lets the calling
  process crash with SecurityException.  We need to carefully
  implement such a cleanup logic to avoid random process crash due to
  race condition.  Bug 116699479 will take care of this task.

 [1]: I776cabaeaf41ff4240f504fb1430d3e40892023d
      1e5b10a217
 [2]: I8da315936caebdc8b2c16cff4e24192c06743251
      90120a8b5b

Bug: 111364446
Fix: 115893206
Test: atest ActivityManagerMultiDisplayTests
Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases
Test: atest FrameworksCoreTests:android.view.inputmethod.InputMethodManagerTest
Change-Id: I7242e765426353672823fcc8277f20ac361930d7
2018-10-05 15:54:41 -07:00
Hyunyoung Song
16b7af4062 IconFactory should be initialized before mAdapter is created inside ResolverActivity
Bug: 113032889
Test: builds
Change-Id: I9906ee7ec8be64f0a82634796a7e2f3bcbd01800
2018-10-05 14:02:21 -07:00