SlideShare a Scribd company logo
1 of 88
Hasan Hosgel | ImmobilienScout24
Best Practices to develop for
different Android Device
Classifications
About me
• +HasanHosgel
@alosdev
alosdev
hosgel
CO-Organizer
Developer
ImmobilienScout24
Germany’s largest real estate listing company.
> 10 Mio. Monthly unique users
> 1.5 Mio. real estates
> 300 Mio. detail views
> 1500 Servers
~ 7.5 Mio. App downloads
> 3 Mio. Android
> 50% mobile traffic
Fragmentation
Fragmentation
> 5000 Android Devices
Here comes the Nightmare
Image source:
http://www.flickr.com/photos/boogeyman13/4553188509/
Image source:
http://www.flickr.com/photos/boogeyman13/4553188509/
Here comes the Nightmare
For developers
Let’s build the fundament
Image source:
http://www.flickr.com/photos/hertenberger/1434191066/
Device Classification
Image source:
https://play.google.com/store/devices
Image source:
https://play.google.com/store/devices
http://www.htc.com
Image source:
http://www.sony.de/hub/google-tv
Image source:
https://developer.ford.com/
Open Automotive Alliance
Starting 2014 several companies plan to
bring Android platform to the cars.
• Audi
• GM
• Google
• Honda
• Hyundai
• Nvidia
http://www.openautoalliance.net/
Wearables
Android Wear SDK
Google Glass
Hard Work Ahead
Image source:
http://www.flickr.com/photos/16210667@N02/9172895225
Resource Folders
You can use several qualifiers in the
resource folders name for serving the
best matching resource.
Qualifiers
• Language (-en)
• Language & Region (-en-rUS)
• Smallest Width (–sw600dp)
• Screensize (-small, -normal, -large)
• Screen Orientation (-port, -land)
• Screen Pixel Densitiy (-hdpi, -xxhdpi,…)
• Platform Version (-v11, -v13)
Best Matching Resource Wins
1. res/values/strings.xml
2. res/values-en-rUS/strings.xml
3. res/values-large/strings.xml
4. res/values-sw600dp/strings.xml
Best Matching Resource Wins
1. res/values/strings.xml
2. res/values-en-rUS/strings.xml
3. res/values-large/strings.xml
4. res/values-sw600dp/strings.xml
The order of the qualifiers in the previous
slides gives the ranking, if two resources
have the same matching number of
qualifiers.
Image Resources
• Use the different qualifiers for the screen pixel
density (mdpi, hdpi, etc.)
• If you are forced to use text on images use
language and region (en, es-rUS, en-rUS, etc.)
• Better approach is to use 9-patch
drawables, which stretches automatically
depending on the content inside.
• You must provide different launcher icons for
Froyo, Honeycomb and above? Use the
platform version. (v4, v11, v14)
Classifications for Layouts
Platform version at least v13 (Honeycomb
MR2)
Classifications for Layouts
Platform version at least v13 (Honeycomb
MR2)
project-folder/res/
layout/
Classifications for Layouts
Platform version at least v13 (Honeycomb
MR2)
project-folder/res/
layout/  small phones
Classifications for Layouts
Platform version at least v13 (Honeycomb
MR2)
project-folder/res/
layout/  small phones
layout-sw320dp/  other phones
Classifications for Layouts
Platform version at least v13 (Honeycomb
MR2)
project-folder/res/
layout/  small phones
layout-sw320dp/  other phones
layout-sw600dp/  tablets 7”
Classifications for Layouts
Platform version at least v13 (Honeycomb
MR2)
project-folder/res/
layout/  small phones
layout-sw320dp/  other phones
layout-sw600dp/  tablets 7”
layout-sw720dp/  tablets 10”
* You should also use the orientation qualifier
Platform version lower v11
project-folder/res/
layout/
layout-sw320dp/  other phones
layout-sw600dp/  tablets 7”
layout-sw720dp/  tablets 10”
Platform version lower v11
project-folder/res/
layout/  phones
layout-sw320dp/  other phones
layout-sw600dp/  tablets 7”
layout-sw720dp/  tablets 10”
Platform version lower v11
project-folder/res/
layout/  phones
layout-v11/  tablets 10”
layout-sw320dp/  other phones
layout-sw600dp/  tablets 7”
layout-sw720dp/  tablets 10”
Platform version lower v11
project-folder/res/
layout/  phones
layout-v11/  tablets 10”
layout-v13/  small phones
layout-sw320dp/  other phones
layout-sw600dp/  tablets 7”
layout-sw720dp/  tablets 10”
Hint
The smallest width qualifier gets
automatically platform version ”-v13”
through the packager, for avoiding
problems with the number of matching
qualifiers.
How to Classify In Code
• Read configuration from the device
How to Classify In Code
• Read configuration from the device
• Smarter approach is to use boolean
resources
project-folder/res/values/layouts.xml
<resources>
</resources>
project-folder/res/values/layouts.xml
<resources>
<bool > </bool>
</resources>
project-folder/res/values/layouts.xml
<resources>
<bool name="is_phone_small"> </bool>
</resources>
project-folder/res/values/layouts.xml
<resources>
<bool name="is_phone_small">true</bool>
</resources>
project-folder/res/values/layouts.xml
<resources>
<bool name="is_phone_small">true</bool>
<bool name="is_phone_other">false</bool>
<bool name="is_tablet_7">false</bool>
<bool name="is_tablet_10">false</bool>
</resources>
project-folder/res/values/layouts.xml
<resources>
<bool name="is_phone_small">true</bool>
<bool name="is_phone_other">false</bool>
<bool name="is_tablet_7">false</bool>
<bool name="is_tablet_10">false</bool>
</resources>
Usage in code:
getResources().getBoolean(R.bool.is_phone_small)
Current Layout File Structure
project-folder/res/
layout/main.xml
layout-v11/main.xml
layout-v13/main.xml
layout-sw320dp/main.xml
layout-sw600dp/main.xml
layout-sw720dp/main.xml
Current Layout File Structure
project-folder/res/
layout/main.xml
layout-v11/main.xml
layout-v13/main.xml
layout-sw320dp/main.xml
layout-sw600dp/main.xml
layout-sw720dp/main.xml
Fixing one bug in the 10“ layout has to be done in two files.
Current Layout File Structure
project-folder/res/
layout/main.xml
layout-v11/main.xml
layout-v13/main.xml
layout-sw320dp/main.xml
layout-sw600dp/main.xml
layout-sw720dp/main.xml
Fixing one bug in the 10“ layout has to be done in two files.
 error prone
