Upgrade to Pro — share decks privately, control downloads, hide ads and more …

That Fresh Mobile Smell

That Fresh Mobile Smell

Android Presenter First talk at TriDroid West.

Fred Medlin

February 20, 2014
Tweet

Other Decks in Programming

Transcript

  1. HOW IT’S DONE 1.Start with a user story 2.Stub a

    presenter 3.Write interface methods for model and view 4.Add presenter tests to confirm the methods were called
  2. 1. USER STORY Using my current latitude and longitude, find

    and display the nearest geo-tagged wikipedia entry.
  3. 2. STUB PRESENTER public class GeoWikiPresenter {! private GeoWikiModel model;!

    private GeoWikiView view;! ! public GeoWikiPresenter(GeoWikiModel model, GeoWikiView view) {! this.model = model;! this.view = view;! }! }!
  4. 3. MODEL/VIEW INTERFACE METHODS public interface GeoWIkiModel {! !void findLocation();!

    !void queryArticles(float latitude, float longitude);! }! ! public interface GeoWikiView {! !void showProgress();! !void hideProgress();! !void displayPage(String url);! }!
  5. 4. PRESENTER TESTS public class GeoWikiPresenterTest {! !@Mock GeoWikiModel model;!

    !@Mock GeoWikiView view;! !GeoWikiPresenter presenter;! ! !@Before! !public void setup() {! !!Mockito.initAnnotations(this);! !!presenter = new GeoWikiPresenter(model, view);! !}! }!
  6. 4. PRESENTER TESTS (2) @Test! ! public void searchesForLocation() {!

    ! ! verify(model).findLocation();! ! ! verify(view).showProgress();! ! }! ! ! @Test! ! public void queryWikiLocation() {! ! ! presenter.onLocationFound(new FoundLocationEvent(lat, lon));! ! ! verify(model).queryArticles(lat, lon);! ! }!
  7. 4. PRESENTER TESTS (3) public class GeoWikiPresenter {! private GeoWikiModel

    model;! private GeoWikiView view;! ! public GeoWikiPresenter(GeoWikiModel model, GeoWikiView view) {! this.model = model;! this.view = view;! model.findLocation();! view.showProgress();! ! @Subscribe! public void onLocationFound(FoundLocationEvent event) {! ! model.queryArticles(event.getLatitude(), event.getLongitude());! }! ! @Subscribe! public void onArticleFound(FoundArticleEvent event) {! ! view.hideProgress();! ! view.displayPage(event.getUrl());! }! }! }!
  8. 3. MODEL/VIEW INTERFACE METHODS public interface GeoWIkiModel {! !void findLocation();!

    !void queryArticles(float latitude, float longitude);! }! ! public interface GeoWikiView {! !void showProgress();! !void hideProgress();! !void displayPage(String url);! }!
  9. FRESH public class MainActivity extends Activity {! ! ! GeoWikiPresenter

    presenter;! ! ! @Override! ! public void onCreate(Bundle savedInstanceState) {! ! ! super.onCreate(savedInstanceState);! ! ! setContentView(R.layout.activity_main);! ! ! presenter = new GeoWikiPresenter(new GeoWikiModelImpl(), new GeoWikiViewImpl());! ! }! ! ! @Override! ! public void onPause() {! ! ! super.onPause();! ! ! BusProvider.unregister(presenter);! ! }! ! ! @Override! ! public void onResume() {! ! ! super.onPause();! ! ! BusProvider.register(presenter);! ! }! }!
  10. • Traditional SW mistake • Focuses on invisible things MODEL

    FIRST • Seems reasonable, but… • Views attract strong feeling • High rate of changes • Hard to test VIEW FIRST ALTERNATIVES?
  11. All photos via Creative Commons Licenses from flickr.com ! -

    Attribution-NonCommercial-NoDerivs 2.0 Generic (CC BY-NC-ND 2.0) - (mbshane) http://www.flickr.com/photos/mbshane/3165456548/ - (reid-bee) http://www.flickr.com/photos/reid-bee/5521024764/ - (captain_chickenpants) http://www.flickr.com/photos/captain_chickenpants/320441513/ - (RosenRakuen) http://www.flickr.com/photos/91134569@N05/8365293556/ ! Attribution-NonCommercial-ShareAlike 2.0 Generic (CC BY-NC-SA 2.0) - (clintjcl) http://www.flickr.com/photos/clintjcl/2708117471/ ! Attribution 2.0 Generic (CC BY 2.0) - (jeffreyww) http://www.flickr.com/photos/jeffreyww/4867984686/ - (quietlyurban.com) http://www.flickr.com/photos/83118222@N06/9689975423/ ! Attribution-NonCommercial 2.0 Generic (CC BY-NC 2.0) - (hatalmas) http://www.flickr.com/photos/hatalmas/6094281702/ PHOTO CREDITS