Slide 1

Slide 1 text

Implementing New Feature in Existing Screen Rui Kowase @rkowase 2018/08/23 Android Lunch & Learn

Slide 2

Slide 2 text

Can you implement new feature in existing screen easily?

Slide 3

Slide 3 text

Agenda ● The New Architecture ● Architecture of SafeTrade feature ● Q&A

Slide 4

Slide 4 text

Profile ● Name: Rui Kowase / 小和瀬 塁 ● Account: @rkowase Skill: Flutter, Android, etc...

Slide 5

Slide 5 text

The New Architecture

Slide 6

Slide 6 text

Benefits of The New Architecture “This architecture will help you to make your code less buggy and easier to modify. Having a consistent architecture will make your work and life easier.”

Slide 7

Slide 7 text

Goal of The New Architecture ● Shared Knowledge ● Improves testability ● Reusability

Slide 8

Slide 8 text

Overview of The New Architecture

Slide 9

Slide 9 text

Example of The New Architecture in Exhibit Screen

Slide 10

Slide 10 text

Testing

Slide 11

Slide 11 text

Architecture of SafeTrade

Slide 12

Slide 12 text

Overview of SafeTrade Feature ItemDetail Screen Exhibit Screen

Slide 13

Slide 13 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject

Slide 14

Slide 14 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject

Slide 15

Slide 15 text

ExhibitModule @Module class ExhibitModule( // ... @Provides @ActivityScope fun provideSafeTradePresenter(): SafeTradeContract.ExhibitPresenter { val builder = SafeTradeFeatureBuilder(...) return builder.buildExhibitPresenter(...) } }

Slide 16

Slide 16 text

ExhibitPresenter class ExhibitPresenter @Inject constructor( // ... private val safeTradeExhibitPresenter: SafeTradeContract.ExhibitPresenter, ) : ExhibitContract.Presenter {

Slide 17

Slide 17 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject

Slide 18

Slide 18 text

SafeTrade Contract interface SafeTradeContract { interface Presenter { // ..... } interface ExhibitPresenter : Presenter { // ..... companion object { val EMPTY = object : ExhibitPresenter {} } } interface ExhibitView : ViewProxy { // ..... } // ..... } The interface of SafeTrade’s ViewProxy and Presenter

Slide 19

Slide 19 text

SafeTrade FeatureBuilder class SafeTradeFeatureBuilder @Inject constructor( private val activity: Activity, private val provider: SafeTradeViewFactory ) { @VisibleForTesting var isDebug: Boolean = BuildConfig.DEBUG fun buildExhibitPresenter(repository: SafeTradeRepository, helper: StringFormatHelper, state: ListingUiState ): SafeTradeContract.ExhibitPresenter { if (!isDebug) { return SafeTradeContract.ExhibitPresenter.EMPTY } // ….. return presenter } } The builder for Presenter

Slide 20

Slide 20 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject

Slide 21

Slide 21 text

SafeTrade ViewFactory interface SafeTradeViewFactory { interface Exhibit : SafeTradeViewFactory { fun getEnableRoot(): View fun getEnableCheckbox(): CheckBox fun getEnableCheckboxContainer(): View fun getEnableSafeTradeFeeValue(): TextView fun getEnableTitle(): TextView fun getEnableSubTitle(): TextView fun getEnableHelpIcon(): ImageView fun getAdditionalFeeRoot(): View fun getAdditionalFeeLabel(): TextView fun getAdditionalFeeValue(): TextView fun getAgreementRoot(): View fun getAgreementCheckbox(): CheckBox } } View inflater

Slide 22

Slide 22 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject

Slide 23

Slide 23 text

ExhibitActivity private void setUpDi() { // ... SafeTradeExhibitViewFactoryProvider provider = new SafeTradeExhibitViewFactoryProvider( findViewById(R.id.safe_trade_frame_enable), // ... ); ThisApplication.get(this) .component() .newStatefulExhibitSubComponent( new ExhibitModule( // ... exhibitViewProxy, // … ), new ImageModule(this)) .inject(this); }

Slide 24

Slide 24 text

The flow of SafeTrade

Slide 25

Slide 25 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject Tap SafeTrade’s View

Slide 26

Slide 26 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject Call SafeTradeExhibit Presenter

Slide 27

Slide 27 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject Do nothing if it is disabled

Slide 28

Slide 28 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject Call SafeTradeExhibit ViewProxy

Slide 29

Slide 29 text

Architecture of SafeTrade Feature Exhibit ViewProxy Exhibit Presenter Existing Feature Exhibit Repository SafeTradeExhibit Presenter SafeTradeExhibit Repository SafeTradeExhibit ViewProxy SafeTrade FeatureBuilder Exhibit Activity New Feature Feature toggle SafeTrade ViewFactory Inject Inject Update views

Slide 30

Slide 30 text

Summary ● Toggle Feature in Builder class ● SRP (Single Responsibility Principle) ● Divide classes by interface and inject

Slide 31

Slide 31 text

Thank you!