SlideShare ist ein Scribd-Unternehmen logo
1 von 77
Downloaden Sie, um offline zu lesen
Accessibility in Action
@KellyShuster
Technical Solutions to the Accessibility Challenge
Schedule
What is Accessibility?
Android vs iOS
Exploring Android Accessibility Features
Coding Accessible Apps
What is Accessibility?
Mobility Impairment
Audio Impairment
Vision Impairment
Mobility Impairment
Dexterity
Issues
Com
plete
Paralysis
Mobility Impairment
Dexterity
Issues
Com
plete
Paralysis
48 dp Rhythm
Custom touch
& hold delay
Head switch
Sip & puff
EMG sensors
Audio Impairment
Hearing
Loss Com
plete
Deafness
Audio Impairment
Hearing
Loss Com
plete
Deafness
Audio notifications must
have visual component
System wide closed captioning
Visual Impairment
Color
Blindness
Com
plete
Blindness
Low
Vision
Visual Impairment
Color
Blindness
Com
plete
Blindness
Color
Settings
TalkBack
Low
Vision
Contrast
Settings
Android vs iOS
TalkBack (Donut) VoiceOver (iOS 3)
Poor Documentation
Smaller Community
Good Documentation
Larger Community
No Screen Blanking
No Quick On/Off
Screen blanking
Three Tap On/Off
OPEN! CLOSED!
How to Use TalkBack
TalkBack Basics
Touch to Explore
TalkBack Basics
Touch to Explore
Read through elements (swipe left or right)
TalkBack Basics
Touch to Explore
Read through elements (swipe left or right)
Double tap to select
TalkBack Basics
Touch to Explore
Read through elements (swipe left or right)
Double tap to select
Tap once to silence
TalkBack Basics
Touch to Explore
Read through elements (swipe left or right)
Double tap to select
Tap once to silence
Listen for “Earcon” clues
Special Gestures
Global
Context
Menu
BackHomeLocal
Context
Menu
Special Gestures
Global
Context
Menu
BackHomeLocal
Context
Menu
Development
Development Tips & Tricks
TalkBack on-off turns off USB debugging!
Development Tips & Tricks
TalkBack on-off turns off USB debugging!
TalkBack not supported in emulator
Development Tips & Tricks
TalkBack on-off turns off USB debugging!
TalkBack not supported in emulator
No screenshots allowed with TalkBack on
Development Tips & Tricks
TalkBack on-off turns off USB debugging!
TalkBack not supported in emulator
No screenshots allowed with TalkBack on
Work with QA
Demo
ImageView & ImageButton
Image with Meaning
Image with Meaning
<ImageView
android:id="@+id/image_bulbasaur_quiz"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_below="@id/text_question"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:contentDescription="@string/bulbasaur"
android:src="@drawable/bulbasaur" />
<ImageView
android:id="@+id/image_bulbasaur_quiz"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_below="@id/text_question"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:contentDescription="@string/bulbasaur"
android:src="@drawable/bulbasaur" />
Image with Meaning
Decorative Image
Decorative Image
<ImageView
android:id="@+id/image_border_1"
android:layout_width="120dp"
android:layout_height="30dp"
android:contentDescription="@null"
android:src="@drawable/ballons" />
<ImageView
android:id="@+id/image_border_1"
android:layout_width="120dp"
android:layout_height="30dp"
android:contentDescription="@null"
android:src="@drawable/ballons" />
Decorative Image
<ImageView
android:id="@+id/image_border_1"
android:layout_width="120dp"
android:layout_height="30dp"
android:contentDescription="@null"
android:src="@drawable/ballons" />
Decorative Image
States
States: Pokeball
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
States: Pokeball
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
States: Pokeball
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
States: Pokeball
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
States: Pokeball
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
States: Pokeball
mAllPokemon = (LinearLayout) findViewById(R.id.layout_all_pokemon);
mPokemonToggleButton = (ImageButton) findViewById(R.id.image_button_pokeball);
mPokemonToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
mAllPokemon.setVisibility(View.GONE);
mPokemonToggleButton.setImageResource(R.drawable.pokeball_closed);
mPokemonToggleButton.setContentDescription(getString(R.string.show_pokemon));
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
...
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
});
States: Pokeball
States: Pokemon Visibility
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
...
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mAllPokemon.announceForAccessibility(getString(R.string.now_showing_pokemon));
}
else{
mAllPokemon.setContentDescription(getString(R.string.now_showing_pokemon));
mAllPokemon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
States: Pokemon Visibility
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
...
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mAllPokemon.announceForAccessibility(getString(R.string.now_showing_pokemon));
}
else{
mAllPokemon.setContentDescription(getString(R.string.now_showing_pokemon));
mAllPokemon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
@Override
public void onClick(View v) {
if(mAllPokemon.getVisibility() == View.VISIBLE){
...
}
else {
mAllPokemon.setVisibility(View.VISIBLE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mAllPokemon.announceForAccessibility(getString(R.string.now_showing_pokemon));
}
else{
mAllPokemon.setContentDescription(getString(R.string.now_showing_pokemon));
mAllPokemon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
mPokemonToggleButton.setImageResource(R.drawable.pokeball_open);
mPokemonToggleButton.setContentDescription(getString(R.string.hide_pokemon));
}
}
States: Pokemon Visibility
EditText
<EditText
android:id="@+id/edit_demo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/text_view_different"
android:hint="@string/type_here"/>
EditText
<EditText
android:id="@+id/edit_demo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/text_view_different"
android:hint="@string/type_here"/>
EditText
TextView is Different for TalkBack
TextView is Different for TalkBack
<TextView
android:id="@+id/text_view_different"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text_view_clickable"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:contentDescription="@string/monday"
android:text="@string/mon"
android:textSize="20sp" />
<TextView
android:id="@+id/text_view_different"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text_view_clickable"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:contentDescription="@string/monday"
android:text="@string/mon"
android:textSize="20sp" />
TextView is Different for TalkBack
<TextView
android:id="@+id/text_view_different"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text_view_clickable"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:contentDescription="@string/monday"
android:text="@string/mon"
android:textSize="20sp" />
TextView is Different for TalkBack
Toasts & Appearing Items
Hidden TextView
@Override
public void onClick(View v) {
if(mHiddenTextView.getVisibility() == View.VISIBLE){
mHiddenTextView.setVisibility(View.GONE);
}
else {
mHiddenTextView.setVisibility(View.VISIBLE);
mHiddenTextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
}
Hidden TextView
@Override
public void onClick(View v) {
if(mHiddenTextView.getVisibility() == View.VISIBLE){
mHiddenTextView.setVisibility(View.GONE);
}
else {
mHiddenTextView.setVisibility(View.VISIBLE);
mHiddenTextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
}
Hidden TextView
Hidden TextView
mHiddenTextView = (TextView) findViewById(R.id.text_view_hidden);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mHiddenTextView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
}
Live Regions
Read Layout as Element
Read Layout as Element
// Note you must include v4 to use this.
// Make sure text is read on the *layout* for VI users, not on
// individual textViews
ViewCompat.setImportantForAccessibility(
mTextReadMe, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setImportantForAccessibility(
mTextAsA, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setImportantForAccessibility(
mTextSingle, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setImportantForAccessibility(
mTextItem, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
// Note you must include v4 to use this.
// Make sure text is read on the *layout* for VI users, not on
// individual textViews
ViewCompat.setImportantForAccessibility(
mTextReadMe, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setImportantForAccessibility(
mTextAsA, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setImportantForAccessibility(
mTextSingle, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setImportantForAccessibility(
mTextItem, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
Read Layout as Element
mLayoutAllText.setContentDescription(
mTextReadMe.getText().toString() + " " +
mTextAsA.getText().toString() + " " +
mTextSingle.getText().toString() + " " +
mTextItem.getText().toString() );
Read Layout as Element
CardView
CardView
CardView charmanderCard = (CardView) findViewById(R.id.card_view_charmander);
charmanderCard.setContentDescription(getString(R.string.charmander_access_details));
charmanderCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MaterialActivity.this, "Yay Charmander!", Toast.LENGTH_LONG).show();
}
});
CardView
CardView charmanderCard = (CardView) findViewById(R.id.card_view_charmander);
charmanderCard.setContentDescription(getString(R.string.charmander_access_details));
charmanderCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MaterialActivity.this, "Yay Charmander!", Toast.LENGTH_LONG).show();
}
});
Floating Action Button
FAB Traversal Order
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_material);
// Set Traversal Order for Accessibility so FAB isn't hard to access
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.floating_action_button);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
fab.setAccessibilityTraversalBefore(R.id.scroll_cards);
}
. . .
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_material);
// Set Traversal Order for Accessibility so FAB isn't hard to access
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.floating_action_button);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
fab.setAccessibilityTraversalBefore(R.id.scroll_cards);
}
. . .
}
FAB Traversal Order
@KellyShuster
KioKrofovitch/android-accessibility
Resources
Android Accessibility Documentation https://developer.android.com/guide/topics/ui/accessibility/index.html
Kelly’s Accessibility Demo App with Comments https://github.com/KioKrofovitch/android-accessibility
The 48dp Design Rhythm http://developer.android.com/design/style/metrics-grids.html#48dp-rhythm
New Accessibility Features in Lollipop http://www.androidcentral.com/accessibility-features-android-50-lollipop
VI Opinion: iOS vs Android https://takesugar.wordpress.com/2014/07/22/accessibility-head-to-head-android-vs-apple/
Fab Library https://github.com/futuresimple/android-floating-action-button
Credits:
Blind Institute of Technology http://blindinstituteoftechnology.org/
Case Study: Implementation of ADA on CU Boulder Campus, Ryan McDonald, June 2009

