SlideShare a Scribd company logo
1 of 117
Download to read offline
Android TV:
Building apps with
Google’s Leanback Library
Joe Birch
Android Engineer @Buffer
@hitherejoe / hitherejoe.com
What is Android TV?
Build on Material
Build on Material Casual Consumption
Build on Material Casual Consumption
Cinematic Experience
Build on Material Casual Consumption
Cinematic Experience Simplicity
Navigation
Getting around
D-Pad controls
Focus based Navigation
Setting up
Getting your project ready
<uses-feature
android:name="android.hardware.microphone"
android:required="false"/>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"/>
<uses-feature
android:name="android.software.leanback"
android:required="true"/>
<activity
android:name=“com.hitherejoe.vineyard.ui.main.LeanbackActivity”
android:label="@string/app_name"
android:theme="@style/Theme.Leanback">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
</intent-filter>
</activity>
github.com/hitherejoe/vineyard
github.com/hitherejoe/bourbon
BrowseFragment
Display browsable content to the user
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name=“com.hitherejoe.vineyard.ui.fragment.BrowseFragment”
android:id="@+id/main_browse_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
setBrandColor(ContextCompat.getColor(this,
R.color.fastlane_background));
Color color = ContextCompat.getColor(this, R.color.accent);
setSearchAffordanceColor(color);
Drawable badge = ContextCompat.getDrawable(
this, R.drawable.banner_shadow);
setBadgeDrawable(badge);
setHeadersState(HEADERS_ENABLED);
setHeadersState(HEADERS_HIDDEN);
setHeadersState(HEADERS_DISABLED);
Browse Fragment
Header Item
Presenter
Header Item
List Row
Array Object
Adapter
Post Adapter
Browse Fragment
Header Item
Presenter
Header Item
List Row
Array Object
Adapter
Post Adapter
public class IconHeaderItemPresenter extends RowHeaderPresenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
// inflate layout
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder,
Object o) {
// set text, icons etc
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
// free resources
}
}
public class IconHeaderItemPresenter extends RowHeaderPresenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
// inflate layout
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder,
Object o) {
// set text, icons etc
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
// free resources
}
}
<android.support.v17.leanback.widget.NonOverlappingLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height=“match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/header_icon"
android:layout_width="32dp"
android:layout_height="32dp"/>
<TextView
android:id="@+id/header_label"
android:layout_marginLeft="6dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize=“@dimen/header_text”/>
</android.support.v17.leanback.widget.NonOverlappingLinearLayout>
public class IconHeaderItemPresenter extends RowHeaderPresenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
// inflate layout
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder,
Object o) {
// set text, icons etc
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
// free resources
}
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder,
Object o) {
HeaderItem headerItem = ((ListRow) o).getHeaderItem();
setIconDrawable(headerItem.getName(), viewholder.iconImage);
TextView label = viewHolder.headerText;
label.setText(headerItem.getName());
}
public class IconHeaderItemPresenter extends RowHeaderPresenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
// inflate layout
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder,
Object o) {
// set text, icons etc
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
// release bitmaps if used
}
}
setHeaderPresenterSelector(new PresenterSelector() {
@Override
public Presenter getPresenter(Object o) {
return new IconHeaderItemPresenter();
}
});
Browse Fragment
Header Item
Presenter
Header Item
List Row
Array Object
Adapter
Array Object
Adapter
Header Item
List Row
Array Object
Adapter
ArrayObjectAdapter rowAdapter = new ArrayObjectAdapter(this);
rowAdapter.add(…);
HeaderItem header = new HeaderItem(headerPosition, tag);
mRowsAdapter.add(new ListRow(header, rowAdapter));
Browse Fragment
Array Object
Adapter
setOnItemViewClickedListener(mOnItemViewClickedListener);
setOnItemViewSelectedListener(mOnItemViewSelectedListener);
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder,
Object item,
RowPresenter.ViewHolder rowViewHolder,
Row row) {
// Do stuff with clicked item object
}
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder,
Object item,
RowPresenter.ViewHolder rowViewHolder,
Row row) {
// Do stuff with selected item object
}
BackgroundManager backgroundManager =
BackgroundManager.getInstance(getActivity());
BackgroundManager backgroundManager =
BackgroundManager.getInstance(getActivity());
backgroundManager.attach(getActivity().getWindow());
BackgroundManager backgroundManager =
BackgroundManager.getInstance(getActivity());
backgroundManager.attach(getActivity().getWindow());
backgroundManager.setBitmap(resource);
BackgroundManager backgroundManager =
BackgroundManager.getInstance(getActivity());
backgroundManager.attach(getActivity().getWindow());
backgroundManager.setBitmap(resource);
// Don’t forget to release!!
backgroundManager.release();
SearchFragment
Allow users to search for content
@Override
public boolean onQueryTextChange(String newQuery)
@Override
public boolean onQueryTextSubmit(String query)
Post Results
(Array Object Adapter)
Search Results
(Array Object Adapter)
Row Adapter
(Array Object Adapter)
Focused item triggers Post search
VerticalGridFragment
Display a grid of browsable content to the user
VerticalGridPresenter gridPresenter =
new VerticalGridPresenter();
gridPresenter.setNumberOfColumns(NUM_COLUMNS);
setGridPresenter(gridPresenter);
PlaybackActivity
Display media content on screen
mSession = new MediaSession(this, getString(R.string.app_name);
mSession.setCallback(new MediaSessionCallback());
mSession.setActive(true);
setMediaController(new MediaController(this,
mSession.getSessionToken());
PlaybackOverlayFragment
Display playback controls to the user
mMediaController = getActivity().getMediaController();
mMediaController.registerCallback(mMediaControllerCallback);
private class MediaControllerCallback extends MediaController.Callback {
@Override
public void onPlaybackStateChanged(@NonNull PlaybackState state) { }
@Override
public void onMetadataChanged(@NonNull MediaMetadata metadata) { }
}
ArrayObjectAdapter
(Row Adapter)
ArrayObjectAdapter
(Related Posts)
ArrayObjectAdapter
(Primary Actions)
ArrayObjectAdapter
(Secondary Actions)
PlayBackControlsRow
Meta Data
ControlButtonPresenterSelector presenterSelector =
new ControlButtonPresenterSelector();
mPrimaryActionsAdapter =
new ArrayObjectAdapter(presenterSelector);
mSecondaryActionsAdapter =
new ArrayObjectAdapter(presenterSelector);
mPlaybackControlsRow
.setPrimaryActionsAdapter(mPrimaryActionsAdapter);
mPlaybackControlsRow
.setSecondaryActionsAdapter(mPrimaryActionsAdapter);
public class Action {
private Drawable mIcons;
private CharSequence mLabel1;
private CharSequence mLabel2;
private ArrayList mKeyCodes;
…
}
mPlayPauseAction = new PlayPauseAction(getActivity());
mRepeatAction = new RepeatAction(getActivity());
mSkipNextAction = new SkipNextAction(getActivity());
mSkipPreviousAction = new SkipPreviousAction(getActivity());
mPrimaryActionsAdapter.add(mPlayPauseAction);
mPrimaryActionsAdapter.add(mSkipNextAction);
mPrimaryActionsAdapter.add(mSkipPreviousAction);
mSecondaryActionsAdapter.add(mRepeatAction);
playbackControlsRowPresenter.setOnActionClickedListener(new OnActionClickedListener() {
public void onActionClicked(Action action) {
if (action.getId() == mPlayPauseAction.getId()) {
togglePlayback(mPlayPauseAction.getIndex() == PlayPauseAction.PLAY);
} else if (action.getId() == mSkipNextAction.getId()) {
next(true);
} else if (action.getId() == mSkipPreviousAction.getId()) {
prev(true);
} else if (action.getId() == mRepeatAction.getId()) {
loopVideos();
}
if (action instanceof PlaybackControlsRow.MultiAction) {
notifyChanged(action);
}
}
});
mMediaController.getTransportControls().play();
mMediaController.getTransportControls().pause;
mMediaController.getTransportControls().skipToNext();
mMediaController.getTransportControls().skipToPrevious();
mMediaController.getTransportControls().fastForward;
mMediaController.getTransportControls().rewind();
mMediaController.getTransportControls()
.sendCustomAction(CUSTOM_ACTION_AUTO_LOOP, null);
Post item = (Post) mPlaybackControlsRow.getItem();
item.description = description;
item.username = username;
mPlaybackControlsRow.setTotalTime((int) duration);
mPlaybackControlsRow.setImageDrawable(resource);
mPlaybackControlsRow.setCurrentTime(currentTime);
mPlaybackControlsRow.setBufferedProgress(bufferedT
Post item = (Post) mPlaybackControlsRow.getItem();
item.description = description;
item.username = username;
mPlaybackControlsRow.setTotalTime((int) duration);
mPlaybackControlsRow.setImageDrawable(resource);
mPlaybackControlsRow.setCurrentTime(currentTime);
mPlaybackControlsRow.setBufferedProgress(bufferedTime);
ArrayObjectAdapter
(Adapter Rows)
ArrayObjectAdapter
(Related Posts)
ArrayObjectAdapter
(Primary Actions)
ArrayObjectAdapter
(Secondary Actions)
PlayBackControlsRow
Meta Data
GuidedStepFragment
Display a set of selectable options to the user
@Override
public GuidanceStylist.Guidance
onCreateGuidance(Bundle savedInstanceState) {
String title = getString(…);
String description = getString(…);
Drawable icon = getActivity().getDrawable(…);
return new GuidanceStylist.Guidance(
title, description, "", icon);
}
@Override
public void onCreateActions(
@NonNull List<GuidedAction> actions,
Bundle savedInstanceState) {
GuidedAction guidedAction = new GuidedAction.Builder()
.id(…)
.title(…)
.description(…)
.checkSetId(OPTION_CHECK_SET_ID)
.build();
guidedAction.setChecked(isChecked);
actions.add(guidedAction);
}
ErrorFragment
Display an error message to the user
(Because things don’t always go as planned)
ErrorFragment errorFragment =
new ErrorFragment();
errorFragment.setTitle(…);
errorFragment.setMessage(…);
errorFragment.setButtonText(…);
errorFragment.setButtonClickListener(…);
Custom Views
Because your app doesn’t have to look boring
Tag Card
Tag Card
View
Base Card
View
Text View
Image View
Tag Card
TagCardView cardView = new TagCardView(parent.getContext());
Tag post = (Tag) item;
TagCardView cardView = (TagCardView) viewHolder.view;
if (post.tag != null) {
cardView.setCardText(post.tag);
cardView.setCardIcon(R.drawable.ic_tag);
}
Icon Card
Icon Card
View
Base Card
View
Text View
Image View
Text View
Icon Card
IconCardView cardView = new IconCardView(parent.getContext());
Option option = (Option) item;
IconCardView cardView = (IconCardView) viewHolder.view;
if (option.tag != null) {
cardView.setCardIcon(R.drawable.ic_loop);
cardView.setTitleText(option.title);
cardView.setValueText(option.title);
}
Loading Card
Loading Card
View
Base Card
View
Progress Bar
Loading Card
LoadingCardView cardView = new LoadingCardView(parent.getContext());
IconCardView cardView = (IconCardView) viewHolder.view;
cardView.setIsLoading(true);
Live Card
Live Card
Live Card
View
Base Card
View
Preview Card
View
Looping Video
View
Progress Bar
Image View
View
(Transparent Overlay)
Video View
Live Card
LiveCardView cardView = new LiveCardView(parent.getContext());
Post post = (Post) item;
LiveCardView cardView = (LiveCardView) viewHolder.view;
if (post.videoUrl != null) {
cardView.setTitleText(post.description);
cardView.setContentText(post.username);
cardView.setVideoUrl(post.videoUrl);
Glide.with(cardView.getContext())
.load(post.thumbnailUrl)
.centerCrop()
.error(mDefaultCardImage)
.into(cardView.getMainImageView());
}
Leanback Cards
https://github.com/hitherejoe/LeanbackCards
Google Guidelines
Testing.
onView(withId(R.id.title_orb))
.perform(click());
onView(withId(R.id.browse_headers))
.perform(RecyclerViewActions
.actionOnItemAtPosition(i, click()));
onView(withItemText(post.description,
R.id.browse_container_dock))
.perform(click());
Dig deep and remember, everything has IDs!
Android N(utella?)
Picture-in-Picture
<activity android:name=“.ui.video.VideoActivity”
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
“screenSize|smallestScreenSize|screenLayout|orientation" />
@Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
}
@Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
} else {
// Restore the playback UI based on the playback status.
}
}
@Override
public void onPause() {
if (mInPictureInPicture) {
// Continue playback
}
// If paused but not in PIP, pause playback if necessary
}
TV Recording
Sharing Code
github.com/hitherejoe/bourbon
What’s next?
The future of TV
Resources
Official Android TV Documentation
github.com/hitherejoe/vineyard
Google Plus Android TV Community
github.com/hitherejoe/AndroidTvBoilerplate
github.com/hitherejoe/leanbackcards
medium.com/@hitherejoe

