Commit Graph

52 Commits

Author SHA1 Message Date
Svetoslav Ganov
2b435aada3 API REVIEW: android.view.accessibility
1. Changed all references to granularity to movement
   granularity. BTW, to be more precise it should be
   text movement granularity.

bug:6435232

Change-Id: If6366b002ca3390f74918995b342baff2cbcfd01
2012-05-04 17:16:41 -07:00
Svetoslav Ganov
5a00661bd6 Accessibility focus should not affect the currently active window.
1. The event of setting an accessibility focus on a view should not
   make the host window the currently active one.

bug:6400648

Change-Id: Ib45c255f441c38489ee9d4ab5f284550ac5f6b01
2012-05-01 18:16:20 -07:00
Svetoslav Ganov
afe8cf2623 Removing action arguments checks.
1. The checks for action arguments are not needed since they
   may cause trouble for developers if we add more args to
   an action.

bug:6414006

Change-Id: Ia4212b52be183b1ef1cfd2561ce618cef2b015e4
2012-04-30 11:29:58 -07:00
Svetoslav Ganov
b7ff3255c6 Adding explicit text traversal granularities and actions for web navigation.
1. The granularities for traversing the text content of an accessibility
   node info are now predefined constants and custom ones will not be
   supported. This is the simplest solution - we can always add namespaced
   user defined ones (unlikely).

2. Added actions for traversing web content. These actions can be used by
   an accessibility service to transparently drive the JavaScript based
   screen reader that is used for handling web content.

3. Added a new accessibility event type for traversing the content of a
   view. This event is needed to announce to the user what is the next
   element, i.e. the one next to the cursor, after the view's text was
   traversed.

bug:5932640
bug:6389591

Change-Id: I144647da55bc4005c64f89865ef333af8359e145
2012-04-24 18:49:15 -07:00
Svetoslav Ganov
76f287e416 Removing hierarchical accessibility focus directions.
1. The accessibility focus directions are not needed since an
   accessibility service just get the root, first child, next
   sibling, previous sibling and call execute the action to
   give it accessibility focus. Now the accessibility node
   info tree is properly ordered taking into account layout
   manager directions for both layout manager that we report
   and ones that we have determined as not important for
   accessibility. Also the position of a node info are ordered
   properly based on their coordinates after all transformations
   as opposed to child index.

bug:5932640

Change-Id: I994a8297cb1e57c829ecbac73a937c2bcbe0bac7
2012-04-23 20:48:24 -07:00
Svetoslav Ganov
122b2c32de Fixing a couple of issues I have introduces in the last patch.
1. Fix waiting for the wrong instance.

2. Fix cloning of accessibility node info.

Change-Id: Icabf0d4bc947602a32fddc6642cc787f2bc766e4
2012-04-20 17:04:23 -07:00
Svetoslav Ganov
72de206248 Merge "Adding support for traversing the content of a node info at granularity." 2012-04-20 15:26:24 -07:00
Svetoslav Ganov
aa780c1109 Adding support for traversing the content of a node info at granularity.
1. A view that creates an accessibility node info may add to the info
   a list of granularity labels. These are granularities by which the
   source view can iterate over its content. For example a text view
   may support character, word link while a web view may additionally
   support buttons, tables, etc. There are actions on accessibility
   node info to go to the next/previous at a given granularity which
   is passesed as an argument.

2. Added Bundle argument to the APIs for performing accessibility
   actions. This is generic and extensible.

bug:5932640

Change-Id: I328cbbb4cddfdee082ab2a8b7ff1bd7477d8d6f9
2012-04-20 15:12:13 -07:00
Svetoslav Ganov
8e2f41426c Fixes in the accessibility gesture dispatching.
1. The gesture dispatcher thread was not waiting in a loop
   that check for complete initialization. Therefore is was
   susceptible to missed signals and unexpected interrupts.

2. In the gesture processing message handle the interaction id
   was reading the wrong message argument.

bug:5932640

Change-Id: Ic65ecc01a7fe7d43929c6c07d0759ae9001cf515
2012-04-20 14:57:18 -07:00
Dianne Hackborn
e1a996e99d Merge "Move handling of package changes to a background thread." 2012-04-20 13:44:43 -07:00
Dianne Hackborn
d0d7503fd3 Move handling of package changes to a background thread.
Helps get rid of some jank when installing applications.