Weitere ähnliche Inhalte

Ähnlich wie Android Accessibility - DroidCon Berlin 2015

Supporting multi screen in android cn
Supporting multi screen in android cnSupporting multi screen in android cn
Supporting multi screen in android cnrffffffff007
 
Progressive Enhancement & Mobile [Funka 2012]
Progressive Enhancement & Mobile [Funka 2012]Progressive Enhancement & Mobile [Funka 2012]
Progressive Enhancement & Mobile [Funka 2012]Aaron Gustafson
 
What HTML5 Means for Web Accessibility
What HTML5 Means for Web AccessibilityWhat HTML5 Means for Web Accessibility
What HTML5 Means for Web Accessibilityklamping
 
Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...
Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...
Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...Raj Lal
 
Material design basics
Material design basicsMaterial design basics
Material design basicsJorge Barroso
 
Accessibility and Web Technologies @HTML5_Toronto
Accessibility and Web Technologies @HTML5_TorontoAccessibility and Web Technologies @HTML5_Toronto
Accessibility and Web Technologies @HTML5_TorontoGeorge Zamfir
 
Html 5 mobile - nitty gritty
Html 5 mobile - nitty grittyHtml 5 mobile - nitty gritty
Html 5 mobile - nitty grittyMario Noble
 
Is accessibility the new black?
Is accessibility the new black?Is accessibility the new black?
Is accessibility the new black?George Otoiu
 