More Related Content

What's hot

Android sensors
Android sensorsAndroid sensors
Android sensorsdatta_jini
 
Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI Ajinkya Saswade
 
Jetpack Compose beginner.pdf
Jetpack Compose beginner.pdfJetpack Compose beginner.pdf
Jetpack Compose beginner.pdfAayushmaAgrawal
 
안드로이드 윈도우 마스터 되기
안드로이드 윈도우 마스터 되기안드로이드 윈도우 마스터 되기
안드로이드 윈도우 마스터 되기Myungwook Ahn
 
What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?MohammadHussain595488
 
Game design dan game designer
Game design dan game designerGame design dan game designer
Game design dan game designerToto Haryadi
 
Try Jetpack Compose
Try Jetpack ComposeTry Jetpack Compose
Try Jetpack ComposeLutasLin
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest MatchersShai Yallin
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Nelson Glauber Leal
 
Android testing
Android testingAndroid testing
Android testingJinaTm
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidNelson Glauber Leal
 
Mobile Game Development in Unity
Mobile Game Development in UnityMobile Game Development in Unity
Mobile Game Development in UnityHakan Saglam
 
Flutter state management from zero to hero
Flutter state management from zero to heroFlutter state management from zero to hero
Flutter state management from zero to heroAhmed Abu Eldahab
 
