58
MARIO VIVIANI TECHNOLOGY EVANGELIST, AMAZON APPSTORE UK @ mariuxtheone http://www.linkedin.com/in/ marioviviani ANDROID DEVELOPMENT ON AMAZON FIRE TV

Android Development on Fire TV

Embed Size (px)

Citation preview

Page 1: Android Development on Fire TV

MAR IO V IV IAN IT E C H N O L O G Y E V A N G E L I S T , A M A Z O N A P P S T O R E U K

@mariuxtheone http ://www. l inked in .com/ in/ mariov iv iani

ANDRO ID

DEVELOPMENT

ON AMAZ ON F IRE TV

Page 2: Android Development on Fire TV

I T ’ S A - M E !

M a r i o V i v i a n i

Technology Evangelist, Amazon Appstore UK

@mariuxtheone

Android Developer from 201095+ apps published12,000,000+ downloadsGoogle Developer Expert 2013-15Startup Founder, Co-WorkerSpeaker at: Droidcon, Android Dev Days, Google I/O 2015

Page 3: Android Development on Fire TV

Android is Not Just for

Mobile Devices

Page 4: Android Development on Fire TV

Android

Android TV Apps based on

Fire OS

Fire TV Apps based on

Page 5: Android Development on Fire TV

OS 5Based on

Android

Lollipop

Android

Studio

Page 6: Android Development on Fire TV

TV 4K & TV STICK

Page 7: Android Development on Fire TV

bit.ly/firetvspecs

TV TV Stick

4K compatible FullHDQuad-core CPU Dual-core CPU

2 GB RAM 1 GB RAM

(2160p)(1080p)

WiFi – Bluetooth 4.1 WiFi – Bluetooth 3.0

8 GB Internal Storage(actual formatted capacity will be less)

8 GB Internal Storage(actual formatted capacity will be less)

USB-A and MicroSD slot MicroUSB (power only)

Page 8: Android Development on Fire TV

TV APPS

Page 9: Android Development on Fire TV

Development on Fire TV

ADB Setup

Page 10: Android Development on Fire TV
Page 11: Android Development on Fire TV
Page 12: Android Development on Fire TV
Page 13: Android Development on Fire TV

Development on Fire TVConnect ADB via WiFi

adb connect <ipaddress>

- + xTerminal

Page 14: Android Development on Fire TV

Development on Fire TV

Project Setup:Media Streaming App

Page 15: Android Development on Fire TV

TV APPS DEVELOPMENT

Fire TV SDK add-on

v17 Leanback Library

Fire TV SDK add-on

Page 16: Android Development on Fire TV

Android Studio Project Setup

Page 17: Android Development on Fire TV

Android Studio Project Setup

Page 18: Android Development on Fire TV

dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:recyclerview-v7:23.1.1'compile 'com.android.support:leanback-v17:23.1.1'compile 'com.android.support:appcompat-v7:23.1.1'compile 'com.github.bumptech.glide:glide:3.4.+'

}

Gradle Dependencies

Page 19: Android Development on Fire TV

Browse

For

Content

Read

Description

&

Details

Play

TV Interaction Model

Page 20: Android Development on Fire TV

Browse

Fragment

Details

Fragment

Playback

Overlay

Fragment

TV App Model

Page 21: Android Development on Fire TV

Development on Fire TV

BrowseFragment

Page 22: Android Development on Fire TV
Page 23: Android Development on Fire TV

BrowseFragment

Page 24: Android Development on Fire TV

HeadersFragment RowsFragment

BrowseFragment

Page 25: Android Development on Fire TV
Page 26: Android Development on Fire TV

ListRowAdapter

HeaderItem

Movie Movie Movie

Page 27: Android Development on Fire TV

public class MainFragment extends BrowseFragment {

private void loadRows() {List<Movie> list = MovieList.setupMovies();

CardPresenter cardPresenter = new CardPresenter();

//Create the adapter for the row and add all the moviesArrayObjectAdapter listRowAdapter

= new ArrayObjectAdapter(cardPresenter);for (Movie movie:list) {

listRowAdapter.add(movie);}

//Create the header of this row HeaderItem header = new HeaderItem(0, "Category Name");

...

Page 28: Android Development on Fire TV

ListRowAdapter

RowsAdapter

Page 29: Android Development on Fire TV

public class MainFragment extends BrowseFragment {

...

//add the ListRowAdapter to the RowsAdapterArrayObjectAdapter rowsAdapter

= new ArrayObjectAdapter(new ListRowPresenter());

rowsAdapter.add(new ListRow(header, listRowAdapter));

setAdapter(mRowsAdapter);

}}

Page 30: Android Development on Fire TV

TitleDescription

Page 31: Android Development on Fire TV

TitleDescription

ImageCardView

Page 32: Android Development on Fire TV

public ViewHolder onCreateViewHolder(ViewGroup parent) {...

ImageCardView cardView = new ImageCardView(parent.getContext);cardView.setFocusable(true);cardView.setFocusableInTouchMode(true);return new ViewHolder(cardView);

...}

public class CardPresenter extends Presenter {

CardPresenter

Page 33: Android Development on Fire TV

CardPresenter

public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {Movie movie = (Movie) item;ImageCardView cardView = (ImageCardView) viewHolder.view;

if (movie.getCardImageUrl() != null) {cardView.setTitleText(movie.getTitle());cardView.setContentText(movie.getDescription());Glide.with(viewHolder.view.getContext())

.load(movie.getCardImageUrl())

.centerCrop()

.into(cardView.getMainImageView());}

}

Page 34: Android Development on Fire TV

Development on Fire TV

DetailsFragment

Page 35: Android Development on Fire TV

TitleSubtitleDescription

ACTION ACTION

Page 36: Android Development on Fire TV

DetailsFragment

TitleSubtitleDescription

ACTION ACTION

Page 37: Android Development on Fire TV

private void setupDetailsOverviewRow() {

final DetailsOverviewRow row = new DetailsOverviewRow(mSelectedMovie);

...row.setImageDrawable(R.drawable.default_background));row.addAction(new Action(ACTION_WATCH_TRAILER,

“Watch Trailer”, “FREE”)));

mAdapter.add(row);}

