Move injection logic to activity. PerActivity scope used.

This commit is contained in:
Fernando Cejas
2015-03-15 19:14:40 +01:00
parent 9b857e2865
commit 6740a6b495
7 changed files with 79 additions and 53 deletions

View File

@@ -0,0 +1,9 @@
/**
* Copyright (C) 2015 android10.org. All rights reserved.
* @author Fernando Cejas (the android10 coder)
*/
package com.fernandocejas.android10.sample.presentation.internal.di;
public interface HasComponent<C> {
C getComponent();
}

View File

@@ -5,6 +5,8 @@ import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import com.fernandocejas.android10.sample.presentation.AndroidApplication;
import com.fernandocejas.android10.sample.presentation.internal.di.components.ApplicationComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.modules.ActivityModule;
import com.fernandocejas.android10.sample.presentation.navigation.Navigator;
import javax.inject.Inject;
@@ -18,11 +20,9 @@ public abstract class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.initializeInjector();
this.getApplicationComponent().inject(this);
}
private void initializeInjector() {((AndroidApplication)getApplication()).inject(this);}
/**
* Adds a {@link Fragment} to this activity's layout.
*
@@ -34,4 +34,22 @@ public abstract class BaseActivity extends Activity {
fragmentTransaction.add(containerViewId, fragment);
fragmentTransaction.commit();
}
/**
* Get the Main Application component for dependency injection.
*
* @return {@link com.fernandocejas.android10.sample.presentation.internal.di.components.ApplicationComponent}
*/
protected ApplicationComponent getApplicationComponent() {
return ((AndroidApplication)getApplication()).getApplicationComponent();
}
/**
* Get an Activity module for dependency injection.
*
* @return {@link com.fernandocejas.android10.sample.presentation.internal.di.modules.ActivityModule}
*/
protected ActivityModule getActivityModule() {
return new ActivityModule(this);
}
}

View File

@@ -9,17 +9,21 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import com.fernandocejas.android10.sample.presentation.R;
import com.fernandocejas.android10.sample.presentation.internal.di.HasComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.components.Dagger_UserComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.components.UserComponent;
import com.fernandocejas.android10.sample.presentation.view.fragment.UserDetailsFragment;
/**
* Activity that shows details of a certain user.
*/
public class UserDetailsActivity extends BaseActivity {
public class UserDetailsActivity extends BaseActivity implements HasComponent<UserComponent>{
private static final String INTENT_EXTRA_PARAM_USER_ID = "org.android10.INTENT_PARAM_USER_ID";
private static final String INSTANCE_STATE_PARAM_USER_ID = "org.android10.STATE_PARAM_USER_ID";
private int userId;
private UserComponent userComponent;
public static Intent getCallingIntent(Context context, int userId) {
Intent callingIntent = new Intent(context, UserDetailsActivity.class);
@@ -33,6 +37,7 @@ public class UserDetailsActivity extends BaseActivity {
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_user_details);
this.initializeInjector();
this.initializeActivity(savedInstanceState);
}
@@ -54,4 +59,15 @@ public class UserDetailsActivity extends BaseActivity {
this.userId = savedInstanceState.getInt(INSTANCE_STATE_PARAM_USER_ID);
}
}
private void initializeInjector() {
this.userComponent = Dagger_UserComponent.builder()
.applicationComponent(getApplicationComponent())
.activityModule(getActivityModule())
.build();
}
@Override public UserComponent getComponent() {
return userComponent;
}
}

View File