Change-Id: I97d0022f82d67796e334d37086e5911dd6ca6b62
2012-04-19 23:12:09 -07:00
Svetoslav Ganov
fefd20e927 Adding an opt-in mechanism for gesture detection in AccessibilityService.
1. An accessibility service has to explicitly opt in to be notified
   for gestures by the system. There is only one accessibility service
   that handles gestures and in case it does not handle a gesture
   the system performs default handling. This default handling ensures
   that we have gesture navigation even if no accessibility service
   would like to participate/customize the interaction model.

bug:5932640

Change-Id: Id8194293bd94097b455e9388b68134a45dc3b8fa
2012-04-19 22:08:42 -07:00
Svetoslav Ganov
005b83b0c6 Adding some more gestures and actions for accessibility.
1. Added more gesture for accessibility. After a meeting
   with the access-eng team we have decided that the current
   set of gestures may be smaller than needed considering
   that we will use four gestures for home, back, recents,
   and notifications.

2. Adding actions for going back, home, opening the recents,
   and opening the notifications.

3. Added preliminary mapping from some of the new gestures
   to the new actions.

4. Fixed a bug in the accessibility interaction controller
   which was trying to create a handled on the main looper
   thread which may be null if the queried UI is in the
   system process. Now the context looper of the root view
   is used.

5. Fixed a bug of using an incorrect constant.

6. Added a missing locking in a couple of places.

7. Fixed view comparison for accessibilityt since it was
   not anisymmetric.

bug:5932640
bug:5605641

Change-Id: Icc983bf4eafefa42b65920b3782ed8a25518e94f
2012-04-18 13:43:55 -07:00
Svetoslav Ganov
31725b3f38 Fixing a regression I have introduced.
bug:6344558

Change-Id: Ie726e091942e337962baa052953002be724068b1
2012-04-16 19:29:43 -07:00
Svetoslav Ganov
4213804541 Accessibility focus - framework
Usefulness: Keep track of the current user location in the screen when
            traversing the it. Enabling structural and directional
            navigation over all elements on the screen. This enables
            blind users that know the application layout to efficiently
            locate desired elements as opposed to try touch exploring the
            region where the the element should be - very tedious.

Rationale: There are two ways to implement accessibility focus One is
           to let accessibility services keep track of it since they
           have access to the screen content, and another to let the view
           hierarchy keep track of it. While the first approach would
           require almost no work on our part it poses several challenges
           which make it a sub-optimal choice. Having the accessibility focus
           in the accessibility service would require that service to scrape
           the window content every time it changes to sync the view tree
           state and the accessibility focus location. Pretty much the service
           will have to keep an off screen model of the screen content. This
           could be quite challenging to get right and would incur performance
           cost for the multiple IPCs to repeatedly fetch the screen content.
           Further, keeping virtual accessibility focus (i.e. in the service)
           would require sync of the input and accessibility focus. This could
           be challenging to implement right as well. Also, having an unlimited
           number of accessibility services we cannot guarantee that they will
           have a proper implementation, if any, to allow users to perform structural
           navigation of the screen content. Assuming two accessibility
           services implement structural navigation via accessibility focus,
           there is not guarantee that they will behave similarly by default,
           i.e. provide some standard way to navigate the screen content.
           Also feedback from experienced accessibility researchers, specifically
           T.V Raman, provides evidence that having virtual accessibility focus
           creates many issues and it is very hard to get right.
           Therefore, keeping accessibility focus in the system will avoid
           keeping an off-screen model in accessibility services, it will always
           be in sync with the state of the view hierarchy and the input focus.
           Also this will allow having a default behavior for traversing the
           screen via this accessibility focus that is consistent in all
           accessibility services. We provide accessibility services with APIs to
           override this behavior but all of them will perform screen traversal
           in a consistent way by default.