Sejarah singkat (video) game
Sejarah singkat (video) gameSejarah singkat (video) game
Sejarah singkat (video) gameToto Haryadi
 

What's hot (20)

Android sensors
Android sensorsAndroid sensors
Android sensors
 
Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI
 
Jetpack Compose beginner.pdf
Jetpack Compose beginner.pdfJetpack Compose beginner.pdf
Jetpack Compose beginner.pdf
 
안드로이드 윈도우 마스터 되기
안드로이드 윈도우 마스터 되기안드로이드 윈도우 마스터 되기
안드로이드 윈도우 마스터 되기
 
What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?
 
Flutter workshop
Flutter workshopFlutter workshop
Flutter workshop
 
Game design dan game designer
Game design dan game designerGame design dan game designer
Game design dan game designer
 
Try Jetpack Compose
Try Jetpack ComposeTry Jetpack Compose
Try Jetpack Compose
 
Android studio ppt
Android studio pptAndroid studio ppt
Android studio ppt
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
 
Flutter
FlutterFlutter
Flutter
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021
 
Flutter
FlutterFlutter
Flutter
 
Android testing
Android testingAndroid testing
Android testing
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on Android
 
Mobile Game Development in Unity
Mobile Game Development in UnityMobile Game Development in Unity
Mobile Game Development in Unity
 
