Slide 1

Slide 1 text

A FRESH APPROACH TO DI TOOTHPICK https://github.com/stephanenicolas/toothpick/

Slide 2

Slide 2 text

5IF"OESPJE5FBNJT)JSJOH
 jobs.groupon.com/careers/ @D_Lemures #ToothpickDI @GrouponEng @SteffNicolas

Slide 3

Slide 3 text

THE TALK WHY TOOTHPICK? USING TOOTHPICK 
 REUSING INSTANCES 
 
 VERSION 2.0 CONCLUSION DEFINING DEPENDENCIES INJECTING DEPENDENCIES MODULES & BINDINGS SCOPE TREE SCOPE SINGLETONS MULTI-ACTIVITY FLOW @D_Lemures | #ToothpickDI

Slide 4

Slide 4 text

WHY TOOTHPICK? @D_Lemures | #ToothpickDI The Ancient Roma Coffee Machine Visual Toy javierarres.wordpress.com

Slide 5

Slide 5 text

WHY TOOTHPICK? SIMPLER BETTER TEST SUPPORT EVEN FASTER @D_Lemures | #ToothpickDI

Slide 6

Slide 6 text

USING TOOTHPICK public class DealPresenter {
 
 @Inject DealApiClient apiClient; @Inject Navigator navigator; 
 } @Singleton
 public class DealApiClient {
 Retrofit retrofit;
 
 @Inject
 public IceMachine(Retrofit retrofit) {
 this.retrofit = retrofit;
 }
 } JSR 330 annotations→nothing new here @D_Lemures | #ToothpickDI DEFINING DEPENDENCIES

Slide 7

Slide 7 text

INJECTING DEPENDENCIES public class DealActivity extends Activity { @Inject DealPresenter presenter;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope appScope = Toothpick.openScope(getApplication()); Toothpick.inject(this, appScope);
 } } @D_Lemures | #ToothpickDI USING TOOTHPICK

Slide 8

Slide 8 text

INJECTING DEPENDENCIES @D_Lemures | #ToothpickDI USING TOOTHPICK SCOPE MAKE INJECTIONS public class DealActivity extends Activity { @Inject DealPresenter presenter;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope appScope = Toothpick.openScope(getApplication()); Toothpick.inject(this, appScope);
 } }

Slide 9

Slide 9 text

INJECTING DEPENDENCIES @D_Lemures | #ToothpickDI USING TOOTHPICK DEAL PRESENTER public class DealActivity extends Activity { @Inject DealPresenter presenter;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope appScope = Toothpick.openScope(getApplication()); Toothpick.inject(this, appScope);
 } } DEAL APICLIENT NAVIGATOR RETROFIT

Slide 10

Slide 10 text

public class DealActivity extends Activity { @Inject DealPresenter presenter;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope appScope = Toothpick.openScope(getApplication()); appScope.installModules(new Module() {{ bind(Navigator.class).to(NavigatorImpl.class);
 bind(Retrofit.class).toInstance(retrofitInstance); }}); Toothpick.inject(this, appScope);
 } } MODULES & BINDINGS @D_Lemures | #ToothpickDI USING TOOTHPICK BINDINGS MODULES SCOPE

Slide 11

Slide 11 text

@D_Lemures | #ToothpickDI USING TOOTHPICK SCOPE 1 SCOPE 2 SCOPE 4 SCOPE 3 MODULES & BINDINGS

Slide 12

Slide 12 text

APPLICATION
 SCOPE ACTIVITY 1
 SCOPE ACTIVITY 2
 SCOPE SERVICE 1
 SCOPE FRAGMENT 3
 SCOPE FRAGMENT 1
 SCOPE FRAGMENT 2
 SCOPE SCOPE TREE @D_Lemures | #ToothpickDI USING TOOTHPICK

Slide 13

Slide 13 text

public class DealActivity extends Activity { @Inject DealPresenter presenter; @Inject Context context;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope scope = Toothpick.openScope(getApplication(), this); scope.installModules(new Module() {{
 bind(Context.class).toInstance(this); }}); Toothpick.inject(this, scope);
 } } SCOPE TREE APPLICATION
 SCOPE ACTIVITY
 SCOPE @D_Lemures | #ToothpickDI USING TOOTHPICK

Slide 14

Slide 14 text

SCOPE SINGLETONS @D_Lemures | #ToothpickDI REUSING INSTANCES ANDROID INTENT ACTIVITY FRAGMENT RECYCLER VIEW LOCAL SINGLETON

Slide 15

Slide 15 text

APPLICATION
 SCOPE ACTIVITY
 SCOPE APP SINGLETONS ACTIVITY SINGLETONS SCOPE SINGLETONS @D_Lemures | #ToothpickDI REUSING INSTANCES

Slide 16

Slide 16 text

public class Module extends Module {
 public Module() {
 bind(ViewHelper.class).toInstance(new ViewHelper());
 }
 } SCOPE SINGLETONS SINGLETONS CAN BE DEFINED IN MODULES @D_Lemures | #ToothpickDI REUSING INSTANCES

Slide 17

Slide 17 text

@Singleton
 public class DealApiClient {
 } @ActivitySingleton
 public class ViewHelper {
 } APPLICATION
 SCOPE ACTIVITY
 SCOPE SCOPE SINGLETONS OR USING ANNOTATIONS @D_Lemures | #ToothpickDI REUSING INSTANCES

Slide 18

Slide 18 text

ACTIVITY 1 ACTIVITY 3 ACTIVITY 2 MULTI ACTIVITY FLOWS Purchase Flow @D_Lemures | #ToothpickDI REUSING INSTANCES

Slide 19

Slide 19 text

APPLICATION SCOPE ACTIVITY 1 SCOPE FLOW SCOPE ACTIVITY 3 SCOPE ACTIVITY 2 SCOPE MULTI ACTIVITY FLOWS @D_Lemures | #ToothpickDI REUSING INSTANCES

Slide 20

Slide 20 text

public class MyActivity extends Activity {
 
 @Inject ShoppingCart shoppingCart; 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Scope scope = openScopes(getApplication(), 
 FlowSingleton.class, 
 this);
 Toothpick.inject(this, scope);
 } } @D_Lemures | #ToothpickDI REUSING INSTANCES MULTI ACTIVITY FLOWS

Slide 21

Slide 21 text

@FlowSingleton
 public class ShoppingCart {
 List purchases…
 } FLOW SCOPE MULTI ACTIVITY FLOWS @D_Lemures | #ToothpickDI REUSING INSTANCES

Slide 22

Slide 22 text

VERSION 2.0 RELEASABLE SINGLETONS @D_Lemures | #ToothpickDI BETTER SCOPE ANNOTATIONS KILLING REGISTRIES BETTER API

Slide 23

Slide 23 text

CONCLUSION QUESTIONS ? COMMENTS ? @D_Lemures | #ToothpickDI

Slide 24

Slide 24 text

A FRESH APPROACH TO DI TOOTHPICK https://github.com/stephanenicolas/toothpick/ @D_Lemures #ToothpickDI @GrouponEng @SteffNicolas