Behavior:  If accessibility is enabled the accessibility focus is the leading one
           and the input follows it. Putting accessibility focus on a view moves
           the input focus there. Clearing the accessibility focus of a view, clears
           the input focus of this view. If accessibility focus is on a view that
           cannot take input focus, then no other view should have input focus.
           In accessibility mode we initially give accessibility focus to the topmost
           view and no view has input focus. This ensures consistent behavior accross
           all apps. Note that accessibility focus can move hierarchically in the
           view tree and having it at the root is better than putting it where the
           input focus would be - at the first input focusable which could be at
           an arbitrary depth in the view tree. By default not all views are reported
           for accessibility, only the important ones. A view may be explicitly labeled
           as important or not for accessibility, or the system determines which one
           is such - default. Important views for accessibility are all views that are
           not dumb layout managers used only to arrange their chidren. Since the same
           content arrangement can be obtained via different combintation of layout
           managers, such managers cannot be used to reliably determine the application
           structure. For example, a user should see a list as a list view with several
           list items and each list item as a text view and a button as opposed to seeing
           all the layout managers used to arrange the list item's content.
           By default only important for accessibility views are regared for accessibility
           purposes. View not regarded for accessibility neither fire accessibility events,
           nor are reported being on the screen. An accessibility service may request the
           system to regard all views. If the target SDK of an accessibility services is
           less than JellyBean, then all views are regarded for accessibility.
           Note that an accessibility service that requires all view to be ragarded for
           accessibility may put accessibility focus on any view. Hence, it may implement
           any navigational paradigm if desired. Especially considering the fact that
           the system is detecting some standard gestures and delegates their processing
           to an accessibility service. The default implementation of an accessibility
           services performs the defualt navigation.

bug:5932640
bug:5605641

Change-Id: Ieac461d480579d706a847b9325720cb254736ebe
2012-04-13 19:05:24 -07:00
Svetoslav Ganov
57c7fd5a43 Fixing issues with the AccessibilityNodeInfo cache.
1. Before there were two caches one in the app process that
   kept track only the ids of infos that were given to a
   querying client and one in the querying client that
   holds the infos. This design requires precise sync
   between the caches. Doing that is somehow complicated
   since the app has cache for each window and it has
   to intercept all accessibility events from that window
   to manage the cache. Each app has to have a cache for
   each querying client. This approach would guarantee that
   no infos are fetched twice but due to its stateful nature
   and the two caches is tricky to implement and adds
   unnecessary complexity. Now there is only one cache in
   the client and the apps are stateless. The client is
   passing flags to the app that are a clue what nodes to
   prefetch. This approach may occasionally fetch a node
   twice but it is considerably simpler and stateless
   from the app perspective - there is only one cache.
   Fetching a node more than once does not cause much
   overhead compared to the IPC.

Change-Id: Ia02f6fe4f82cff9a9c2e21f4a36747de0f414c6f
2012-02-23 18:51:04 -08:00
Svetoslav Ganov
0d04e24553 Improving accessibility APIs used for UI automation.
1. UiTestAutomationBridge was accessing the root node in the
   active window by tracking the accessibility event stream
   and keeping the last active window changing event. Now
   the bridge is stateless and the root node is fetched by
   passing special window and view id with the request to
   the system.

2. AccessibilityNodeInfos that are cached were not finished,
   i.e. not sealed, causing exception when trying to access
   their children or rpedecessors.

3. AccessibilityManagerService was not properly restoring its
   state after the UI automation bridge disconnects from it.
   I particular the devices was still in explore by touch mode
   event if no services are enabled and the sutomation bridge
   is disconnected.

4. ViewRootImpl for the focused window now fires accessibility
   events when accessibility is enabled to allow accessibility
   services to determine the current user location.

5. Several missing null checks in ViewRootImpl are fixed since
   there were scenraios in which a NPE can occur.

6. Update the internal window content querying tests.

7. ViewRootImpl was firing one extra focus event.
bug:6009813
bug:6026952

Change-Id: Ib2e058d64538ecc268f9ef7a8f36ead047868a05
2012-02-21 17:09:09 -08:00
Svetoslav Ganov
9b666d0faa UI automation service disconnected upon package change.
1. The AccessibilityManagerService used to disable the IU
   automation service on package change. This behavior
   was incorrect since the automation service has to
   survive package installations.

bug:5975207