Flutter introduction
Flutter introductionFlutter introduction
Flutter introduction
 
Flutter state management from zero to hero
Flutter state management from zero to heroFlutter state management from zero to hero
Flutter state management from zero to hero
 
Sejarah singkat (video) game
Sejarah singkat (video) gameSejarah singkat (video) game
Sejarah singkat (video) game
 
Android media
Android mediaAndroid media
Android media
 

Similar to Android TV: Building apps with Google’s Leanback Library

Design Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesDesign Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesMichael Galpin
 
Implementing cast in android
Implementing cast in androidImplementing cast in android
Implementing cast in androidAngelo Rüggeberg
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design PatternsGodfrey Nolan
 
Android activity, service, and broadcast recievers
Android activity, service, and broadcast recieversAndroid activity, service, and broadcast recievers
Android activity, service, and broadcast recieversUtkarsh Mankad
 
Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Alfredo Morresi
 
What's New in Android
What's New in AndroidWhat's New in Android
What's New in AndroidRobert Cooper
 
Building Universal Web Apps with React ForwardJS 2017
Building Universal Web Apps with React ForwardJS 2017Building Universal Web Apps with React ForwardJS 2017
Building Universal Web Apps with React ForwardJS 2017Elyse Kolker Gordon
 
Google I/O 2011, Android Honeycomb Highlights
Google I/O 2011, Android Honeycomb HighlightsGoogle I/O 2011, Android Honeycomb Highlights
Google I/O 2011, Android Honeycomb HighlightsRomain Guy
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegapyangdj
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaveryangdj
 
