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.
+