Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

ABOUT US Senior Android Dev @ Groupon ~20 years of Java coding OSS: Dart, TP STEPHANE NICOLAS DANIEL MOLINERO REGUERA Android Dev @ Groupon Best level 3 ever OSS: Dart, +stephane)nicolas @D_Lemures

Slide 3

Slide 3 text

5IF"OESPJE5FBNJT)JSJOH
 jobs.groupon.com/careers/

Slide 4

Slide 4 text

THE TALK WHY DI ? WHY TOOTHPICK? TOOTHPICK FEATURES 
 ADVANCED FEATURES 
 
 CONCLUSION SCOPE MODULES & BINDINGS SCOPE TREE SCOPE SINGLETONS MVP & STATE PRESERVATION MULTIPLE ACTIVITIES FLOWS

Slide 5

Slide 5 text

WHY DI ? DECOUPLE REUSE TEST USES USES USES MOCK USES

Slide 6

Slide 6 text

WHY TOOTHPICK? SIMPLER BETTER TEST SUPPORT EVEN FASTER

Slide 7

Slide 7 text

TOOTHPICK FEATURES public class SmoothieMachine {
 
 @Inject IceMachine iceMachine;
 
 public void doSmoothie() {
 iceMachine.makeIce();
 }
 } @Singleton
 public class IceMachine {
 Foo foo;
 
 @Inject
 public IceMachine(Foo foo) {
 this.foo = foo;
 }
 JSR 330 annotations→nothing new here

Slide 8

Slide 8 text

TOOTHPICK FEATURES SCOPE SCOPE MAKE INJECTIONS public class MyApplication extends Application { @Inject Machine machine;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope appScope = Toothpick.openScope(this); appScope.installModules(…); Toothpick.inject(this, appScope);
 } }

Slide 9

Slide 9 text

TOOTHPICK FEATURES SCOPE, MODULES & BINDINGS SCOPE BINDINGS MODULES public class MyApplication extends Application { @Inject Machine machine;
 
 @Override protected void onCreate() {
 super.onCreate();
 
 Scope appScope = Toothpick.openScope(this); appScope.installModules(new Module() {{
 bind(Machine.class).to(IceMachine.class); }});
 Toothpick.inject(this, appScope);
 } }

Slide 10

Slide 10 text

TOOTHPICK FEATURES APPLICATION
 SCOPE ACTIVITY 1
 SCOPE ACTIVITY 2
 SCOPE SERVICE 1
 SCOPE FRAGMENT 3
 SCOPE FRAGMENT 1
 SCOPE FRAGMENT 2
 SCOPE SCOPE TREE

Slide 11

Slide 11 text

TOOTHPICK FEATURES public class LemonActivity extends Activity {
 
 @Inject SmoothieMachine smoothieMachine;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Scope scope = Toothpick.openScopes(getApplication(), this);
 scope.installModules(…);
 Toothpick.inject(this, scope);
 } } SCOPE TREE APPLICATION
 SCOPE ACTIVITY
 SCOPE

Slide 12

Slide 12 text

TOOTHPICK FEATURES APPLICATION
 SCOPE ACTIVITY
 SCOPE APP SINGLETONS ACTIVITY SINGLETONS SCOPE SINGLETONS

Slide 13

Slide 13 text

TOOTHPICK FEATURES public class Module extends Module {
 public Module1() {
 bind(Machine.class).toInstance(new IceMachine());
 }
 } SCOPE SINGLETONS SINGLETONS CAN BE DEFINED IN MODULES

Slide 14

Slide 14 text

TOOTHPICK FEATURES @Singleton
 public class IceMachine {
 } @ActivitySingleton
 public class SmoothieMachine {
 } APPLICATION
 SCOPE ACTIVITY
 SCOPE SCOPE SINGLETONS OR USING ANNOTATIONS

Slide 15

Slide 15 text

ADVANCED TOOTHPICK FEATURES MVP & STATE PRESERVATION

Slide 16

Slide 16 text

ADVANCED TOOTHPICK FEATURES MVP & STATE PRESERVATION Landscape Portrait

Slide 17

Slide 17 text

PRESENTER INSTANCE APPLICATION SCOPE PRESENTER SCOPE ADVANCED TOOTHPICK FEATURES MVP & STATE PRESERVATION ACTIVITY SCOPE

Slide 18

Slide 18 text

ADVANCED TOOTHPICK FEATURES MVP & STATE PRESERVATION public class MyActivity extends Activity {
 
 @Inject MyPresenter presenter; 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Scope scope = openScopes(getApplication(), 
 PresenterSingleton.class, 
 this);
 Toothpick.inject(this, scope);
 } }

Slide 19

Slide 19 text

@PresenterSingleton
 public class MyPresenter {
 String dealId;
 int quantity;
 } PRESENTER SCOPE MVP & STATE PRESERVATION ADVANCED TOOTHPICK FEATURES

Slide 20

Slide 20 text

ACTIVITY 1 ADVANCED TOOTHPICK FEATURES ACTIVITY 3 ACTIVITY 2 MULTI ACTIVITY FLOWS Purchase Flow !

Slide 21

Slide 21 text

APPLICATION SCOPE ACTIVITY 1 SCOPE ADVANCED TOOTHPICK FEATURES FLOW SCOPE ACTIVITY 3 SCOPE ACTIVITY 2 SCOPE MULTI ACTIVITY FLOWS

Slide 22

Slide 22 text

ADVANCED TOOTHPICK FEATURES MVP & STATE PRESERVATION 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);
 } }

Slide 23

Slide 23 text

@FlowSingleton
 public class ShoppingCart {
 List purchases…
 } FLOW SCOPE MULTI ACTIVITY FLOWS ADVANCED TOOTHPICK FEATURES

Slide 24

Slide 24 text

CONCLUSION QUESTIONS ? COMMENTS ?

Slide 25

Slide 25 text

A FRESH APPROACH TO DI TOOTHPICK https://github.com/stephanenicolas/toothpick/ +stephane)nicolas @D_Lemures