7. Today’s subjects
Building standalone UI components
Building real standalone UI components
Synchronising UI components throughout the app
Updating lists after user interaction
@lojanda
8. Today’s subjects
Building standalone UI components
Building real standalone UI components
Synchronising UI components throughout the app
Updating lists after user interaction
@lojanda
12. ArticlePreviewRepository
public Single<ArticlePreview> articlePreview$(
String articleId ) {
if ( cache.contains( articleId ) {
return Single.just( cache.retrieve( articleId ));
} else {
return urlResolver.urlFor( articleId )
.flatMap( blendleApi::articlePreview$ )
.doOnSuccess( cache::store );
}
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
13. GetArticlePreviewUseCase
public Single<ArticlePreview> execute( String articleId ) {
return articleRepository.articlePreview$( articleId )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() );
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
14. ReaderPresenter
public void init( String articleId ) {
getArticlePreviewUseCase.execute( articleId )
.subscribe(
getView()::showArticlePreview,
getView()::loadArticlePreviewFailed );
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
15. Today’s subjects
Building standalone UI components
Building real standalone UI components
Synchronising UI components throughout the app
Updating lists after user interaction
@lojanda
22. ArticleContextStore
private BehaviorSubject<String> subject;
public void changeArticleContext( final String newArticleId )
{
subject.onNext( newArticleId );
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
23. Reader
@Override public View onCreateView( … ) {
presenter.init( getArguments() != null ?
getArguments().getInt( EXTRA_ARTICLE_ID ) :
null );
}
@lojanda
public void init( @Nullable String articleId ) {
if( articleId == null)
articleId = articleContextStore.getArticleContext();
loadData( articleId );
}
VIEWPRESENTER
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
24. Today’s subjects
Building standalone UI components
Building real standalone UI components
Synchronising UI components throughout the app
Updating lists after user interaction
@lojanda
27. Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
BookmarkStore
private Map<String, BehaviorSubject<Boolean>> subjectMap;
public BehaviorSubject<Boolean> getBookmarked( String articleId ) {
if( subjectMap.contains( articleId )
return subjectMap.get( articleId );
BehaviorSubject<Boolean> subject = BehaviorSubject.create();
subjectMap.put( articleId, subject );
return subject;
}
public void setBookmarked( String articleId, Boolean bookmarked ) {
getBookmarked().onNext( bookmarked );
}
@lojanda
28. BookmarkRepository
public Observable<Boolean> bookmarked$( String articleId ) {
BehaviorSubject<Boolean> subject = bookmarkStore
.getBookmarked( articleId );
if( ! subject.hasValue() ) {
this.bookmarkedCall( articleId )
.subscribe( bookmarkStore::setBookmarked );
}
return subject;
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
29. GetBookmarkUseCase
public Observable<Boolean> execute( String articleId ) {
return bookmarkRepository.bookmarked$( articleId )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() );
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
30. BookmarkPresenter
public void init( String articleId ) {
getBookmarkUseCase.execute( articleId )
.subscribe( getView()::showBookmarkValue );
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
31. Today’s subjects
Building standalone UI components
Building real standalone UI components
Synchronising UI components throughout the app
Updating lists after user interaction
@lojanda
35. Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
BookmarkStore
private PublishSubject<Pair<String, Boolean>> subject;
public Observable<Boolean> getBookmarkListener() {
return subject;
}
public void setBookmarked( String articleId, Boolean bookmarked ) {
getBookmarked( articleId ).onNext( bookmarked );
subject.onNext( new Pair<>( articleId, bookmarked );
}
@lojanda
36. ReadingListPresenter
public void init() {
bookmarkStore.getBookmarkListener()
.subscribe( this::bookmarkChanged );
}
public void bookmarkChanged( Pair<String, Boolean> pair ) {
String articleId = pair.first;
Boolean newBookmarkValue = pair.second;
if( newBookmarkValue ) {
getView().addBookmark( articleId );
} else {
getView().removeBookmark( articleId );
}
}
@lojanda
Mutable Data Stores
Context
Stores
Mutable Data Repositories
Static Data
Repositories
Business Use Cases
Presenters
Custom Views Fragments Activities
37. Today’s subjects
Building standalone UI components
Building real standalone UI components
Synchronising UI components throughout the app
Updating lists after user interaction
@lojanda