Change-Id: Idb5e76d02625c333a5842a6b5c5bc90c9b9634c9
2012-02-10 14:55:45 -08:00
Svetoslav Ganov
79311c4af8 Speedup the accessibility window querying APIs and clean up.
1. Now when an interrogating client requires an AccessibilibtyNodeInfo
   we aggressively prefetch all the predecessors of that node and its
   descendants. The number of fetched nodes in one call is limited to
   keep the APIs responsive. The prefetched nodes infos are cached in
   the client process. The node info cache is invalidated partially or
   completely based on the fired accessibility events. For example,
   TYPE_WINDOW_STATE_CHANGED event clears the cache while
   TYPE_VIEW_FOCUSED removed the focused node from the cache, etc.
   Note that the cache is only for the currently active window.
   The ViewRootImple also keeps track of only the ids of the node
   infos it has sent to each querying process to avoid duplicating
   work. Usually only one process will query the screen content
   but we support the general case. Also all the caches are
   automatically invalidated so not additional bookkeeping is
   required. This simple strategy leads to 10X improving the
   speed of the querying APIs.

2. The Monkey and UI test automation framework  were registering a
   raw event listener for accessibility events and hence perform
   connection and cache management in similar way to an AccessibilityService.
   This is fragile and requires the implementer to know internal framework
   stuff. Now the functionality required by the Monkey and the UI automation
   is encapsulated in a new UiTestAutomationBridge class. To enable this
   was requited some refactoring of AccessibilityService.

3. Removed the *doSomethiong*InActiveWindow methods from the
   AccessibilityInteractionClient and the AccessibilityInteractionConnection.
   The function of these methods is implemented by the not *InActiveWindow
   version while passing appropriate constants.

4. Updated the internal window Querying tests to use the new
   UiTestAutomationBridge.

5. If the ViewRootImple was not initialized the querying APIs of
   the IAccessibilityInteractionConnection implementation were
   returning immediately without calling the callback with null.
   This was causing the client side to wait until it times out. Now
   the client is notified as soon as the call fails.

6. Added a check to guarantee that Views with AccessibilityNodeProvider
   do not have children.

bug:5879530

Change-Id: I3ee43718748fec6e570992c7073c8f6f1fc269b3
2012-01-23 20:13:58 -08:00
Svetoslav Ganov
f3b4f3163b resolved conflicts for merge of 26f7a81f to master
Change-Id: I6bf5fd7c0de7945cef84602dbe3a7bbed587700f
2011-11-30 18:34:56 -08:00
Svetoslav Ganov
d116d7c78a Fixing memory leaks in the accessiiblity layer.
1. AccessibilityInteractionConnections were removed from the
   AccessiiblityManagerService but their DeathRecipents were
   not unregistered, thus every removed interaction connection
   was essentially leaking. Such connection is registered in
   the system for every ViewRootImpl when accessiiblity is
   enabled and inregistered when disabled.

2. Every AccessibilityEvent and AccessiilbityEventInfo obtained
   from a widnow content querying accessibility service had a
   handle to a binder proxy over which to make queries. Hoewever,
   holding a proxy to a remote binder prevents the latter from
   being garbage collected. Therefore, now the events and infos
   have a connection id insteand and the hindden singleton
   AccessiiblityInteaction client via which queries are made
   has a registry with the connections. This class looks up
   the connection given its id before making an IPC. Now the
   connection is stored in one place and when an accessibility
   service is disconnected the system sets the connection to
   null so the binder object in the system process can be GCed.
   Note that before this change a bad implemented accessibility
   service could cache events or infos causing a leak in the
   system process. This should never happen.

3. SparseArray was not clearing the reference to the last moved
   element while garbage collecting thus causing a leak.

bug:5664337

Change-Id: Id397f614b026d43bd7b57bb7f8186bca5cdfcff9
2011-11-29 18:51:30 -08:00
Svetoslav Ganov
021078554b Adding APIs to enable reporting virtual view hierarchies to accessibility serivces.
Added an interface that is the contract for a client to expose a virtual
view hierarchy to accessibility services. Clients impement this interface
and set it in the View that is the root of the virtual sub-tree. Adding
this finctionality via compostion as opposed to inheritance enables apps
to maintain backwards compatibility by setting the accessibility virtual
hierarchy provider on the View only if the API version is high enough.

bug:5382859

