diff --git a/samples/Support4Demos/AndroidManifest.xml b/samples/Support4Demos/AndroidManifest.xml
index 6a05b73bd..6d71b039a 100644
--- a/samples/Support4Demos/AndroidManifest.xml
+++ b/samples/Support4Demos/AndroidManifest.xml
@@ -226,5 +226,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/Support4Demos/res/layout/accessibility_delegate.xml b/samples/Support4Demos/res/layout/accessibility_delegate.xml
new file mode 100644
index 000000000..333f90d9f
--- /dev/null
+++ b/samples/Support4Demos/res/layout/accessibility_delegate.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/samples/Support4Demos/res/layout/accessibility_manager.xml b/samples/Support4Demos/res/layout/accessibility_manager.xml
new file mode 100644
index 000000000..e8814c49f
--- /dev/null
+++ b/samples/Support4Demos/res/layout/accessibility_manager.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/Support4Demos/res/values/strings.xml b/samples/Support4Demos/res/values/strings.xml
index 4e8d9de2a..8f70fd386 100644
--- a/samples/Support4Demos/res/values/strings.xml
+++ b/samples/Support4Demos/res/values/strings.xml
@@ -102,4 +102,24 @@
Start Service
Stop Service
+
+
+ Accessibility/Accessibility Manager
+
+ 1. Enable TalkBack from Settings->Accessibility.
+ \n2. Go back to this activity.
+ \n3. Disable TalkBack from Settings->Accessibility.
+ No enabled accessibility services or API level lower than ICS.
+ ENABLED ACCESSIBILITY SERVICES:
+ \n\nService: %1$s\nFeedback: %2$s\nDescription: %3$s\nSettings: %4$s\n
+ Accessibility enabled: %1$s
+
+ Accessibility/Accessibility Delegate
+
+ 1. Enable TalkBack from Settings->Accessibility.
+ \n2. Go back to this activity.
+ \n3. Touch the button below.
+ Button
+ Custom text added via an accessibility delegate.
+
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
new file mode 100644
index 000000000..6fcf855d5
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.accessibility;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+
+import com.example.android.supportv4.R;
+
+/**
+ * This class demonstrates how to use the support library to register
+ * a View.AccessibilityDelegate that customizes the accessibility
+ * behavior of a View. Aiming to maximize simplicity this example
+ * tweaks the text reported to accessibility services but using
+ * these APIs a client can inject any accessibility functionality into
+ * a View.
+ */
+public class AccessibilityDelegateSupportActivity extends Activity {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.accessibility_delegate);
+ }
+
+ /**
+ * This class represents a View that is customized via an AccessibilityDelegate
+ * as opposed to inheritance. An accessibility delegate can be used for adding
+ * accessibility to custom Views, i.e. ones that extend classes from android.view,
+ * in a backwards compatible fashion. Note that overriding a method whose return
+ * type or arguments are not part of a target platform APIs makes your application
+ * not backwards compatible with that platform version.
+ */
+ public static class AccessibilityDelegateSupportView extends View {
+
+ public AccessibilityDelegateSupportView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ installAccessibilityDelegate();
+ }
+
+ private void installAccessibilityDelegate() {
+ // The accessibility delegate enables customizing accessibility behavior
+ // via composition as opposed as inheritance. The main benefit is that
+ // one can write a backwards compatible application by setting the delegate
+ // only if the API level is high enough i.e. the delegate is part of the APIs.
+ // The easiest way to achieve that is by using the support library which
+ // takes the burden of checking API version and knowing which API version
+ // introduced the delegate off the developer.
+ ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() {
+ @Override
+ public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+ super.onPopulateAccessibilityEvent(host, event);
+ // Note that View.onPopulateAccessibilityEvent was introduced in
+ // ICS and we would like to tweak a bit the text that is reported to
+ // accessibility services via the AccessibilityEvent.
+ event.getText().add(getContext().getString(
+ R.string.accessibility_delegate_custom_text_added));
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host,
+ AccessibilityNodeInfoCompat info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ // Note that View.onInitializeAccessibilityNodeInfo was introduced in
+ // ICS and we would like to tweak a bit the text that is reported to
+ // accessibility services via the AccessibilityNodeInfo.
+ info.setText(getContext().getString(
+ R.string.accessibility_delegate_custom_text_added));
+ }
+ });
+ }
+ }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
new file mode 100644
index 000000000..1004270ab
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.accessibility;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.Activity;
+import android.app.Service;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.support.v4.android.accessibilityservice.AccessibilityServiceInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityManagerCompat;
+import android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.android.supportv4.R;
+
+import java.util.List;
+
+/**
+ *
+ * This class demonstrates how to use the support library to register
+ * an AccessibilityManager.AccessibilityStateChangeListener introduced
+ * in ICS to watch changes to the global accessibility state on the
+ * device in a backwards compatible manner.
+ *
+ *
+ * This class also demonstrates how to use the support library to query
+ * information about enabled accessibility services via APIs introduced
+ * in ICS in a backwards compatible manner.
+ *
+ */
+public class AccessibilityManagerSupportActivity extends Activity {
+
+ /** Handle to the accessibility manager service. */
+ private AccessibilityManager mAccessibilityManager;
+
+ /** Handle to the View showing accessibility services summary */
+ private TextView mAccessibilityStateView;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.accessibility_manager);
+ mAccessibilityManager = (AccessibilityManager) getSystemService(
+ Service.ACCESSIBILITY_SERVICE);
+ mAccessibilityStateView = (TextView) findViewById(R.id.accessibility_state);
+ registerAccessibilityStateChangeListener();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateAccessibilityStateView();
+ }
+
+ /**
+ * Registers an AccessibilityStateChangeListener that show a Toast
+ * when the global accessibility state on the device changes.
+ */
+ private void registerAccessibilityStateChangeListener() {
+ // The AccessibilityStateChange listener APIs were added in ICS. Therefore to be
+ // backwards compatible we use the APIs in the support library. Note that if the
+ // platform API version is lower and the called API is not available no listener
+ // is added and you will not receive a call of onAccessibilityStateChanged.
+ AccessibilityManagerCompat.addAccessibilityStateChangeListener(mAccessibilityManager,
+ new AccessibilityStateChangeListenerCompat() {
+ @Override
+ public void onAccessibilityStateChanged(boolean enabled) {
+ Toast.makeText(AccessibilityManagerSupportActivity.this,
+ getString(R.string.accessibility_manager_accessibility_state, enabled),
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+ /**
+ * Updates the content of a TextView with description of the enabled
+ * accessibility services.
+ */
+ private void updateAccessibilityStateView() {
+ // The API for getting the enabled accessibility services based on feedback
+ // type was added in ICS. Therefore to be backwards compatible we use the
+ // APIs in the support library. Note that if the platform API version is lower
+ // and the called API is not available an empty list of services is returned.
+ List enabledServices =
+ AccessibilityManagerCompat.getEnabledAccessibilityServiceList(mAccessibilityManager,
+ AccessibilityServiceInfo.FEEDBACK_SPOKEN);
+ if (!enabledServices.isEmpty()) {
+ StringBuilder builder = new StringBuilder();
+ final int enabledServiceCount = enabledServices.size();
+ for (int i = 0; i < enabledServiceCount; i++) {
+ AccessibilityServiceInfo service = enabledServices.get(i);
+ // Some new APIs were added in ICS for getting more information about
+ // an accessibility service. Again accessed them via the support library.
+ ResolveInfo resolveInfo = AccessibilityServiceInfoCompat.getResolveInfo(service);
+ String serviceDescription = getString(
+ R.string.accessibility_manager_enabled_service,
+ resolveInfo.loadLabel(getPackageManager()),
+ AccessibilityServiceInfoCompat.feedbackTypeToString(service.feedbackType),
+ AccessibilityServiceInfoCompat.getDescription(service),
+ AccessibilityServiceInfoCompat.getSettingsActivityName(service));
+ builder.append(serviceDescription);
+ }
+ mAccessibilityStateView.setText(builder);
+ } else {
+ // Either no services or the platform API version is not high enough.
+ mAccessibilityStateView.setText(getString(
+ R.string.accessibility_manager_no_enabled_services));
+ }
+ }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html
new file mode 100644
index 000000000..03f2fba93
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html
@@ -0,0 +1,20 @@
+
+This section includes samples showing the use of the accessibility
+features of the static support library.
+
+Accessibility Manager
+
+ - Accessibility Manager
+ - This sample demonstrates how to use the support library to register an
+ AccessibilityManager.AccessibilityStateChangeListener to watch changes to
+ the global accessibility state and AccessibilityManager to query information
+ about enabled accessibility services.
+
+
+Accessibility Delegate
+
+ - AccessibilityDelegate
+ - This sample demonstrates how to use the support library to register a
+ View.AccessibilityDelegate that customizes the accessibility behavior of
+ this View.
+