[Project1] Information Virtual Reality [Exam]
[Project1] Information Virtual Reality [Exam][Project1] Information Virtual Reality [Exam]
[Project1] Information Virtual Reality [Exam]Yati Dumrongsukit
 
Supporting multi screen in android
Supporting multi screen in androidSupporting multi screen in android
Supporting multi screen in androidrffffffff007
 
Mobile Accessibility
Mobile AccessibilityMobile Accessibility
Mobile AccessibilityTed Drake
 
Breaking the Box: Pushing the Boundaries of UX with Drupal
Breaking the Box: Pushing the Boundaries of UX with DrupalBreaking the Box: Pushing the Boundaries of UX with Drupal
Breaking the Box: Pushing the Boundaries of UX with DrupalAcquia
 
OWF12/PAUG Conf Days Google tv part 1 (introduction) matt gaunt, advocate ...
OWF12/PAUG Conf Days Google tv part 1 (introduction)    matt gaunt, advocate ...OWF12/PAUG Conf Days Google tv part 1 (introduction)    matt gaunt, advocate ...
OWF12/PAUG Conf Days Google tv part 1 (introduction) matt gaunt, advocate ...Paris Open Source Summit
 
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]Mindfire Solutions
 
Intro to PhoneGap and PhoneGap Build
Intro to PhoneGap and PhoneGap BuildIntro to PhoneGap and PhoneGap Build
Intro to PhoneGap and PhoneGap BuildChris Griffith
 

Ähnlich wie Android Accessibility - DroidCon Berlin 2015 (20)

Supporting multi screen in android cn
Supporting multi screen in android cnSupporting multi screen in android cn
Supporting multi screen in android cn
 
Progressive Enhancement & Mobile [Funka 2012]
Progressive Enhancement & Mobile [Funka 2012]Progressive Enhancement & Mobile [Funka 2012]
Progressive Enhancement & Mobile [Funka 2012]
 
Getting the Magic on Android Tablets
Getting the Magic on Android TabletsGetting the Magic on Android Tablets
Getting the Magic on Android Tablets
 