DetailsOverviewRow

Page 38: Android Development on Fire TV

public class DetailsDescriptionPresenterextends AbstractDetailsDescriptionPresenter {

@Overrideprotected void onBindDescription(ViewHolder viewHolder, Object item) {

Movie movie = (Movie) item;

if (movie != null) {viewHolder.getTitle().setText(movie.getTitle());viewHolder.getSubtitle().setText(movie.getStudio());viewHolder.getBody().setText(movie.getDescription());

}}

}

DescriptionPresenter

Page 39: Android Development on Fire TV

public class DetailsDescriptionPresenterextends AbstractDetailsDescriptionPresenter {

@Overrideprotected void onBindDescription(ViewHolder viewHolder, Object item) {

Movie movie = (Movie) item;

if (movie != null) {viewHolder.getTitle().setText(movie.getTitle());viewHolder.getSubtitle().setText(movie.getStudio());viewHolder.getBody().setText(movie.getDescription());

}}

}

DescriptionPresenter

Page 40: Android Development on Fire TV

Development on Fire TV

Video Overlay

Page 41: Android Development on Fire TV
Page 42: Android Development on Fire TV

VideoView

PlaybackOverlayFragment

Page 43: Android Development on Fire TV

playback_controls.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent">

<VideoViewandroid:id="@+id/videoView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center" />

<fragmentandroid:id="@+id/playback_controls_fragment"android:name="PlaybackOverlayFragment"android:layout_width="match_parent"android:layout_height="match_parent" />

</FrameLayout>

Page 44: Android Development on Fire TV

PlaybackOverlayActivity - Components

public class PlaybackOverlayActivity extends Activity implements

PlaybackOverlayFragment.OnPlayPauseClickedListener {

private VideoView mVideoView;

private LeanbackPlaybackState mPlaybackState;

private MediaSession mSession;

Page 45: Android Development on Fire TV
Page 46: Android Development on Fire TV

PlaybackOverlayActivity - MediaSession

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.playback_controls);...

mSession = new MediaSession(this, "LeanbackSampleApp");mSession.setCallback(new MediaSessionCallback());mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS

| MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

mSession.setActive(true);

}

Page 47: Android Development on Fire TV

PlaybackOverlayActivity – Remote

@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {

PlaybackOverlayFragment playbackOverlayFragment = findFragmentById(R.id.playback_controls_fragment);

switch (keyCode) {...case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:

if (mPlaybackState == LeanbackPlaybackState.PLAYING) {playbackOverlayFragment.togglePlayback(false);

} else {playbackOverlayFragment.togglePlayback(true);

}return true;

...}

}

Page 48: Android Development on Fire TV

PlaybackOverlayActivity – Play/Pause

public void onFragmentPlayPause(Movie movie, int position, Boolean playPause) {

mVideoView.setVideoPath(movie.getVideoUrl());

...

if (mPlaybackState != LeanbackPlaybackState.PLAYING) {mPlaybackState = LeanbackPlaybackState.PLAYING;if (position > 0) {

mVideoView.seekTo(position);mVideoView.start();

}...

updatePlaybackState(position);updateMetadata(movie);

}

Page 49: Android Development on Fire TV

The Final

Result

Page 50: Android Development on Fire TV
Page 51: Android Development on Fire TV

CREATE

NEW EXPERIENCES

ON FIRE TV

Page 52: Android Development on Fire TV

Support for Game Controller

Page 53: Android Development on Fire TV

Amazon

Fling bit.ly/amazonfling

Page 54: Android Development on Fire TV

DIALDIscovery And Launch

Page 55: Android Development on Fire TV

Fire TV Catalogue Integration

Page 56: Android Development on Fire TV
Page 57: Android Development on Fire TV

developer.amazon.com/appstore

Page 58: Android Development on Fire TV

THANK YOU!

Mario Viviani@mariuxtheone

@AmazonAppDev

[email protected]

developer.amazon.com/appstore