Embracing the Lollipop
Embracing the LollipopEmbracing the Lollipop
Embracing the LollipopSonja Kesic
 
Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development Mahmoud Hamed Mahmoud
 
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangleA resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangleAkihito Koriyama
 
Android accessibility for developers and QA
Android accessibility for developers and QAAndroid accessibility for developers and QA
Android accessibility for developers and QATed Drake
 
Android development for iOS developers
Android development for iOS developersAndroid development for iOS developers
Android development for iOS developersDarryl Bayliss
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best PracticesYekmer Simsek
 

Similar to Android TV: Building apps with Google’s Leanback Library (20)

Design Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesDesign Patterns for Tablets and Smartphones
Design Patterns for Tablets and Smartphones
 
Implementing cast in android
Implementing cast in androidImplementing cast in android
Implementing cast in android
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
Android activity, service, and broadcast recievers
Android activity, service, and broadcast recieversAndroid activity, service, and broadcast recievers
Android activity, service, and broadcast recievers
 
Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)
 
What's New in Android
What's New in AndroidWhat's New in Android
What's New in Android
 
Android 3
Android 3Android 3
Android 3
 
Action Bar in Android
Action Bar in AndroidAction Bar in Android
Action Bar in Android
 
Building Universal Web Apps with React ForwardJS 2017
Building Universal Web Apps with React ForwardJS 2017Building Universal Web Apps with React ForwardJS 2017
Building Universal Web Apps with React ForwardJS 2017
 
Action bar
Action barAction bar
Action bar
 
Google I/O 2011, Android Honeycomb Highlights
Google I/O 2011, Android Honeycomb HighlightsGoogle I/O 2011, Android Honeycomb Highlights
Google I/O 2011, Android Honeycomb Highlights
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegap
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver
 
Android programming basics
Android programming basicsAndroid programming basics
Android programming basics
 
Embracing the Lollipop
Embracing the LollipopEmbracing the Lollipop
Embracing the Lollipop
 
Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development
 
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangleA resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangle
 
Android accessibility for developers and QA
Android accessibility for developers and QAAndroid accessibility for developers and QA
Android accessibility for developers and QA
 
Android development for iOS developers
Android development for iOS developersAndroid development for iOS developers
Android development for iOS developers
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 

Recently uploaded

Design For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the startDesign For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the startQuintin Balsdon
 
School management system project Report.pdf
School management system project Report.pdfSchool management system project Report.pdf
School management system project Report.pdfKamal Acharya
 
fitting shop and tools used in fitting shop .ppt
fitting shop and tools used in fitting shop .pptfitting shop and tools used in fitting shop .ppt
fitting shop and tools used in fitting shop .pptAfnanAhmad53
 
Theory of Time 2024 (Universal Theory for Everything)
Theory of Time 2024 (Universal Theory for Everything)Theory of Time 2024 (Universal Theory for Everything)
Theory of Time 2024 (Universal Theory for Everything)Ramkumar k
 