Resource Alias
Put your layout files in the default folder.
project-folder/res/
layout/main_phone_small.xml
layout/main_phone_other.xml
layout/main_tablet_7.xml
layout/main_tablet_10.xml
Create an item with the needed
classification in the previously defined
values folder.
project-folder/res/values-sw720dp/layouts.xml
<resources>
</resources>
Create an item with the needed
classification in the previously defined
values folder.
project-folder/res/values-sw720dp/layouts.xml
<resources>
<item name="main" >
</item>
</resources>
Create an item with the needed
classification in the previously defined
values folder.
project-folder/res/values-sw720dp/layouts.xml
<resources>
<item name="main" type="layout">
</item>
</resources>
Create an item with the needed
classification in the previously defined
values folder.
project-folder/res/values-sw720dp/layouts.xml
<resources>
<item name="main" type="layout">
@layout/main_tablet_10.xml
</item>
</resources>
Scenario
Use <includes>
Usage include
<LinearLayout … >
…
< />
…
</LinearLayout>
Usage include
<LinearLayout … >
…
<include />
…
</LinearLayout>
Usage include
<LinearLayout … >
…
<include layout="@layout/footer"/>
…
</LinearLayout>
Use <includes>
Use <includes>
Custom View
public class CustomView extends LinearLayout {
…
public CustomView(Context context, AttributeSet attrs) {
…
addView(createTextView(context, "label"), lp);
addView(createTextView(context, "desc"), lp);
if(getResources().getBoolean(R.bool.is_phone)){
setOrientation(VERTICAL);
} else {
setOrientation(HORIZONTAL);
}
}
…
}
Usage In Layout Files
<LinearLayout … >
…
<de.alosdev.CustomView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
…
</LinearLayout>
Use <includes>
Create custom view
Custom XML Attribute
<resources>
<resources>
Custom XML Attribute
<resources>
<declare-styleable >
</declare-styleable>
<resources>
Custom XML Attribute
<resources>
<declare-styleable name=”CustomView">
</declare-styleable>
<resources>
Custom XML Attribute
<resources>
<declare-styleable name=”CustomView">
<attr />
</declare-styleable>
<resources>
Custom XML Attribute
<resources>
<declare-styleable name=”CustomView">
<attr name="label" />
</declare-styleable>
<resources>
Custom XML Attribute
<resources>
<declare-styleable name=”CustomView">
<attr name="label" format="reference|string"/>
</declare-styleable>
<resources>
Custom XML Attribute
<resources>
<declare-styleable name=”CustomView">
<attr name="label" format="reference|string"/>
<attr name="value" format="reference|string"/>
</declare-styleable>
<resources>
Custom XML Attribute
<resources>
<declare-styleable name=”CustomView">
<attr name="label" format="reference|string"/>
<attr name="value" format="reference|string"/>
<attr name="orientation" format="enum">
<enum name="horizontal" value="0"/>
<enum name="vertical" value="1"/>
</attr>
</declare-styleable>
<resources>
Usage In Layout Files
1. Add to root XML node
xmlns:app="http://schemas.android.com/apk/res-
auto"
Usage In Layout Files
1. Add to root XML node
xmlns:app="http://schemas.android.com/apk/res-
auto"
2. Usage in custom view
<de.alosdev.CustomView
android:id="@+id/customView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="label 1"
app:orientation="vertical"
app:value="value 1" />
public class CustomView extends LinearLayout {
static final int[] ORIENTATION = new int[] {
HORIZONTAL, VERTICAL };
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
…
TypedArray a =
context.obtainStyledAttributes(attrs, R.styleable.CustomView)
;
try {
setOrientation(ORIENTATION[
a.getInt(R.styleable.CustomView_orientation, 0)]);
} finally {
a.recycle();
}
}
…
}
If custom view has much more
business logic and need lifecycles
 Create a Fragment