Change-Id: I7e3927b71a5517943c6cb071be2e87fba23132bf
2011-10-21 11:45:44 -07:00
Svetoslav Ganov
b6eca6e669 Accessibility test automation API not working.
1. Due to a previous change that disabled accessibility if not enabled
   and installed serivces are present the automation APIs stopped working
   since they use fake automation service that is not installed.

2. Added clean up of death recipients when binders die.

bug:5374662
bug:5239044

Change-Id: I1f3c8cd1d1c79753a4a64e2b8b2963025abb2939
2011-10-06 14:16:03 -07:00
Svetoslav Ganov
1e741b2705 System not checking if enabled services are installed when disabling accessibility.
The system is didabling accessiblity if no accessibility serivces are enabled
to avoid sending events across processes if no recipients are present. The
check considers enabled services which may not have been installed. Now the
check is made against enabled and installed serivces.

bug:5347273

Change-Id: Iad391a1a5bf0bbca470584bc8392f35821ba768c
2011-09-20 15:50:10 -07:00
Svetoslav Ganov
ea515aeafa Update the public APIs for finding views by text to optionally use content description.
1. Added flags to the search method to specify whether to match text or
   content description or both.

2. Added test case for the seach by content description.

3. Updated the code in AccessibilityManager service to reflect the latest
   changes there so test automation service works - this is the fake
   service used for UI automation.

Change-Id: I14a6779a920ff0430e78947ea5aaf876c2e66076
2011-09-14 19:40:33 -07:00
Svetoslav Ganov
d07d60b9bc AccessibilityManagerService not registered for removed packages.
The pakcage monitor in the AccessibilityManagerService was not
watching for packages that are removed. This is needes since
1) we need to remove the package from the enabled accessibility
serivces and clean up after the removed serivice; 2) we need to
disable accessibility if the last access serivices went away.

Change-Id: I06d33b411ce60703e5a2843107323ffc87046c16
2011-09-14 11:41:40 -07:00
Svetoslav Ganov
37fedf8b78 Disable accessibility if all accessibility serivces are disbaled.
Accessibility was kept enabled even if all accessibility services
are disabled (explicitly by the user or removed) which was causing
the system to fire accessibility events that will never be consumed.

Change-Id: Ifb03e786ac0106687252bd1979725ffd724ad1c5
2011-09-14 10:49:08 -07:00
Svetoslav Ganov
8bd69610aa Intra-process view hierarchy interrogation does not work.
The content retrieval APIs are synchronous from a client's
perspective but internally they are asynchronous. The client thread
calls into the system requesting an action and providing a callback
to receive the result after which it waits up to a timeout for that
result. The system enforces security and then delegates the request
to a given view hierarchy where a message is posted (from a binder
thread) describing what to be performed by the main UI thread the
result of which it delivered via the mentioned callback. However,
the blocked client thread and the main UI thread of the target view
hierarchy can be the same one, for example an accessibility service
and an activity run in the same process, thus they are executed on the
same main thread. In such a case the retrieval will fail since the UI
thread that has to process the message describing the work to be done
is blocked waiting for a result is has to compute! To avoid this scenario
when making a call the client also passes its process and thread ids so
the accessed view hierarchy can detect if the client making the request
is running in its main UI thread. In such a case the view hierarchy,
specifically the binder thread performing the IPC to it, does not post a
message to be run on the UI thread but passes it to the singleton
interaction client through which all interactions occur and the latter is
responsible to execute the message before starting to wait for the
asynchronous result delivered via the callback. In this case the expected
result is already received so no waiting is performed.

bug:5138933

Change-Id: I382e2d8689f5189110226613c2387f553df98bd3
2011-08-24 16:26:43 -07:00
Svetoslav Ganov
a31f5e6374 InputFilter not updated on global accessibility change.
Change-Id: I35fd5fa078840abf62a3d5eac66b2eae1a79d01d
2011-07-28 20:18:10 -07:00
Svetoslav Ganov
4e2a762eae Not user generated accessibility events can change the interrogation allowing window.
1. Events not generated by the user can change the interrogation allowing window
   unpredicatably. For example when a ListView lays out its children it fires an
   accessibility events and changes the currently active window while the user
   interaction may be happening in another window say a dialog. Now the interrogation
   allowing window is changed when a new window is shown or the user has touch
   explored it.

bug:5074116