Ground Improvement Technique: Earth Reinforcement
Ground Improvement Technique: Earth ReinforcementGround Improvement Technique: Earth Reinforcement
Ground Improvement Technique: Earth ReinforcementDr. Deepak Mudgal
 
Augmented Reality (AR) with Augin Software.pptx
Augmented Reality (AR) with Augin Software.pptxAugmented Reality (AR) with Augin Software.pptx
Augmented Reality (AR) with Augin Software.pptxMustafa Ahmed
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwaitjaanualu31
 
Memory Interfacing of 8086 with DMA 8257
Memory Interfacing of 8086 with DMA 8257Memory Interfacing of 8086 with DMA 8257
Memory Interfacing of 8086 with DMA 8257subhasishdas79
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.Kamal Acharya
 
AIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech studentsAIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech studentsvanyagupta248
 
Post office management system project ..pdf
Post office management system project ..pdfPost office management system project ..pdf
Post office management system project ..pdfKamal Acharya
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXssuser89054b
 
Introduction to Robotics in Mechanical Engineering.pptx
Introduction to Robotics in Mechanical Engineering.pptxIntroduction to Robotics in Mechanical Engineering.pptx
Introduction to Robotics in Mechanical Engineering.pptxhublikarsn
 
Introduction to Data Visualization,Matplotlib.pdf
Introduction to Data Visualization,Matplotlib.pdfIntroduction to Data Visualization,Matplotlib.pdf
Introduction to Data Visualization,Matplotlib.pdfsumitt6_25730773
 
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments""Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"mphochane1998
 
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...HenryBriggs2
 
Query optimization and processing for advanced database systems
Query optimization and processing for advanced database systemsQuery optimization and processing for advanced database systems
Query optimization and processing for advanced database systemsmeharikiros2
 
PE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and propertiesPE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and propertiessarkmank1
 

Recently uploaded (20)

Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
Design For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the startDesign For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the start
 
School management system project Report.pdf
School management system project Report.pdfSchool management system project Report.pdf
School management system project Report.pdf
 
fitting shop and tools used in fitting shop .ppt
fitting shop and tools used in fitting shop .pptfitting shop and tools used in fitting shop .ppt
fitting shop and tools used in fitting shop .ppt
 
Theory of Time 2024 (Universal Theory for Everything)
Theory of Time 2024 (Universal Theory for Everything)Theory of Time 2024 (Universal Theory for Everything)
Theory of Time 2024 (Universal Theory for Everything)
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
Ground Improvement Technique: Earth Reinforcement
Ground Improvement Technique: Earth ReinforcementGround Improvement Technique: Earth Reinforcement
Ground Improvement Technique: Earth Reinforcement
 
Augmented Reality (AR) with Augin Software.pptx
Augmented Reality (AR) with Augin Software.pptxAugmented Reality (AR) with Augin Software.pptx
Augmented Reality (AR) with Augin Software.pptx
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
 
Memory Interfacing of 8086 with DMA 8257
Memory Interfacing of 8086 with DMA 8257Memory Interfacing of 8086 with DMA 8257
Memory Interfacing of 8086 with DMA 8257
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
AIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech studentsAIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech students
 
Post office management system project ..pdf
Post office management system project ..pdfPost office management system project ..pdf
Post office management system project ..pdf
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
Introduction to Robotics in Mechanical Engineering.pptx
Introduction to Robotics in Mechanical Engineering.pptxIntroduction to Robotics in Mechanical Engineering.pptx
Introduction to Robotics in Mechanical Engineering.pptx
 
Introduction to Data Visualization,Matplotlib.pdf
Introduction to Data Visualization,Matplotlib.pdfIntroduction to Data Visualization,Matplotlib.pdf
Introduction to Data Visualization,Matplotlib.pdf
 
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments""Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
 
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
 
Query optimization and processing for advanced database systems
Query optimization and processing for advanced database systemsQuery optimization and processing for advanced database systems
Query optimization and processing for advanced database systems
 
PE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and propertiesPE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and properties
 

Android TV: Building apps with Google’s Leanback Library