Code
Best Practices
You have already an application
 Remove orientation fixation and suppressing
of orientation change from manifest to avoid
long bug analyzing.
You start from the scratch
 Focus on main classification for faster time to
market
 But create an overall concept for better
modularization
If you support both orientations, save the instance
state while orientation changes for more
responsiveness
Especially for states, that need a long
computation for creation.
Make the state object Parcelable for faster
write & read and also to have a smaller memory
footprint
Developer Hints
• You can start an activity for result from a
fragment, so the response can be handled in the
fragment.
• If you want to register a special service on every
onCreate method of an activity give the
ActivityLivecycleCallbacks a try. You can register
them in the onCreate method of the application.
(minSDK -v14)
If you get a BadParcelableException with the cause
ClassNotFound-Exception, the source can be a
NullPointerException during the read or write of the
Parcelable. Exceptions are hidden during the parcel
process.
If you want to use “match_parent” or “wrap_content”
in a dimension alias, you should use “-1px” or “-2px”
project-folder/res/values/dimen.xml
<resources>
<dimen name="my_dimen>@dimen/match_parent</dimen>
<dimen name="match_parent">-1px</dimen>
<dimen name="wrap_content">-2px</dimen>
</resources>
project-folder/res/values-sw600dp/layout.xml
<resources>
<dimen name="my_dimen>300dp</dimen>
</resources>
Listener Hell
If you have to many listeners or you think the
programming model is old school like the “goto
statements”. Give message/ event/ service bus
a try. For Android:
• Otto from Square
• EventBus from greenrobot
See also: Callbacks as our Generations' Go To
Statement
Custom Theme & Style
Android Ui Utils
ActionBar Style Generator
Holo Color Generator
Mission Accomplished?
Image source:
http://www.flickr.com/photos/ianaberle/5729561934/
Mission Accomplished
Image source:
http://www.flickr.com/photos/ianaberle/5729561934/
Q & A
Image source:
http://www.flickr.com/photos/21496790@N06/5065834411/
www.immobilienscout24.dewww.immobilienscout24.de
Thanks for your attention!
Contact:
+HasanHosgel
@alosdev
alosdev
Best Practices to develop for different Android Device Classifications
https://github.com/alosdev/multidevice-nightmare-demo
http://www.slideshare.net/hosgel/mtc-spring-2014-best-practices-to-develop-for-different-
android-device-classifications

More Related Content

Viewers also liked

Viewers also liked (8)

android app development by GirnarSoft
android  app development by GirnarSoftandroid  app development by GirnarSoft
android app development by GirnarSoft
 
La Circolare 27E dell'Agenzia delle Entrate
La Circolare 27E dell'Agenzia delle EntrateLa Circolare 27E dell'Agenzia delle Entrate
La Circolare 27E dell'Agenzia delle Entrate
 
Waiver Release Assumption of Risk - Home Page
Waiver Release Assumption of Risk - Home PageWaiver Release Assumption of Risk - Home Page
Waiver Release Assumption of Risk - Home Page
 
Valoración de la biodiversidad
Valoración de la biodiversidadValoración de la biodiversidad
Valoración de la biodiversidad
 
Slites
SlitesSlites
Slites
 
La Ciberseguridad en la Industria 4.0_ Logitek
La Ciberseguridad en la Industria 4.0_ LogitekLa Ciberseguridad en la Industria 4.0_ Logitek
La Ciberseguridad en la Industria 4.0_ Logitek
 