Change-Id: I8dde12bbec807d32445a781eedced9b95312b3e2
2011-07-26 20:08:50 -07:00
Svetoslav Ganov
00aabf7d18 Touch exploration state set to clients asynchronously and depended on talking service being enabled.
1. Upon registration of an accessibility client the latter received only
   the accessiiblity state and waiting for the touch exploration state
   to be sent by the system in async manner. This led the very first
   check of touch exploration state is checked a wrong value to be reported.
   Now a state of the accessibility layer is returned to the client
   upon registration.

2. Removing the dependency on talking accessibility service to be enabled
   for getting into touch exploration mode. What if the user wants to use
   an accessibility service that shows a dialog with the text of the touched
   view?

bug:5051546

Change-Id: Ib377babb3f560929ee73bd3d8b0d277341ba23f7
2011-07-22 17:38:54 -07:00
Svetoslav Ganov
35bfedeaba Touch exploration separate setting and API to poll the latter state.
1. Seperated touch exploration to be a seperate setting rather being
   magically enabled by the system of accessiiblity is on the there
   is at leas one accessibility service that speaks enabled. Now
   there is a setting for requesting touch exploration but still the
   system will enabled it only if that makes sense i.e. accessibility
   is on and one accessibility service that speaks is enabled.

2. Added public API for checking of touch exploration is enabled.

3. Added description attribute in accessibility service declaration
   which will be shown to the user before enabling the service.

4. Added API for quick cloning of AccessibilityNodeInfo.

5. Added clone functionality to SparseArray, SparseIntArray, and
   SparseBooleanArray.

bug:5034010
bug:5033928

Change-Id: Ia442edbe55c20309244061cd9d24e0545c01b54f
2011-07-18 12:44:08 -07:00
Svetoslav Ganov
4a49d9fe52 Throw an exception if accessibility service has not requested to retrieve window content.
1. If an accessibility service does not request access to the window
   content and does so, an exception is thrown to point the developer
   to the reason.

bug:5038284

Change-Id: Ibf08f4d2c8ad8939c4f4c2e288048a4f8ff1e31b
2011-07-17 12:22:14 -07:00
Svetoslav Ganov
63c04eeb00 Touch exploration gesture events change the window id.
1. Touch exploration start and end events are generated
   by the sytstem to provide additional information for
   accessibility services. Since such events do not come
   from any particular window they whould not change the
   id of the window that currently allows exploring its
   content.

2. Touch exploration start and end events were lealing the
   touch explorer class wich is private.

bug:5026258

Change-Id: Icaf3e2bd9566716f2afb876cf8e0d50813b0c76e
2011-07-13 17:22:15 -07:00
Svetoslav Ganov
e8f95352cf Addressing comments during security review of the interrogation feature.
1. Pretty much minor fixes for improving readability.

Change-Id: I76efdcc574af9a277b54eeb9fb5caf34948fcfde
2011-07-06 17:24:54 -07:00
Svetoslav Ganov
b96a41136a Fatal system crash due to NullPointerException
1. Due to thread interleaving it was possible that
   two messages are sent for requesting dispatch of
   the same accessibility event and since the first
   one sends the event and removes it from the pending
   list the second message pulls null during the event
   lookup. Look at the patch's comments for a detailed
   scenario and rationale of the fix.

bug:4886129

Change-Id: If8b272ceaec7709c659ae502c3a730e63c939172
2011-06-28 03:05:10 -07:00
Svetoslav Ganov
a0156177cd Added scroll and text selection change accessibility events.
1. Added scrolling accessibility event to provicde feedback
   when a view is scrolled.

Note: We need scroll events for ICS since even though we have
      touch exploration the user does not know when something
      is scrollable and not feedback is provided while scrolling.

bug:4902097

2. Added a text selection change event to provide feedback
   for selection changes including cursor movement.

Note: We need the text selection change events for ICS since
      even though the IME supports navigation in text fields
      the user receives no feedback for the current selection/
      cursor position.

bug:4586186

3. Added a scrollable property to both AccessibilityEvent and
   AccessibilityNodeInfo. The info has to describe the source
   in terms of all properties that make sense for accessibility
   purposes and the event has this property (kinda duplicated)
   since clients will aways want to know if the source is
   scrollable to provided clue to the user and we want to avoid
   pulling the info of the source for every accessibility event.

