Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Subtitle

Slide 6

Slide 6 text

Subtitle STRATEGY

Slide 7

Slide 7 text

Subtitle

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Subtitle ├── com │ └── soundcloud │ ├── android │ │ ├── stream │ │ │ ├── StreamAdapter.java │ │ │ ├── StreamFragment.java │ │ │ ├── StreamModule.java │ │ │ ├── StreamOperations.java │ │ │ ├── StreamStorage.java │ │ │ └── StreamItemPresenter.java

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

if (flags.isEnabled(Feature.SECRET_PROJECT)) { return “Secret project”; } else { return “Nothing here”; }

Slide 15

Slide 15 text

<> branch <> master <> origin/master

Slide 16

Slide 16 text

master abstraction layer <> <>

Slide 17

Slide 17 text

master abstraction layer <>

Slide 18

Slide 18 text

master <>

Slide 19

Slide 19 text

master feature-B .isEnabled() .isEnabled() feature-A .isEnabled() feature-C

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Subtitle public MainActivity() { SoundCloudApplication.getObjectGraph().inject(this); addLifeCycleComponent(playerController); addLifeCycleComponent(adPlayerController); presenter.attach(this); }

Slide 23

Slide 23 text

@Inject public PlayerController( EventBus eventBus, TrackPagerAdapter adapter, PlayerPresenter presenter, PlayQueueManager playQueueManager) { [...] }

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

BETA

Slide 27

Slide 27 text

Subtitle

Slide 28

Slide 28 text

iOS Android

Slide 29

Slide 29 text

API Mobile

Slide 30

Slide 30 text

Subtitle { "id":612849, "kind":"user", "permalink":"bazan", "username":"David Bazan", "uri":"https://api.soundcloud.com/users/612849", "permalink_url":"http://soundcloud.com/bazan", "avatar_url":"https://i1.sndcdn.com/avatars-000030728315- oe5uld-large.jpg?e76cf77", "country":"United States", "first_name":"David", "last_name":"Bazan", "full_name":"David Bazan", "description":"Known for his work fronting the enigmatic rock band Pedro the Lion, David Bazan\u2019s emotionally charged narratives, eye for telling detail, and mournful voice have more in common with J.D. Salinger\u2019s \u201cNine Stories\u201d or Flannery O\u2019Connor\u2019s \u201cWise Blood\u201d than with the usual lyrical slant of popular music. Bazan is a gifted storyteller, weaving parables of spiritual conflict, suburban ennui, and personal surrender into magnetic, well-crafted songs.\r\n\r\nHis debut solo full-length album, Curse Your Branches (out now on Barsuk), is a masterwork by a modern American poet at the height of his powers. Paste Magazine called him one of the \u201c100 Best Living Songwriters\u201d. This record is the deepest and most explicit exploration of his struggles with faith and a meditation on all things passed between the generations.", "city":"Seattle", "discogs_name":null, "myspace_name":"davidbazan", "website":"http://www.davidbazan.com", "website_title":"", "online":false, "track_count":32, { "collection":[ "hip hop", "chill", "electronic", "deep house", "party", "love", "rap", "happy", "study", "techno", "indie rock", "dubstep", "r&b", "relax", "country", "pop", "edm", "reggae", "house", "workout", "soundtrack", "reggaeton", "piano", "dance", "remix", "alternative", "summer", "instrumental", "rock", "morning", "funk", "classical", "punk", "electro", "trap", "club", "acoustic", "motivation", "jazz",

Slide 31

Slide 31 text

bazooka scale -r 934e08c -n 30 -e PROD

Slide 32

Slide 32 text

Subtitle

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Subtitle @Provides PlayerController providePlayerController(Flags flags) { if (flags.isEnabled(Feature.VISUAL_PLAYER)) { return new SlidingPlayerController(); } else { return new LegacyPlayerController(); } }

Slide 36

Slide 36 text

Subtitle

Slide 37

Slide 37 text

... ... ...

Slide 38

Slide 38 text

Reactive!

Slide 39

Slide 39 text

public final class EventQueue { public static final Queue PLAYBACK_STATE; public static final Queue PLAYBACK_PROGRESS; public static final Queue PLAYABLE_CHANGED; [...] }

Slide 40

Slide 40 text

Subtitle eventBus.queue(EventQueue.PLAYABLE_CHANGE) .filter(PlayableEvent.IS_TRACK_FILTER) .doOnNext(invalidateUICache) .observeOn(AndroidSchedulers.mainThread())

Slide 41

Slide 41 text

Subtitle Observable.combineLatest( eventBus.queue(EventQueue.PLAY_QUEUE_TRACK), eventBus.queue(EventQueue.PLAYER_UI), combineStates) .doOnNext(setTrackHasBeenSeen)

Slide 42

Slide 42 text

Subtitle

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content