Customer&rsquo;s Choice @ GDG Android Berlin on January meetup
Customer&rsquo;s Choice @ GDG Android Berlin on January meetupCustomer&rsquo;s Choice @ GDG Android Berlin on January meetup
Customer&rsquo;s Choice @ GDG Android Berlin on January meetup
 
Teknisi komputer
Teknisi komputerTeknisi komputer
Teknisi komputer
 

Similar to Mtc spring 2014 best practices to develop for different android device classifications

Droidcon 2013 multidevice nightmare
Droidcon 2013 multidevice nightmareDroidcon 2013 multidevice nightmare
Droidcon 2013 multidevice nightmare
Droidcon Berlin
 
Mobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 AndroidMobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 Android
Mohammad Shaker
 
The specs behind the sex, mobile-friendly layout beyond the desktop
The specs behind the sex, mobile-friendly layout beyond the desktopThe specs behind the sex, mobile-friendly layout beyond the desktop
The specs behind the sex, mobile-friendly layout beyond the desktop
betabeers
 
Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.
Jason Conger
 

Similar to Mtc spring 2014 best practices to develop for different android device classifications (20)

Droidcon 2013 multidevice nightmare
Droidcon 2013 multidevice nightmareDroidcon 2013 multidevice nightmare
Droidcon 2013 multidevice nightmare
 
Droidcon 2013 Multidevice Nightmare
Droidcon 2013 Multidevice NightmareDroidcon 2013 Multidevice Nightmare
Droidcon 2013 Multidevice Nightmare
 
MTC 2013 Berlin - Best Practices for Multi Devices
MTC 2013 Berlin - Best Practices for Multi DevicesMTC 2013 Berlin - Best Practices for Multi Devices
MTC 2013 Berlin - Best Practices for Multi Devices
 
Android Developer Days 2013 - MultiDevice Nightmare
Android Developer Days 2013 - MultiDevice NightmareAndroid Developer Days 2013 - MultiDevice Nightmare
Android Developer Days 2013 - MultiDevice Nightmare
 
Droidcon nl 2013 best practices to develop for different android device class...
Droidcon nl 2013 best practices to develop for different android device class...Droidcon nl 2013 best practices to develop for different android device class...
Droidcon nl 2013 best practices to develop for different android device class...
 
Fernando F. Gallego - Efficient Android Resources 101
Fernando F. Gallego - Efficient Android Resources 101Fernando F. Gallego - Efficient Android Resources 101
Fernando F. Gallego - Efficient Android Resources 101
 
Mobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 AndroidMobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 Android
 
The specs behind the sex, mobile-friendly layout beyond the desktop
The specs behind the sex, mobile-friendly layout beyond the desktopThe specs behind the sex, mobile-friendly layout beyond the desktop
The specs behind the sex, mobile-friendly layout beyond the desktop
 
Beginning Native Android Apps
Beginning Native Android AppsBeginning Native Android Apps
Beginning Native Android Apps
 
Native Android Development Practices
Native Android Development PracticesNative Android Development Practices
Native Android Development Practices
 
Android Embedded - Smart Hubs als Schaltzentrale des IoT
Android Embedded - Smart Hubs als Schaltzentrale des IoTAndroid Embedded - Smart Hubs als Schaltzentrale des IoT
Android Embedded - Smart Hubs als Schaltzentrale des IoT
 
AndroidX Google Extended I/O BKK 2018
AndroidX Google Extended I/O BKK 2018 AndroidX Google Extended I/O BKK 2018
AndroidX Google Extended I/O BKK 2018
 
One APK to rule them all
One APK to rule them allOne APK to rule them all
One APK to rule them all
 
Creating Developer-Friendly Docker Containers with Chaperone
Creating Developer-Friendly Docker Containers with ChaperoneCreating Developer-Friendly Docker Containers with Chaperone
Creating Developer-Friendly Docker Containers with Chaperone
 
Use Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsUse Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile Apps
 
Android App development and test environment, Understaing android app structure
Android App development and test environment, Understaing android app structureAndroid App development and test environment, Understaing android app structure
Android App development and test environment, Understaing android app structure
 
Android Workshop
Android WorkshopAndroid Workshop
Android Workshop
 
Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.
 
Getting the Magic on Android Tablets
Getting the Magic on Android TabletsGetting the Magic on Android Tablets
Getting the Magic on Android Tablets
 
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROIDMaterial Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
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...
 
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
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.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
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 

Mtc spring 2014 best practices to develop for different android device classifications