Change-Id: I232d6825da78e6a12d52125f51320217e6fadb11
2011-06-26 21:35:22 -07:00
Svetoslav Ganov
1ecc1e098a Minor tweak I forgot in the presious change.
Change-Id: I17854e3c824bea5b6c0ffeea45f986f0b5297054
2011-06-22 11:40:13 -07:00
Svetoslav Ganov
7961be75f4 AccessibilityNodeInfo bounds inconsistent with compatibility mode.
1. In compatibility mode a window wide scaling is applied to stretch
   the content. However, AccessibilityNodeInfos retrieved from that
   window contain bounds in application's view of the world and need
   to be scaled to properly relect what a sighted user sees.

Change-Id: Iebbb99526fc327f45b5cede89ba8c32e6ebd8845
2011-06-21 13:02:03 -07:00
Svetoslav Ganov
9dc98e3d17 Accessiiblity in right state upon connection of a test agent.
1. Enabling accessibility and disabling all enabled
   accessibility service when a test client connects
   the the AccessibilityManagerService.

Change-Id: I2f40cccaa0035ac1454d8c5ac84678c1542a0229
2011-06-16 16:12:36 -07:00
Svetoslav Ganov
eeee4d2c01 Final polish of the interrogation feature.
1. Added a new event type for notifying client accessibilitiy
   services for changes in the layout. The event is fired at
   most once for a given time frame and is delivered to clients
   only if it originates from the window that can be interrogated.

2. Exposed the findByText functionality in AccessibilityNodeInfo.
   This is very useful for an accessibility service since it allows
   searching for something the user knows is on the screen thus
   avoiding touch exploring the content. Touch exploring is
   excellent for learning the apps but knowing them search is
   much faster.

3. Fixed a bug causing an accessibiliby service not to receive
   the event source in case of more than one service is registered
   and one of them does not have paermission to interrogate the window.
   The same event was dispatched to multiple services but if one
   of them does not have interrogation permission the event is
   modified to remove the source causing subsequent serivices not
   to get the later.

4. Moved the getSource setSource methods to AccessibilityRecord
   instead in AccessibilityEvent.

5. Hiden some protected members in AccessibilityRecod which should
   not be made public since getters exist.

6. Added the View absolute coordinates in the screen to AccessibilityNodeInfo.
   This is needed for fast computation of relative positions of
   views from accessibility - common use case for the later.

7. Fixed a couple of marshalling bugs.

8. Added a test for the object contract of AccessibilityNodeInfo.

Change-Id: Id9dc50c33aff441e4c93d25ea316c9bbc4bd7a35
2011-06-10 21:10:46 -07:00
Svetoslav Ganov
8643aa0179 Interrogation of the view hierarchy from an AccessibilityService.
1. Views are represented as AccessibilityNodeInfos to AccessibilityServices.

2. An accessibility service receives AccessibilityEvents and can ask
   for its source and gets an AccessibilityNodeInfo which can be used
   to get its parent and children infos and so on.

3. AccessibilityNodeInfo contains some attributes and actions that
   can be performed on the source.

4. AccessibilityService can request the system to preform an action
   on the source of an AccessibilityNodeInfo.

5. ViewAncestor provides an interaction connection to the
   AccessibiltyManagerService and an accessibility service uses
   its connection to the latter to interact with screen content.

6. AccessibilityService can interact ONLY with the focused window
   and all calls are routed through the AccessibilityManagerService
   which imposes security.

7. Hidden APIs on AccessibilityService can find AccessibilityNodeInfos
   based on some criteria. These API go through the AccessibilityManagerServcie
   for security check.

8. Some actions are hidden and are exposes only to eng builds for UI testing.

Change-Id: Ie34fa4219f350eb3f4f6f9f45b24f709bd98783c
2011-06-06 18:46:03 -07:00
Svetoslav Ganov
c321c19fc9 Fixing a bug I introduced during my last merge.
Change-Id: I6474ca94a6ef9bd17a5670a4baa51673f3c2f5d0
2011-06-03 19:49:00 -07:00
Svetoslav Ganov
f9886f3ee9 AccessiblityManagerService not cleaning up dead binders.
1. AccessibilityManagerService was keeping handles to dead
   IAccessibilitymanagerClients - now doing so.