What HTML5 Means for Web Accessibility
What HTML5 Means for Web AccessibilityWhat HTML5 Means for Web Accessibility
What HTML5 Means for Web Accessibility
 
Jquery mobile
Jquery mobileJquery mobile
Jquery mobile
 
Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...
Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...
Accessible Design with HTML5 - HTML5DevConf.com May 21st San Francisco, 2012 ...
 
Material design basics
Material design basicsMaterial design basics
Material design basics
 
Accessibility and Web Technologies @HTML5_Toronto
Accessibility and Web Technologies @HTML5_TorontoAccessibility and Web Technologies @HTML5_Toronto
Accessibility and Web Technologies @HTML5_Toronto
 
Html 5 mobile - nitty gritty
Html 5 mobile - nitty grittyHtml 5 mobile - nitty gritty
Html 5 mobile - nitty gritty
 
Going web native
Going web nativeGoing web native
Going web native
 
Material Design Keynote
Material Design KeynoteMaterial Design Keynote
Material Design Keynote
 
Is accessibility the new black?
Is accessibility the new black?Is accessibility the new black?
Is accessibility the new black?
 
[Project1] Information Virtual Reality [Exam]
[Project1] Information Virtual Reality [Exam][Project1] Information Virtual Reality [Exam]
[Project1] Information Virtual Reality [Exam]
 
Supporting multi screen in android
Supporting multi screen in androidSupporting multi screen in android
Supporting multi screen in android
 
Mobile Accessibility
Mobile AccessibilityMobile Accessibility
Mobile Accessibility
 
Lecture-2.ppt
Lecture-2.pptLecture-2.ppt
Lecture-2.ppt
 
Breaking the Box: Pushing the Boundaries of UX with Drupal
Breaking the Box: Pushing the Boundaries of UX with DrupalBreaking the Box: Pushing the Boundaries of UX with Drupal
Breaking the Box: Pushing the Boundaries of UX with Drupal
 
OWF12/PAUG Conf Days Google tv part 1 (introduction) matt gaunt, advocate ...
OWF12/PAUG Conf Days Google tv part 1 (introduction)    matt gaunt, advocate ...OWF12/PAUG Conf Days Google tv part 1 (introduction)    matt gaunt, advocate ...
OWF12/PAUG Conf Days Google tv part 1 (introduction) matt gaunt, advocate ...
 
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
Performance Best Practices - Part 1 - Client Side [JS, CSS, HTML, jQuery]
 
Intro to PhoneGap and PhoneGap Build
Intro to PhoneGap and PhoneGap BuildIntro to PhoneGap and PhoneGap Build
Intro to PhoneGap and PhoneGap Build
 

Mehr von Kelly Shuster

Android Support Libraries
Android Support LibrariesAndroid Support Libraries
Android Support LibrariesKelly Shuster
 
Technical speaking 101
Technical speaking 101Technical speaking 101
Technical speaking 101Kelly Shuster
 
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
Let's Build Software Everyone Can Use (Denver Startup Week 2016)Let's Build Software Everyone Can Use (Denver Startup Week 2016)
Let's Build Software Everyone Can Use (Denver Startup Week 2016)Kelly Shuster
 
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Kelly Shuster
 
Lightning Talk on Programming Accessible Software
Lightning Talk on Programming Accessible SoftwareLightning Talk on Programming Accessible Software
Lightning Talk on Programming Accessible SoftwareKelly Shuster
 
Intro to Android (WWC Denver July 2015)
Intro to Android (WWC Denver July 2015)Intro to Android (WWC Denver July 2015)
Intro to Android (WWC Denver July 2015)Kelly Shuster
 

Mehr von Kelly Shuster (6)

Android Support Libraries
Android Support LibrariesAndroid Support Libraries
Android Support Libraries
 
Technical speaking 101
Technical speaking 101Technical speaking 101
Technical speaking 101
 
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
Let's Build Software Everyone Can Use (Denver Startup Week 2016)Let's Build Software Everyone Can Use (Denver Startup Week 2016)
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
 
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
 
Lightning Talk on Programming Accessible Software
Lightning Talk on Programming Accessible SoftwareLightning Talk on Programming Accessible Software
Lightning Talk on Programming Accessible Software
 
Intro to Android (WWC Denver July 2015)
Intro to Android (WWC Denver July 2015)Intro to Android (WWC Denver July 2015)
Intro to Android (WWC Denver July 2015)
 

Kürzlich hochgeladen

Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 

Kürzlich hochgeladen (20)

Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 

Android Accessibility - DroidCon Berlin 2015