@@ -9,22 +9,41 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import com.fernandocejas.android10.sample.presentation.R;
import com.fernandocejas.android10.sample.presentation.internal.di.HasComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.components.Dagger_UserComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.components.UserComponent;
import com.fernandocejas.android10.sample.presentation.model.UserModel;
import com.fernandocejas.android10.sample.presentation.view.fragment.UserListFragment;
/**
* Activity that shows a list of Users.
*/
public class UserListActivity extends BaseActivity implements UserListFragment.UserListListener {
public class UserListActivity extends BaseActivity implements HasComponent<UserComponent>,
UserListFragment.UserListListener {
public static Intent getCallingIntent(Context context) {
return new Intent(context, UserListActivity.class);
}
private UserComponent userComponent;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_user_list);
this.initializeInjector();
}
private void initializeInjector() {
this.userComponent = Dagger_UserComponent.builder()
.applicationComponent(getApplicationComponent())
.activityModule(getActivityModule())
.build();
}
@Override public UserComponent getComponent() {
return userComponent;
}
@Override public void onUserClicked(UserModel userModel) {

View File

@@ -7,9 +7,7 @@ package com.fernandocejas.android10.sample.presentation.view.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.widget.Toast;
import com.fernandocejas.android10.sample.presentation.AndroidApplication;
import com.fernandocejas.android10.sample.presentation.internal.di.components.ApplicationComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.modules.ActivityModule;
import com.fernandocejas.android10.sample.presentation.internal.di.HasComponent;
/**
* Base {@link android.app.Fragment} class for every fragment in this application.
@@ -31,20 +29,10 @@ public abstract class BaseFragment extends Fragment {
}
/**
* Get the Android Main Application component for dependency injection.
*
* @return {@link com.fernandocejas.android10.sample.presentation.internal.di.components.ApplicationComponent}
* Gets a component for dependency injection by its type.
*/
protected ApplicationComponent getApplicationComponent() {
return ((AndroidApplication)getActivity().getApplication()).getApplicationComponent();
}
/**
* Get an Activity module for dependency injection.
*
* @return {@link com.fernandocejas.android10.sample.presentation.internal.di.modules.ActivityModule}
*/
protected ActivityModule getActivityModule() {
return new ActivityModule(getActivity());
@SuppressWarnings("unchecked")
protected <C> C getComponent(Class<C> componentType) {
return componentType.cast(((HasComponent<C>)getActivity()).getComponent());
}
}

View File

@@ -16,7 +16,7 @@ import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import com.fernandocejas.android10.sample.presentation.R;
import com.fernandocejas.android10.sample.presentation.internal.di.components.Dagger_UserComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.components.UserComponent;
import com.fernandocejas.android10.sample.presentation.model.UserModel;
import com.fernandocejas.android10.sample.presentation.presenter.UserDetailsPresenter;
import com.fernandocejas.android10.sample.presentation.view.UserDetailsView;
@@ -55,12 +55,6 @@ public class UserDetailsFragment extends BaseFragment implements UserDetailsView
return userDetailsFragment;
}
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.initializeInjector();
this.initialize();
}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -72,7 +66,7 @@ public class UserDetailsFragment extends BaseFragment implements UserDetailsView
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.userDetailsPresenter.initialize(this.userId);
this.initialize();
}
@Override public void onResume() {
@@ -85,17 +79,11 @@ public class UserDetailsFragment extends BaseFragment implements UserDetailsView
this.userDetailsPresenter.pause();
}
private void initializeInjector() {
Dagger_UserComponent.builder()
.applicationComponent(getApplicationComponent())
.activityModule(getActivityModule())
.build()
.inject(this);
}
private void initialize() {
this.getComponent(UserComponent.class).inject(this);
this.userDetailsPresenter.setView(this);
this.userId = getArguments().getInt(ARGUMENT_KEY_USER_ID);
this.userDetailsPresenter.initialize(this.userId);
}
@Override public void renderUser(UserModel user) {

View File

@@ -17,7 +17,7 @@ import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import com.fernandocejas.android10.sample.presentation.R;
import com.fernandocejas.android10.sample.presentation.internal.di.components.Dagger_UserComponent;
import com.fernandocejas.android10.sample.presentation.internal.di.components.UserComponent;
import com.fernandocejas.android10.sample.presentation.model.UserModel;
import com.fernandocejas.android10.sample.presentation.presenter.UserListPresenter;
import com.fernandocejas.android10.sample.presentation.view.UserListView;
@@ -59,12 +59,6 @@ public class UserListFragment extends BaseFragment implements UserListView {
}
}
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.initializeInjector();
this.initialize();
}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -77,6 +71,7 @@ public class UserListFragment extends BaseFragment implements UserListView {
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.initialize();
this.loadUserList();
}
@@ -90,15 +85,8 @@ public class UserListFragment extends BaseFragment implements UserListView {
this.userListPresenter.pause();
}
private void initializeInjector() {
Dagger_UserComponent.builder()
.applicationComponent(getApplicationComponent())
.activityModule(getActivityModule())
.build()
.inject(this);
}
private void initialize() {
this.getComponent(UserComponent.class).inject(this);
this.userListPresenter.setView(this);
}