2. AccessibilityManagerService was lazily cleaning up dead
   IAccessibilityServiceConnections - now using a callback.

3. Cleaned up the book keeping of enabled services.

4. Fixed a bug that the input filter is still enabled
   when disabling accessibility.

Change-Id: I5e9af7ab684a3b71e8ee51125b1262a17e960eb0
2011-06-01 20:32:09 -07:00
Svetoslav Ganov
cc4053e031 Accessibility serviceconfiguration via meta-data
Note: This is a part of two CL change and contains the
      system changes without updates to the settings.

1. Added a mechanism for configuring an accessibility service via
   XML file specified in a meta-data tag (similar to IMEs).

2. Added property for specifying a settings activity for an
   accessibility service.

3. Refactored the APIs in AccessibilityManager to return
   lists of AccessiblityServiceInfo instead ServiceInfo
   since the former describes an AccessibilityService in
   particular (similar to IMEs).

Change-Id: Ie8781bb7e0cdb329e583b6702a612a507367ad7b
2011-05-31 12:04:18 -07:00
Svetoslav Ganov
a3e261d506 The accessibility input filter state was not unregistered when
no spoken feedback accessibility services are regitstered.

bug:4343996

Change-Id: Ie709ac24baa084cf3627d6adb6caf1550c399f8b
2011-04-27 12:06:28 -07:00
Svetoslav Ganov
736c2756bf Touch exploration feature, event bubling, refactor
1. Added an Input Filter that interprets the touch screen motion
   events to perfrom accessibility exploration. One finger explores.
   Tapping within a given time and distance slop on the last exlopred
   location does click and long press, respectively. Two fingers close
   and in the same diretion drag. Multiple finglers or two fingers in
   different directions or two fingers too far away are delegated to
   the view hierarchy. Non moving fingers "accidentally grabbed the
   device for the scrren" are ignored.

2. Added accessibility events for hover enter, hover exit, touch
   exoloration gesture start, and end. Accessibility hover events
   are fired by the hover pipeline. An accessibility event is
   dispatched up the view tree and the topmost view fires it.
   Thus predecessors can augment the fired event. An accessibility
   event has several records and a predecessor can optionally
   modify, delete, and add such to the event.

3. Added onPopulateAccessibilityEvent and refactored the existing
   accessibility code to use it.

4. Added API for querying the currently enabled accessibility services
   by feedback type.

Change-Id: Iea2258c07ffae9491071825d966dc453b07e5134
2011-04-22 18:30:43 -07:00
Adam Powell
3fb3d7c4e7 Revert "Touch exploration feature, event bubling, refactor"
This reverts commit ac84d3ba81.

There seems to be a problem with this API change. Reverting for now to
fix the build.

Change-Id: Ifa7426b080651b59afbcec2d3ede09a3ec49644c
2011-04-22 17:23:44 -07:00
Svetoslav Ganov
ac84d3ba81 Touch exploration feature, event bubling, refactor
1. Added an Input Filter that interprets the touch screen motion
   events to perfrom accessibility exploration. One finger explores.
   Tapping within a given time and distance slop on the last exlopred
   location does click and long press, respectively. Two fingers close
   and in the same diretion drag. Multiple finglers or two fingers in
   different directions or two fingers too far away are delegated to
   the view hierarchy. Non moving fingers "accidentally grabbed the
   device for the scrren" are ignored.

2. Added accessibility events for hover enter, hover exit, touch
   exoloration gesture start, and end. Accessibility hover events
   are fired by the hover pipeline. An accessibility event is
   dispatched up the view tree and the topmost view fires it.
   Thus predecessors can augment the fired event. An accessibility
   event has several records and a predecessor can optionally
   modify, delete, and add such to the event.

3. Added onPopulateAccessibilityEvent and refactored the existing
   accessibility code to use it.

4. Added API for querying the currently enabled accessibility services
   by feedback type.

Change-Id: Iec03c6c3fe298de3f14cb6efdbb9b198cd531a0c
2011-04-21 18:33:52 -07:00
Joe Onorato
43a17654cf Remove the deprecated things from Config.java. These haven't been working since before 1.0.
Change-Id: Ic2e8fa68797ea9d486f4117f3d82c98233cdab1e
2011-04-07 19:23:05 -07:00